论文:Alexandru, Carol V. . "Guided code synthesis using deep neural networks." Acm Sigsoft International Symposium on Foundations of Software Engineering ACM, 2016.
摘要:
我们可以教计算机如何编程吗?神经网络的最新研究表明,某些神经网络不仅能够学习任意字符序列的语法和语义,还能生成类似于原始训练数据的新样本。本文旨在探索这些技术对于代码分类、理解和补全的适应性。
1. 挑战
尽管编写软件是一个创造性的过程,但重复在软件开发中是常见的。例如读取一个CSV文件或者比较两个日期这样不太常见并且较为复杂的任务,开发人员可以轻松地在GitHub、StackOverFlow等网站上查找现有解决方案。但除了基于搜索工具和特定平台的系统方法之外,我们目前缺乏能够利用包含在这些资源中的大部分知识的有效手段。
最近的神经网络研究已经提出了一些相关模型,这些模型不仅可以学习识别和分类噪声数据,还可以生成类似于真实数据的新的合成样本。Sutskever等人[1]已经证明,对来自维基百科的1GB文本进行训练的深度递归神经网络(RNN)能够合成包含少量语法错误、具有语义连贯的句子和段落、并正确模拟长期有效规则的文本流。该模型在字符级别读取数据,仅通过样本实例学习明确的语法和词汇知识。可以在源代码上训练相同的模型:该模型仅用原始代码进行训练,它内化了编程语言的语法和典型结构,并获得了能够生成新样本的能力,乍看之下这些样本与真实代码并无区别。
不过,这个简单的模型在现实中的用途却很有限,因为在较高的语义级别上,它产生的程序或多或少是随机的。本文设想通过改进初始数据提取,将上下文相关信息加入模型,并对合成代码进行后期处理,这种方法就可以变得实用。作为一种实际的表现形式,本文提出了引导代码合成的概念,这是一个交互式过程,开发人员通过该过程引导机器训练模型生成所需的源代码,而无需手动访问IDE外部的资源。
因此,本文制定了主要研究问题:
字符级深度神经网络如何帮助实际应用中的源代码合成?
2. 拟定研究
在传统的代码自动完成中,代码片段或者一次给出一个(比如在写入点之后提供潜在的方法名称),或者作为模板(比如提供由开发者填写的循环的元素)。本文设想了一种开发人员可以查看、选择和修改整块补全代码的方法,这不仅取决于前面的代码,还取决于其他上下文信息,例如评论、标签和手动提供的搜索词中的关键字。如果由丰富的模型提供支持并以易于使用的响应方式实现,这种方法将允许开发人员“置身于”正确的解决方案中,而无需借助于浏览在线组件,因为模型可以提供多种可能的定制代码完成。
要训练这样的模型,需要解决几个问题:
我们如何从杂乱的Web资源中识别、分类和解析相关的代码示例,以构建规范化的训练集?什么是合适的神经网络架构,能够从源代码和上下文信息中学习并生成高质量和高相关性的代码样本?在IDE中进行开发时,开发人员应该如何与模型进行交互?
复杂代码分类和解析
为了在来自混合内容源的代码上训练我们的模型,我们需要将代码片段与其他内容隔离,并按照其语言和可能的上下文对代码片段进行分类,以及解析代码片段。虽然在给定完整文件的情况下很容易确定内容类型,但在不使用复杂启发式算法的情况下很难对短代码片段进行分类。此外,实际的代码片段主要是不完整的程序,可能包含诸如省略号或伪代码占位符之类的噪声。而传统的基于语法的解析器通常无法解析孤立的代码段,特别是当它们包含噪声时。
由于RNN已经成功应用于文本分类,RNN序列到序列的转换则可以将有噪声的字符序列解析为部分抽象语法树(ASTs)。可以通过使用常规解析器从GitHub解析完整的源,然后提取代码片段及其相应的AST片段来获得代码片段->类型和代码片段->用于训练的AST对。为了使解析器更加健壮,可以将合成噪声添加到训练中使用的片段中。
用于代码合成的神经网络架构
混合使用多种双向RNN架构[2]是我们模型的一个合理候选方案。然而,确定正确的模型需要进行研究和实验。由于模型平均法通常可以改进预测,因此最终我们可以在输出阶段组合不同的架构。
IDE集成
为了在实际环境中评估我们的方法,我们将其集成到了IDE中。该插件将使用预先训练的模型,但它也可以从本地代码中学习。模型将根据需要在当前光标位置获取先前字符和上下文信息以生成样本。我们设想生成的代码片段的长度会根据模型的置信度而变化,并且可以在多个候选中循环选择。此外,还可以对代码进行后处理以检查健全性并在运行中替换重要元素。
本文的最终目标是一个代码合成系统,它内化了诸如StackOverflow等互联网资源的丰富知识,它应该能够在开发人员编写代码时持续提供可能的多令牌预测,从而减少上下文切换并提高生产力。
3. 评估
片段分类器和解析器的性能可以用基本统计术语来表示。神经网络架构生成源代码的能力和IDE集成的适用性则可以从两个方面上进行衡量:(i)与其他方法相比,该模型预测未来n个字符的能力[3],(ii)通过执行三方用户研究,比较开发人员使用我们的工具解决某些编程任务所需的时间、使用其他自动完成工具所需的时间以及仅使用Web资源所需的时间。
4. 研究进展和展望
本文应用Sutskever等人的方法,在10MB的Java源代码上训练RNN模型以生成合成样本。尽管数据集很小,但生成的样本非常类似于真正的Java代码。这个结果支持训练多个专家模型的策略,因为每个模型都只需要很少的训练数据。本文还从825个GitHub项目中收集了7GB的代码,使用cloc检测每个文件的内容类型,对24种编程语言中的每一种随机抽取3000个代码片段,并训练RNN以91%的准确度检测正确的内容类型。此后,本文将构建神经解析器的训练集,并开始尝试不同的神经网络架构,以完成上下文相关的代码补全功能。
本文主要贡献:
基于能够生成类似于原始训练数据的新样本的深度递归神经网络(RNN),本文创造性地提出了:
一种根据代码片段的语言和可能的使用上下文来隔离和分类片段的工具;一种用于将有噪声片段解析为部分AST的序列到序列学习器;一个从代码和上下文学习预测代码片段的神经网络架构;一个使用我们的模型提供多令牌自动完成功能的IDE插件。
利用这些工具和技术,本文提出了引导代码合成的概念,并计划最终编写出一个代码合成系统。它内化了互联网资源中的大量代码知识,能够在开发人员编写代码时持续提供可能的代码预测,从而减少上下文切换并提高生产力。
参考文献:
[1] Sutskever, J. Martens, and G. Hinton. Generating text with recurrent neural networks. In Proceedings of the 28th International Conference on Machine Learning (ICML-11), ICML ’11, pages 1017–1024, New York, NY, USA, June 2011. ACM.
[2] A. Graves, N. Jaitly, and A. r. Mohamed. Hybrid speech recognition with deep bidirectional lstm. In Automatic Speech Recognition and Understanding (ASRU), 2013 IEEE Workshop on, pages 273–278, Dec 2013.
[3] M. White, C. Vendome, M. Linares-Va ?squez, and D. Poshyvanyk. Toward deep learning software repositories. In Proceedings of the 12th Working Conference on Mining Software Repositories, MSR ’15, pages 334–345, Piscataway, NJ, USA, 2015. IEEE Press.
致谢
此文由南京大学软件学院2019级硕士王黛薇翻译转述。
标签: 代码
②文章观点仅代表原作者本人不代表本站立场,并不完全代表本站赞同其观点和对其真实性负责。
③文章版权归原作者所有,部分转载文章仅为传播更多信息、受益服务用户之目的,如信息标记有误,请联系站长修正。
④本站一律禁止以任何方式发布或转载任何违法违规的相关信息,如发现本站上有涉嫌侵权/违规及任何不妥的内容,请第一时间反馈。发送邮件到 88667178@qq.com,经核实立即修正或删除。