趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型( 二 )


CodeBERT经过预训练之后 , 在下游任务使用时需要微调 。 例如在自然语言代码搜索中 , 会使用与预训练阶段相同的输入方式 。 而在代码到文本的生成中 , 使用编码器-解码器框架 , 并使用CodeBERT初始化生成模型的编码器 。
3 实验
我们选了四个不同的设置来验证模型的有效性 , 分别是自然语言代码检索 , NL-PL的probing , 代码文档生成 , 在未经过预训练编程语言上模型的泛化性 。
自然语言代码检索 给定一段自然语言作为输入 , 代码搜索的目标是从一组代码中找到语义上最相关的代码 。 为了进行比较 , 我们选择了Husain 等人在2019年发布的 CodeSearchNet 语料库进行训练 , 数据集中包括六种编程语言 , 各种语言的数据统计如表2所示 。
趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型
本文插图

表2 自然语言代码检索数据集统计
我们保持和官方一致 , 使用MRR作为评价指标 。 另外 , 我们计算了六种编程语言上的宏平均作为整体的评价指标 。 结果如表3所示 , 相比之前的模型 , 我们的模型取得了明显的提升 。
趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型
本文插图

表3 自然语言代码检索结果
NL-PL Probing 这部分实验主要研究在固定模型参数的情况下 , 研究CodeBERT学习到了哪些类型的知识 。 目前学界还没有针对NL-PL Probing的工作 , 所以在这部分实验中 , 我们首先创建了数据集 。 具体地 , 我们将其构造成了多项选择题任务 , 给定输入 , 让模型选择正确的结果 。 根据输入和选项的不同 , 数据集又分为三个部分 。 模型比较结果如表4所示 , 结果显示 , 我们的模型在三个不同的设置下都能够达到最好的结果 。
趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型
本文插图

表4 NL-PL Probing结果
代码文档生成 我们研究了在预训练的六种编程语言上 , 代码到文档的生成问题 。 为了证明CodeBERT在代码到文档生成任务中的有效性 , 我们采用了各种预训练的模型作为编码器 , 并保持了超参数的一致性 。 实验结果如表5所示 , 我们的模型在所有编程语言类别上均获得最好的效果 。
趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型
本文插图

表5 代码文档生成结果
泛化能力 为了进一步研究模型的泛化性 , 我们在代码文档生成任务中 , 在C#编程语言上进行了测试 。 我们选择了Codenn数据集 , 这是一个包含Stack Overflow自动收集的66015对问题和答案的数据集 , 并采取了和原论文同样的设置进行实验 。 结果如表6所示 , 相比RoBERTa , 我们的模型能够取得更好的结果 。 但是 , 我们的模型效果略低于Code2Seq , 这可能是因为该模型有效使用了代码中的AST信息 。
趣投稿|CodeBERT: 面向编程语言和自然语言的预训练模型
本文插图

表6 C#生成结果
4 总结
在本工作中 , 我们提出了第一个面向编程语言和自然语言的预训练模型 , 并且在下游的自然语言代码检索 , 代码文档生成任务上 , 我们的模型均取得了SOTA的效果 。 另外 , 我们构造了第一个NL-PL Probing数据集来研究预训练模型学到了哪种类型的知识 。 虽然我们的模型已经取得了很好的效果 , 但也有很多潜在的方向值得进一步研究 , 比如在预训练过程加入与生成相关的目标函数 , 加入编程语言的AST结构信息等 。
[赠书福利]
AI科技评论联合【机械工业出版社华章公司】为大家带来15本“新版蜥蜴书”正版新书 。
在10月24号头条文章《1024快乐!最受欢迎的AI好书《蜥蜴书第2版》送给大家!》留言区留言 , 谈一谈你对本书内容相关的看法和期待 , 或你对机器学习/深度学习的理解 。


推荐阅读