【研究生】像人一样编辑源代码,谷歌大脑提出神经网络也可以学「编程」( 二 )


显式表征明确实例化序列中每一次编辑的状态结果,而隐式表征实例化完整的初始状态以及更紧凑的类diff表征中的后续编辑 。在显式表征中,研究者将层级递归指针网络模型视为一个强大但计算昂贵的基线 。
在隐式表征中,研究者考虑一个简单的序列到序列模型以及一个基于注意力的双向模型,后者拥有一个生成编辑位置的指针网络head和一个生成编辑内容的内容head 。这些模型显示了源自不同问题公式化之间的权衡,并为将来的编辑序列模型提供设计方案 。
在精心设计的合成数据以及对源代码进行细粒度编辑的大规模数据集中,研究者根据模型观察一系列过去编辑的能力来评估模型的可扩展性和准确性,然后预测未来的编辑 。
在制作合成数据集以评估模型的特定功能之后,研究者将注意力转移到真实数据 。研究者根据开发实际代码的专业开发人员创建的谷歌代码库构建了一个大型编辑序列数据集 。
开发人员每保存一份文件,就会创建一份静态代码状态,由此生成比典型等更细的粒度 。研究者对不同模型观察以往编辑和预测未来编辑的能力进行可扩展性和准确性评估 。
结果显示,双向注意力模型特别能够在真实数据中实现高准确率、精准置信度和较好的可扩展性,这使得研究者对开发者工具的前景保持乐观,而这些工具在开发人员对大型和真实代码库进行编辑时学习提取他们的意图 。
总之,本文将研究从编辑序列中学习和预测编辑的问题,是对模型空间的初步探索,此外还展示了从开发者编辑源代码过程中学习的适用性 。
论文:

【研究生】像人一样编辑源代码,谷歌大脑提出神经网络也可以学「编程」

文章插图
论文地址:
摘要:编程语言正成为机器学习中一个充满挑战与趣味的领域 。其核心任务是构建源代码的生成模型,这一任务近年来已受到大量关注 。
但是,就目前所知,以前的生成模型总是生成静态代码片段 。在本文中,我们将源代码视作动态目标,要解决的问题是建模软件工程师对源代码文件进行的编辑 。
解决上述问题需要从先前的编辑中提取意图,然后利用它来生成后续编辑 。我们开发了几个神经网络,并利用合成数据来测试它们学习编辑模式的能力,而这需要很强的泛化能力 。然后我们收集并在谷歌源代码的大型数据集上训练了我们的模型,该源代码包含来自数千开发者的数百万次细粒度编辑 。
从建模的角度来看,我们的主要结论是注意力和指针网络组件的新组合提供了最好的整体性能和可扩展性 。而从应用角度来看,我们的结果表明,开发工具以学习预测未来的编辑是可行的 。
模型方法
第一个要思考的问题是我们该如何表征编辑代码的序列数据 。我们定义了两种数据格式,它们各有各的权衡 。下图2(a)所示为显式格式,它将编辑序列以二维网格的形式表示为序列的序列,横纵坐标分别为两种序列 。这种格式的预测任务会根据前面t-1行的编辑序列预测第t个时间步的编辑位置与内容 。
【研究生】像人一样编辑源代码,谷歌大脑提出神经网络也可以学「编程」

文章插图
图2:编辑序列的显式和隐式表征,它们都将「BACA」转换为「」,其中和分别为起始和终止符 。
如上图2(b)所示,隐式格式将初始状态表示为一个Token序列,并将其作为(,)对进行编辑 。
根据两种数据表征格式,现在我们有基线显式模型和基线隐式模型 。其中基线显式模型是一个两阶段的LSTM网络,有点类似于层级RNN模型 。
在最简单的基线显式模型中,第一阶段的LSTM会并行地编码每一个状态序列,并产生隐藏状态;而第二阶段的LSTM会将前面的隐藏状态和已观察到的编辑序列作为输入,并产生解码的隐藏状态和输出状态 。下图3(a)有一个更形象的展示 。