编者按:本文来自微信公众号“新智元”(ID:AI_era),编辑:LRS,36氪经授权发布
来源:Facebook AI
【导读】程序员的工作就是取代重复、算法可替代的工作,而他们自己也在研究如何取代自己。Facebook新发表的代码补全模型准确率超50%,动动手指就能写几百行代码!
代码补全(code AutoCompletion)就是在写代码的时候,IDE能够预测出下一段要写的代码,也是写代码时候选择使用IDE的重要原因。
最近的相关研究表明,自动补全可以通过深度学习来实现,使软件语言模型能够通过对从程序员的 IDE 活动中收集的真实世界数据集进行训练,来实现显著的准确性提高。
不过,对于那些没多少人用的编程语言来说,一个常见问题是,可用的 IDE 数据集可能不足以进行训练。
对于这个问题,Facebook的研究人员最近在arxiv上公开了自己在代码补全上的工作。
他们在文中展示了迁移学习是如何能够在微调之前完成自动补全任务的,这种训练不局限于 ide和特定语言,能够针对各种各样的示例代码序列进行预训练。
该方法在非常小的微调数据集上提高了50% 以上的模型精度,在50k 个带标签样例的数据集上提高了10% 以上的精度。
在软件社区中,所有主要编程语言的大量开源代码提交都可以在 GitHub 上找到。
毫无疑问,这些代码的提交和开发人员在 IDE 上的活动有着直接的联系,例如vscode, intellij等会有不同的补全方式,也会直接体现在代码中。
因此,如果能够在建模代码编写行为时使用这些commit中的知识,那对于自动补全任务来说是有益的。
由于在所有编程语言中都存在一些共享概念和结构,例如数据类型、面向对象等思想设计,所以研究人员建议将这些语言知识从使用人数更多的编程语言(如Python, Java)转移到标记数据不足的其他小众语言中。
这项研究中的数据集来自 Facebook 的一些开发者活动,主要关注流行的编程语言 Python 和不太流行的语言 Hack。
该团队首先训练了来自 Hack 或 Python 的各种单语模型,以及来自两种语言的多语模型。为了从开放词汇表中有效地识别和预测很少被使用的关键词和两种语言之间不同的关键词,他们采用了两种标记方法: 字节对编码(Byte-pair encoding,BPE)和 Bigram 编码。
为了测试迁移学习的效果,他们使用了两个文本生成模型GPT-2和 PLBART-并评估了两个在线和离线模型的性能。
最后论文中总结了他们的贡献和实验结果:
1、对从git提交获得的源代码文件预先训练两个 transformer语言模型 GPT-2和 BART,结果显示它们在自动补全预测方面的性能,比直接使用实际 IDE 代码序列的微调提高了2.18%。也就是说迁移模型取得了更好的效果。
2、GPT-2模型是在两个真实世界的数据集上训练的: 在 IDE 上写的和代码补全选择期间记录的代码序列。预训练和特定任务的微调相结合能够产生一个更好的模型,比基本模型的性能高出3.29%。
3、文中展示了使用不同的编程语言进行预训练,在比较使用 Hack 示例进行预训练和使用10k Python 示例进行微调的模型与只使用 Python 示例进行训练的模型时,可以提高13.1% 的准确性
4、通过在线 a/b 测试比较,证明在任务、领域和语言这三个迁移学习维度上的改进分别使自动完成工具的使用率提高了3.86% 、6.63% 和4.64%
总体而言,研究表明,在不使用 ide数据和不同语言示例代码序列上的预训练代码补全模型,使用迁移学习可以显著提高模型的准确性,表明迁移学习有可能推进较不流行的编程语言的代码自动补全,并改善使用它们的开发人员的编码经验。
Kite是一个著名的代码补全工具。
Kite 基于 AI 的代码补全功能现在支持Python, JavaScript, TypeScript、 Java、 HTML、 CSS、 Go、 C、 C # 、C + + 、 Objective C、 Kotlin 和 Scala。
Kite 于2016年4月首次亮相,在17年3月又公开发布了一个基于云计算的版本。该公司在19年1月筹集了1700万美元,放弃了云计算,转而在本地运行免费服务。
在编写过程中Kite可以极大减少敲键盘的次数。在Kite的帮助下,活跃开发者甚至每天只需编写由大约 175 个单词组成的代码。
各种开发人员也是对Kite十分赞赏,甚至还包括了Python之父 Guido van Rossum
Kite的 Python 机器学习模型是在2500万个开源代码文件上训练的,它的 JavaScript 机器模型是在3000万个文件上训练的。
除了越来越多的编程语言,Kite也可在更多的开发环境中工作,目前已支持在16个编辑器上使用,包括 Android Studio、 Atom、 JupyterLab、 Spyder、 Sublime Text、 VS Code 和 Vim等。
此外Kite还与 IntelliJ 家族合作:,支持 IntelliJ、 PyCharm、 WebStorm、 Goland、 CLion、 PHPStorm、 Rider、 RubyMine 和 AppCode。
由此可见,公司的愿景是允许尽可能多的开发人员利用 Kite,而不管他们的语言或 IDE 是什么,最终实现各个场景下代码补全的「大一统」。
Kite 公司的首席执行官史密斯之前还创立了 Xobni,这是一个于07年9月推出的电子邮件服务,雅虎在13年7月将其收购。
史密斯在接受访问时说到,当我们构建对 JavaScript 的支持时,我们致力于创建一种可伸缩的方式来添加更多的编程语言,从那时起,我们一直在迭代我们的 JavaScript 模型和排序算法。这种学习使我们能够相对容易地发布每一种新语言,具有与 JavaScript 相同的准确性和智能性。
19年,正值GPT-2火热时,一名滑铁卢大学大四学生Jacob Jackson也开发了一款自动补全工具tabnine,支持23种编程语言和5种代码编辑器,几乎不需要配置安装即可使用。
Deep TabNine会根据你以前的编码习惯自动补全,还会在后面给出几个选项的概率。如果之前项目出现过类似代码,还能在补全候选框中直接给出地址,方便用户点击进去查阅!
VSCode下,直接打开插件市场搜索TabNine,点击安装即可。Sublime Text下调出Install Package Control安装即可。Atom也可以直接安装。EMACS和Vim稍微复杂一些。
Deep TabNine通过对GitHub大约200万个文件进行训练。训练期间,模型学习了例如动态类型语言中的类型推断等复杂行为,用这样的训练方式预测token。
TabNine可以使用传统工具难以获取的琐碎的线索。当线索不够的时候TabNine可能会胡言乱语,然而一旦拥有足够的线索,就能准确预测出代码,甚至还可以给出匹配的概率。
如今深度学习浪潮来了,程序员连自己也不放过,也要取缔自己的工作,生于忧患!
参考资料:
https://www.reddit.com/r/deeplearning/comments/nfdtgk/r_facebook_transfer_learning_method_boosts_code/