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

利用机器学习学会如何自动写代码或修改代码一直非常诱人,它不仅能减少大量工程努力,同时也能构建更高级的智能体 。在这篇论文中,谷歌大脑的研究者提出利用神经网络建模我们对源代码的编辑,也就是说将我们对代码的编辑视为一个序列,然后像语言模型那样学会如何「写代码」 。
总体而言,这份研究在于理解人类编写代码的过程(例如的),并使用深度神经网络模拟这个动态的编辑过程 。只需要给定上一次的编辑信息,模型就能预测下一次代码编辑该改什么,从而继续修改与生成代码 。前一段时间,的GPT-2能生成逼真的自然语言对话,也许采用相同的模式,这种动态代码编辑也能生成「逻辑合理」的源代码 。
这篇论文的四位作者都来自于谷歌大脑,其中二作还发布过一个可以自动生成命令行接口的库: 。
什么是代码建模
代码是一种机器语言,它和自然语言一样以一种序列的方式展现出来 。以前机器之心曾介绍过多种代码生成的方式,其中研究最多的是如何根据GUI生成对应代码,例如17年提出的,我们只需要输入界面图像就能生成对应的前端代码 。
其次,2018 年 11 月,北大研究者首次成功用 CNN 自动生成代码,他们这篇论文采用了CNN解码器,并在《炉石传说》数据集上进行了测试,效果超过了此前各类业内最佳模型 。这类研究一般都会采用结构化的神经网络来建模代码结构,例如北大研究者的这篇论文就根据抽象语法树(AST)中的语法结构规则生成代码 。
但是,这些方法都将代码生成看成是一种「一次到位」的静态过程 。不过我们知道,代码的编写是动态的,随着新特性的实现、bug的修复以及重构的进行,源代码库一直处在变化之中 。其实在人类开发的过程中,开发者都需要访问已有的代码库或片段,考虑用一个或多个意图对其进行更改 。
在本文中,谷歌大脑团队探讨的主要问题是如何观察一个过去的编辑序列并预测即将发生的编辑 。这是一个重要的问题,因为构建更好的开发者工具的核心挑战是理解开发者行为背后的意图 。
这也是一个有趣的研究挑战,因为仅根据编辑的内容(输入或删除的内容)无法理解编辑模式 。我们需要根据变更与变更之前的状态之间的关系来理解编辑,而且,准确地对编辑序列建模需要学习过去编辑的表征,这一表征允许模型泛化模式并预测未来编辑 。
如图1所示,图中有两个可能的编辑序列(和) 。经过两次编辑后,两个序列都有了相同的编码状态(),但正在给foo函数添加一个额外的参数,正在从foo函数中移除第二个参数 。
研究者希望通过观察初始状态()和编辑序列(&2)让模型具备预测Edit3的能力 。在的情况下,要插入的特定值是不明确的,但是在该位置插入某个值这一事实应该具有相当高的置信度 。

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

文章插图
图1:两个编辑序列图示 。和共享相同的,但根据以往经验,更有可能通过修改对foo函数的调用来获取一个额外的参数,更有可能通过修改foo的定义来获取一个参数 。
因此在谷歌大脑的这篇研究中,神经网络需要学习不同的编辑序列及编辑内容,从而在给定编辑序列的情况下,模型能知道后面该怎样继续「写代码」 。这就和语言模型一样,给定一小段话,模型就能接着用自然语言「编下去」 。
谷歌大脑的解决方案
编辑建模序列的主要挑战是如何开发良好的表征,既能捕捉所需的意图信息,又能优雅地缩放序列长度 。研究者考虑了两种编辑表征:显式表征和隐式表征 。