孙泽宇、朱琪豪、牟力立、熊英飞、李戈、张路作者arXiv选自

首次成功用CNN自动生成代码:北大研究者搞定了炉石传说


如果人工智能可以自动生成代码,程序员们就能减少很多工作压力(失业是不可能失业的)。

北大研究者最近提出了使用卷积神经网络(CNN)解码器生成代码的方法,并在《炉石传说》数据集上进行了测试,效果超过了此前各类业内最佳模型。该研究的论文已被 AAAI 2019 大会接收。研究者称,这是首个成功用 CNN 解码器生成代码的工作。

我们知道,程序包含对程序建模非常重要的丰富的结构信息。然而,传统的 Seq2Seq 神经网络不能直接建模程序结构。图 1 展示了一个 Python 抽象语法树(AST)示例,其中的 n3、n6 两个节点需要拥有父-子节点那样密集的关联,但如果该树是前序穿过序列的,彼此间就会比较远。这对 Seq2Seq 模型而言就比较困难。

图 1:代码的抽象语法树(AST):init(a)。

为了解决这个问题,Dong 和 Lapata (2016) 提出了一种沿着程序的抽象语法树生成代码的方法,但这种生成仍然处于 token 级别。近来,更多的研究通过在每一步预测或重写语法规则 (Xiong et al. 2018; Yin and Neubig 2017; Rabinovich, Stern, and Klein 2017) 来生成程序;因此,确保了生成的程序在语法上是正确的。当在这些方法中使用神经网络时,RNN 被用来捕获解码器中预测的自回归。

深度学习社区,研究人员对使用卷积网络作为解码器越来越感兴趣 (Gehring et al. 2017; Chaturvedi, Pandit, and Garain 2018),因为它效率高且容易训练。研究者进一步观察发现,程序比自然语言语句大得多,即使是带有长短期记忆 (Hochreiter and Schmidhuber 1997, LSTM) 单元的 RNN 也存在长期依赖问题 (Bengio, Simard, and Frasconi 1994)。而 CNN,却能通过滑动窗口有效地捕获不同区域的特征。

为此,研究者提出了一种基于语法的结构化 CNN 来用于代码生成。他们的模型根据 AST 中的语法结构规则生成代码,例如,If → expr stmt* stmt*就遵循了他们先前研究 (Xiong et al. 2018) 中的框架。由于子节点序列是通过一个预测步骤生成的,因此与逐个 token 生成相比,它能够实现更紧凑的预测。换句话说,该模型预测语法规则序列,最终形成整个程序。

在他们的方法中,语法规则的预测主要基于三种类型的信息:指定生成程序的源序列,先前预测的语法规则,以及已经生成的部分 AST。在这里,第一个信息是编码器的输入,后两者使得解码器能够自回归,和以前一样,解码器以编码器为条件。

图 2:模型概览,虚线箭头表示注意力控制器。

研究者在已有的基准数据集 HearthStone(炉石传说)上进行了实验(如图 4 所示),任务是 Python 代码生成(Ling et al. 2016),表 2 展示了该数据集的统计。实验结果表明他们提出的基于 CNN 的代码生成方法远远超越了以前的基于 RNN 的方法(如表 3 所示)。研究者还进行了扩展性的控制变量测试,表明基于语法的结构化 CNN 相比一般的 CNN 应用方法更优越(如表 4 所示)。研究者进一步在两个语义解析任务上评估了该方法,其中目标程序比炉石传说的更短;他们的方法依然得到了和以前的最佳方法相当的性能,表明该方法具备鲁棒性(如表 5 所示)。

图 4:炉石传说数据集的示例卡片,(a)输入描述;(b)输出程序。

表 2:数据集统计。

表 4:控制变量测试。

论文中研究者称,他们的研究是第一次成功使用 CNN 解码器生成代码的工作。表 3 展示了基于 CNN 的代码生成结果,并与此前的业内最佳模型进行了对比。

如表中所示,新模型在准确率和 BLEU 分数方面都优于以前的所有结果。尤其是,新模型在准确率方面显著高于此前的业内最佳模型——在字符串准确率上高出了 5%。对于手动调整的准确率来说,Yin & Neubig(2017)曾报告过大约 2% 的提升。在本文中,北大的研究者也观察到了类似的效果,实现了 30.3% 的 Acc+分数,这证明了新方法的有效性。

表 3:新模型与此前业内最佳模型的对比,以百分比记。在手动调整后性能大概能增加 2%(Yin and Neubig (2017))。

表 5:语义分析的准确性(以百分比记)。

论文:A Grammar-Based Structural CNN Decoder for Code Generation

论文地址:https://arxiv.org/abs/1811.06837

摘要:代码生成可以将一份程序描述映射为用一种编程语言写成的可执行源代码。现有的方法主要依赖于循环神经网络(RNN)作为解码器。然而,我们发现程序比自然语言句子包含的 token 要多得多,因此 RNN 可能并不适合捕捉长句。本文提出了一个基于语法的结构化卷积神经网络(CNN),用于代码生成。我们的模型通过预测编程语言的语法规则来生成程序;我们设计了若干个 CNN 模块,包括基于树的卷积和前序卷积,其信息通过专用的注意力池化层进一步聚集。在炉石传说基准数据集上的实验结果显示,我们的 CNN 代码生成器的表现超出之前最佳方法 5 个百分点;我们通过另外几个实验在若干语义分析任务上验证了模型的鲁棒性。为了更好地理解模型的每个部分,我们还进行了深入的控制变量测试。

理论解码器CNN北大AAAI 2019AAAI论文
6
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

语义分析技术

语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

序列到序列技术

长短期记忆网络技术

长短期记忆(Long Short-Term Memory) 是具有长期记忆能力的一种时间递归神经网络(Recurrent Neural Network)。 其网络结构含有一个或多个具有可遗忘和记忆功能的单元组成。它在1997年被提出用于解决传统RNN(Recurrent Neural Network) 的随时间反向传播中权重消失的问题(vanishing gradient problem over backpropagation-through-time),重要组成部分包括Forget Gate, Input Gate, 和 Output Gate, 分别负责决定当前输入是否被采纳,是否被长期记忆以及决定在记忆中的输入是否在当前被输出。Gated Recurrent Unit 是 LSTM 众多版本中典型的一个。因为它具有记忆性的功能,LSTM经常被用在具有时间序列特性的数据和场景中。

推荐文章
暂无评论
暂无评论~