赛尔原创@Findings | CodeBERT: 面向编程语言和自然语言的预训练模型

2020 年 10 月 22 日 AINLP
论文名称:CodeBERT: A Pre-Trained Model for Programming and Natural Languages
论文作者:冯掌印,郭达雅,唐都钰,段楠,冯骁骋,公明,寿林钧,秦兵,刘挺,姜大昕,周明
原创作者:冯掌印
论文链接: https://arxiv.org/pdf/2002.08155.pdf
转载须标注出处:哈工大SCIR

摘要

我们提出了面向编程语言和自然语言的预训练模型CodeBERT。 CodeBERT通过预训练的方式学习一个通用表示来支持下游和编程语言相关的应用,比如自然语言代码检索,代码文档生成等。 CodeBERT使用Transformer作为基本的网络结构,采用了混合目标函数: 掩码语言模型(MLM)和替换词检测(RTD)。 实验结果表明,CodeBERT在下游的自然语言代码检索和代码文档生成任务上都取得了SOTA效果。 为了进一步研究CodeBERT学到了哪些类型的知识,我们构造了第一个probing数据集,然后固定预训练好的参数来对模型进行检测。 实验结果显示,CodeBERT比其他预训练模型在probing上表现更好。 目前CodeBERT已开源: https://github.com/microsoft/CodeBERT。

1. 简介

大规模预训练模型在自然语言处理领域取得了重要的进展。 这些预训练模型通过在没有标注的语料上进行自监督训练,可以学习到有效的上下文表示。 自然语言处理领域预训练模型的成功,也推动了多模态预训练的发展,比如ViLBERT (Lu et al., 2019), VideoBERT (Sun et al., 2019)等。 在本文中,我们提出了CodeBERT,通过学习自然语言和编程语言之间的语义联系,能够支撑众多NL-PL相关的任务。

2. 模型

我们采用了Transformer作为模型的基本网络结构。具体地,我们使用了和RoBERTa-base完全一样的结构,即都有12层,每层有12个自注意头,每个头的大小是64,隐层维度为768。模型参数的总数为125M。

在预训练阶段,将自然语言文本和编程语言的代码拼接起来作为输入,两部分内容均使用和RoBERTa-base一样的tokenizer。数据样例如图1所示。

图1 NL-PL数据对样例 

预训练数据集方面,我们使用了Husain等人在2019年提供的最新数据集CodeSearchNet,里面包括 2.1M双模数据和6.4M 单模数据,其中双模数据是指自然语言-代码对的并行数据,单模是指只有代码的数据。数据集中包括六种编程语言,具体数据统计结果见表1。

表1 预训练CodeBERT数据统计

为了同时利用双模数据和大规模的单模数据,我们提出了混合预训练目标:掩码语言模型(MLM) 和替换词检测(RTD)。

目标1:掩码语言模型。将NL-PL对作为输入,随机为NL和PL选择位置进行掩码,然后用特殊的掩码Token进行替换。掩码语言模型的目标是预测出原始的token。目标2:替换词检测。先分别用单模的自然语言和代码数据各自训练一个数据生成器,用于为随机掩码位置生成合理的备选方案。另外,还有一个判别器学习自然语言和代码之间的融合表示,来检测一个词是否为原词。判别器实际上一个二元分类器,如果生成器产生正确的Token,则该Token的标签为真,否则为假。模型架构如图2所示。

图2 替换词检测目标模型架构 

最终,模型预训练目标为

CodeBERT经过预训练之后,在下游任务使用时需要微调。例如在自然语言代码搜索中,会使用与预训练阶段相同的输入方式。而在代码到文本的生成中,使用编码器-解码器框架,并使用CodeBERT初始化生成模型的编码器。

3.实验

我们选了四个不同的设置来验证模型的有效性,分别是自然语言代码检索,NL-PL的probing,代码文档生成,在未经过预训练编程语言上模型的泛化性。

自然语言代码检索 给定一段自然语言作为输入,代码搜索的目标是从一组代码中找到语义上最相关的代码。为了进行比较,我们选择了Husain 等人在2019年发布的 CodeSearchNet 语料库进行训练,数据集中包括六种编程语言,各种语言的数据统计如表2所示。

表2 自然语言代码检索数据集统计

我们保持和官方一致,使用MRR作为评价指标。另外,我们计算了六种编程语言上的宏平均作为整体的评价指标。结果如表3所示,相比之前的模型,我们的模型取得了明显的提升。

表3 自然语言代码检索结果

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

表4 NL-PL Probing结果

代码文档生成 我们研究了在预训练的六种编程语言上,代码到文档的生成问题。为了证明CodeBERT在代码到文档生成任务中的有效性,我们采用了各种预训练的模型作为编码器,并保持了超参数的一致性。实验结果如表5所示,我们的模型在所有编程语言类别上均获得最好的效果。

表5 代码文档生成结果

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

表6 C#生成结果

4.总结

在本工作中,我们提出了第一个面向编程语言和自然语言的预训练模型,并且在下游的自然语言代码检索,代码文档生成任务上,我们的模型均取得了SOTA的效果。另外,我们构造了第一个NL-PL Probing数据集来研究预训练模型学到了哪种类型的知识。虽然我们的模型已经取得了很好的效果,但也有很多潜在的方向值得进一步研究,比如在预训练过程加入与生成相关的目标函数,加入编程语言的AST结构信息等。

本期责任编辑:崔一鸣
本期编辑:钟蔚弘

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入AINLP技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注NLP技术交流

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
0

相关内容

专知会员服务
18+阅读 · 2020年10月13日
【ACL2020】端到端语音翻译的课程预训练
专知会员服务
5+阅读 · 2020年7月2日
【ACL2020-密歇根州立大学】语言和视觉推理的跨模态关联
单语言表征如何迁移到多语言去?
AI科技评论
5+阅读 · 2019年11月21日
论文浅尝 | XQA:一个跨语言开放域问答数据集
开放知识图谱
25+阅读 · 2019年9月11日
论文浅尝 | 面向自动问题生成的跨语言训练
开放知识图谱
8+阅读 · 2019年9月6日
ACL 2019 | 多语言BERT的语言表征探索
AI科技评论
20+阅读 · 2019年9月6日
中文版-BERT-预训练的深度双向Transformer语言模型-详细介绍
跨语言版BERT:Facebook提出跨语言预训练模型XLM
机器之心
4+阅读 · 2019年2月6日
Arxiv
3+阅读 · 2019年9月5日
Arxiv
6+阅读 · 2019年9月4日
Arxiv
11+阅读 · 2019年6月19日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
22+阅读 · 2018年8月30日
VIP会员
相关VIP内容
专知会员服务
18+阅读 · 2020年10月13日
【ACL2020】端到端语音翻译的课程预训练
专知会员服务
5+阅读 · 2020年7月2日
【ACL2020-密歇根州立大学】语言和视觉推理的跨模态关联
相关资讯
单语言表征如何迁移到多语言去?
AI科技评论
5+阅读 · 2019年11月21日
论文浅尝 | XQA:一个跨语言开放域问答数据集
开放知识图谱
25+阅读 · 2019年9月11日
论文浅尝 | 面向自动问题生成的跨语言训练
开放知识图谱
8+阅读 · 2019年9月6日
ACL 2019 | 多语言BERT的语言表征探索
AI科技评论
20+阅读 · 2019年9月6日
中文版-BERT-预训练的深度双向Transformer语言模型-详细介绍
跨语言版BERT:Facebook提出跨语言预训练模型XLM
机器之心
4+阅读 · 2019年2月6日
相关论文
Arxiv
3+阅读 · 2019年9月5日
Arxiv
6+阅读 · 2019年9月4日
Arxiv
11+阅读 · 2019年6月19日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
22+阅读 · 2018年8月30日
Top
微信扫码咨询专知VIP会员