像人一样编辑源代码,谷歌大脑提出神经网络也可以学“编程”

来源: 机器之心(ID:almosthuman2014)

发布日期: 2019-04-09

谷歌大脑的研究者提出利用神经网络建模我们对源代码的编辑,将代码编辑视为一个序列,从而学会如何「写代码」。研究探讨了如何观察过去的编辑序列并预测即将发生的编辑,这是构建更好的开发者工具的核心挑战。通过显式和隐式表征,研究者评估了模型的可扩展性和准确性,结果显示双向注意力模型在真实数据中表现优异。

利用机器学习学会如何自动写代码或修改代码一直非常诱人,它不仅能减少大量工程努力,同时也能构建更高级的智能体。在这篇论文中,谷歌大脑的研究者提出利用神经网络建模我们对源代码的编辑,也就是说将我们对代码的编辑视为一个序列,然后像语言模型那样学会如何「写代码」。总体而言,这份研究在于理解人类编写代码的过程(例如 GitHub 的 commit),并使用深度神经网络模拟这个动态的编辑过程。

只需要给定上一次的编辑信息,模型就能预测下一次代码编辑该改什么,从而继续修改与生成代码。前一段时间,OpenAI 的 GPT-2 能生成逼真的自然语言对话,也许采用相同的模式,这种动态代码编辑也能生成「逻辑合理」的源代码。这篇论文的四位作者都来自于谷歌大脑,其中二作 David Bieber 还发布过一个可以自动生成命令行接口的库:Python Fire。

代码是一种机器语言,它和自然语言一样以一种序列的方式展现出来。以前机器之心曾介绍过多种代码生成的方式,其中研究最多的是如何根据 GUI 生成对应代码,例如 17 年提出的 Pix2Code,我们只需要输入界面图像就能生成对应的前端代码。

其次,2018 年 11 月,北大研究者首次成功用 CNN 自动生成代码,他们这篇 AAAI 2019 论文采用了 CNN 解码器,并在《炉石传说》数据集上进行了测试,效果超过了此前各类业内最佳模型。这类研究一般都会采用结构化的神经网络来建模代码结构,例如北大研究者的这篇论文就根据抽象语法树(AST)中的语法结构规则生成代码。但是,这些方法都将代码生成看成是一种「一次到位」的静态过程。

不过我们知道,代码的编写是动态的,随着新特性的实现、bug 的修复以及重构的进行,源代码库一直处在变化之中。其实在人类开发的过程中,开发者都需要访问已有的代码库或片段,考虑用一个或多个意图对其进行更改。在本文中,谷歌大脑团队探讨的主要问题是如何观察一个过去的编辑序列并预测即将发生的编辑。这是一个重要的问题,因为构建更好的开发者工具的核心挑战是理解开发者行为背后的意图。

这也是一个有趣的研究挑战,因为仅根据编辑的内容(输入或删除的内容)无法理解编辑模式。我们需要根据变更与变更之前的状态之间的关系来理解编辑,而且,准确地对编辑序列建模需要学习过去编辑的表征,这一表征允许模型泛化模式并预测未来编辑。如图 1 所示,图中有两个可能的编辑序列(History A 和 History B)。

经过两次编辑后,两个序列都有了相同的编码状态(State 2),但 History A 正在给 foo 函数添加一个额外的参数,History B 正在从 foo 函数中移除第二个参数。研究者希望通过观察初始状态(State 0)和编辑序列(Edits 1 & 2)让模型具备预测 Edit 3 的能力。

在 History A 的情况下,要插入的特定值是不明确的,但是在该位置插入某个值这一事实应该具有相当高的置信度。因此在谷歌大脑的这篇研究中,神经网络需要学习不同的编辑序列及编辑内容,从而在给定编辑序列的情况下,模型能知道后面该怎样继续「写代码」。这就和语言模型一样,给定一小段话,模型就能接着用自然语言「编下去」。

编辑建模序列的主要挑战是如何开发良好的表征,既能捕捉所需的意图信息,又能优雅地缩放序列长度。研究者考虑了两种编辑表征:显式表征和隐式表征。显式表征明确实例化序列中每一次编辑的状态结果,而隐式表征实例化完整的初始状态以及更紧凑的类 diff 表征中的后续编辑。在显式表征中,研究者将层级递归指针网络模型视为一个强大但计算昂贵的基线。

在隐式表征中,研究者考虑一个简单的序列到序列模型以及一个基于注意力的双向模型,后者拥有一个生成编辑位置的指针网络 head 和一个生成编辑内容的内容 head。这些模型显示了源自不同问题公式化之间的权衡,并为将来的编辑序列模型提供设计方案。

在精心设计的合成数据以及对 Python 源代码进行细粒度编辑的大规模数据集中,研究者根据模型观察一系列过去编辑的能力来评估模型的可扩展性和准确性,然后预测未来的编辑。在制作合成数据集以评估模型的特定功能之后,研究者将注意力转移到真实数据。研究者根据开发实际代码的专业开发人员创建的谷歌代码库构建了一个大型编辑序列数据集。

开发人员每保存一份文件,就会创建一份静态代码状态,由此生成比典型 Git commit 等更细的粒度。研究者对不同模型观察以往编辑和预测未来编辑的能力进行可扩展性和准确性评估。结果显示,双向注意力模型特别能够在真实数据中实现高准确率、精准置信度和较好的可扩展性,这使得研究者对开发者工具的前景保持乐观,而这些工具在开发人员对大型和真实代码库进行编辑时学习提取他们的意图。

总之,本文将研究从编辑序列中学习和预测编辑的问题,是对模型空间的初步探索,此外还展示了从开发者编辑源代码过程中学习的适用性。

UUID: bfa6ae0a-bc0c-4ab9-9b36-43af1ba31d47

原始文件名: /home/andie/dev/tudou/annot/AI语料库-20240917-V2/AI语料库/环球科学公众号-pdf2txt/2019/2019-04-09_像人一样编辑源代码,谷歌大脑提出神经网络也可以学“编程”.txt

是否为广告: 否

处理费用: 0.0056 元