首页 > 编程知识 正文

rust编写windows程序(微软python认证)

时间:2023-05-04 17:57:50 阅读:80051 作者:779

最近,微软、哈佛在arxiv联合发表了论文。 标题为《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》,再次拓展了BERT的应用,将BERT应用于Python、PHP、Java、JavaScript、Go、Ruby等编程语言的代码检索和生成任务。

论文链接: https://Arxiv.org/pdf/2002.08155.pdf

在这篇论文中,提出了一种叫做“CodeBERT”的双模预训练模型。 据作者介绍,这也是目前已知的第一种大型NL-PL (自然语言-编程语言)预训练模式。

该预训练模型能够处理NL-PL的普遍问题,如用自然语言进行代码检索、代码的自动生成等。 自然语言代码检索必须解决如何在自然语言query中找到所需的代码块的问题。 这和我们常用的搜索引擎(用自然语言query查找所需的网页)相似。

其实,微软Bing在2018年上线了类似的功能,在搜索框中输入自然语言“convert case using a function of R”,就会返回r码。

(雷锋网) )。

关于自然语言代码检索,在这篇论文中,作者在代码搜索语料库中对代码Bert进行了事先训练和微调。 这是一个包含Ruby、JavaScript、Go、Python、Java、PHP六种常用代码语言的语料库。 如下图所示,他们在自然语言代码检索任务中得到了SOTA的结果。

另一方面,代码文档生成任务是将来能大幅节约程序员工作量的有前景的研究方向。 如下图所示,

针对这个任务,CodeBERT也基本得到了SOTA的结果,特别是比以前的ROBERTa模型有了明显的提高。 顺便说一下,尽管CodeBERT中只有使用Ruby、JavaScript、Go、Python、Java、PHP等代码语言进行了预训练,但预训练的模型可以泛化到C#语言等其他代码语言任务中

一、背景

BERT作为双向转换器的编码器,预训练方法的创新受到业界和学术界的喜爱,但其他大规模的预训练模型,如ELMo、GPT等已经可以通过各种NLP任务提高SOTA。

但是,上述模型基本上以自然语言处理为对象,如掩蔽语言建模、从未标记的文本中学习上下文表达等。 与以往的Bert应用场景相比,作者开辟了新的道路,推出了NLP任务与Python、Java等编程语言并重的双峰预训练模式。

具体地说,CodeBERT可以捕捉自然语言和编程语言之间的语义联系,支持自然语言代码检索等NL-PL理解任务以及一系列代码生成等生成任务。

(雷锋网) )。

位于红线框的是NL文本,位于黑框的是PL文本的NL-PL对。 为了使用Nl-PL对的双模实例(bimodal instances )和大量可用的单模代码),作者训练了包括标准掩码语言建模和可交换的Token检测的CodeBERT

在具体的训练过程中,作者利用6种编程语言在多语言BERT的设定中训练了模型。 首先让我们来看看代码Bert的模型框架。

二、框架

机型的整体框架中,CodeBERT没有脱离BERT和Roberta的思想。 和大多数工作一样,作者使用了多层双向转换器。 更具体地说,作者使用与Roberta-base完全相同的模型体系结构。 也就是说,全部有12层,每层有12个自我提醒头,每个头的大小为64,隐藏大小为768,前馈层的内部隐藏大小为3072。

模型参数总数为125米。 在预训练阶段,设计了自然语言文本和编程语言代码两个输入部分。 将自然语言文本视为单词序列,分割为WordPiece。 关于编程代码,视为Token序列。 CodeBERT的输出也包含两个部分。 1、聚合序列表示; 2、带标记的上下文向量(contextual vector )。

/p5.toutiaoimg.com/origin/pgc-image/Rr8VlaYGQQwGox?from=pc">

数据集统计 训练CodeBERT所使用的数据集是Husain等人在2019年提供的最新数据集,里面包括 2.1M双模数据和6.4M 单码数据,其中双模码数据是指自然语言-代码对的并行数据,单码是指“未成对”的数据。 另外一些数据来自开源Nonfork GitHub仓库。对这些数据的处理是采用了一些约束和规则进行过滤。

(雷锋网)

可替换Token检测目标图解 在模型训练的设计上,其主要包括两个目标,其一是掩码语言建模,其二是可替换Token检测。在第二个目标中,作者进一步使用了大量的单模码数据。

目标一:掩码语言建模。将NL-PL对作为输入,随机为NL和PL选择位置进行掩码,然后用特殊的掩码Token进行替换。注意,掩码语言建模的任务是预测出被掩码的原始Token。

目标二:替换Token检测。在这部分有两个数据生成器,分别是NL生成器和PL生成器,这两个生成器都用于随机掩码位置集(randomly masked positions)生成合理的备选方案。

另外,还有一个学习生成器用来检测一个词是否为原词,其背后原理是一个二进制分类器,这里与GAN不同的是,如果生成器碰巧产生正确的Token,则该Token的标签是“real”而不是“fake”。

学习器的损失函数 经过调整后,损失函数优化如下:

模型训练的最后一步是模型微调,具体操作是在NL-PL任务中使用不同的CodeBERT设置。例如在自然语言代码搜索中,会使用与预训练阶段相同的输入方式。而在代码到文本的生成中,使用编码器-解码器框架,并使用CodeBERT初始化生成模型的编码器。

三、实验

作者做了四个实验,分别是:1)将CodeBERT应用到自然语言代码搜索任务上,并与传统方法进行对比;2)进行NL-PL Probing实验,考察CodeBERT在预训练阶段到底学习了什么知识;3)将CodeBERT应用到生成任务当中;4)考察CodeBERT预训练模型的泛化能力,发现效果非常之好。

1、自然语言代码搜索

给定一段自然语言作为输入,代码搜索的目标是从一组代码中找到语义上最相关的代码。为了进行比较,作者选择了Husain 等人在2019年发布的 CodeSearchNet 语料库进行训练。这个语料库框架如下图所示,共包含6中常见的编程语言(Python、JavaScript、Java、Ruby、PHP、Go)。

在预训练阶段,作者首先对每种语言的数据集进行了训练。数据集分割如下:

在微调阶段,设置学习率为1e-5,批量大小为64,最大序列长度为200,最大微调周期为8,并使用Adam来更新参数,并从开发集中选择出表现最好的模型,并用于测试集上进行评估。 结果如下表所示:

性能相比于之前的SOTA模型ROBERTa取得了显著的提高。

2、NL-PL Probing

这部分实验主要研究在不更改参数的的情况下,Code BERT能够学习哪些类型的知识。目前学界还没有针对NL-PLProbing的工作,所以在这部分实验中,作者自行创建了数据集。 给定NL-PL对,NL-PL Probing的目标是测试模型的正确预测能力。模型比较结果如下图所示:

上表显示了正确预测实例的数量与全部实例数量的比例。可以看出,在各个变成语言的预测上,CodeBERT基本都取得了最高的分数。但由于不同编程语言的数据集非常不平衡,因此用累计的数据进行比较更为恰当,在PL和NL的probing中,CodeBERT的结果都要比RoBERTa高10~20个百分点。 也可以用一个具体的案例来对比下。下图案例中分别掩盖了NL和PL中的“min”:

上图为RoBERTa和CodeBert的预测概率 从结果来看,CodeBERT在NL上的正确预测率为60.6%,而在PL上直接高达99.999%。

3、代码文档生成

这部分研究代码到文档的生成问题,并在六种编程语言中研究了生成任务在Code Search Net Corpus上的结果。 另外,为了证明CodeBERT在代码到NL生成任务中的有效性,作者采用了各种预训练的模型作为编码器,并保持了超参数的一致性。 实验结果如下:

在编程语言上进行预训练的模型的性能优于ROBERTa

4、泛化能力

那么,在Python、JavaScript、Java、Ruby、PHP、Go这些语言上做的预训练模型能够应用到别的编程语言上吗? 作者拿着前面预训练出的CodeBERT模型在C#语言上做了测试。 作者选择了Codenn数据集,这是一个包含Stack Overflow自动收集的66015对问题和答案的数据集,其规模相比 CodeSearchNet语料库要小几个数量级。为了可靠地评估模型,作者通过人工方式,为测试集中的代码片段提供两个附加 titles 来扩展测试集。 模型评估标准采用平滑的BLEU-4分数,评估结果如下图:

从这个结果可以看出,相较于RoBERTa,CodeBERT能够更好地推广到其他编程语言。不过值得注意的是,模型的效果略低于code2seq,作者认为原因可能是code2seq使用其抽象语法树AST中的组合路径,而CodeBERT仅将原始代码作为输入。

虽然作者也按照一定的顺序通过遍历AST的树结构来训练CodeBert,但并不会带来生成任务的改进。这种结果意味着结合AST来改进codebert是潜在方向。

四、总结

如前面提到,微软的 Bing 在2018年便已经上线了代码搜索功能,可以预期,基于预训练的代码功能也将很快落实到 Bing 的产品当中,从而提供能加优质的服务。同时我们也可以期待,该项工作能够在近期开源,以让更多研究人员快速跟进这一工作。

我们用几句话来总结这项工作的意义:

1、据作者表示,CodeBERT也是目前已知的首个大型的NL-PL(自然语言-编程语言)预训练模型;

2、本文提出了一个混合学习目标,能够支持使用双模数据NL-PL,且能够很容易地应用到单模数据中(例如没有自然语言文本的编程代码);

3、CodeBERT在自然语言代码搜索和代码文档生成两个任务中都达到了SOTA性能,此外作者在实验中还建立了一个数据集来研究NL-PL预训练模型的探测能力,方便了以后跟进的研究人员。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。