Code2seq:GeneratingSequencesfromStructuredRepresentationsofCode本文简介•很多应用都有从源代码片段生成自然语言序列的能力,例如代码摘要、文档、检索等。在神经机器翻译(NMT)中采用的seq2seq模型通过将源代码视为符号序列,在这些任务中有很好的性能。本文提出了一种替代方法:code2seq。此模型利用编程语言的语法结构来更好地编码源代码,在抽象语法树中将代码段表示为组成路径的集合,在解码时利用attention的机制选择有效地路径。在实验中,此模型大大优于以前为编程语言设计的模型以及最新的NMT模型。seq2seq模型•Seq2seq运用了LSTM(长短期记忆网络)或者RNN(循环神经网络),于2014年提出,是一种翻译模型,将一个语言序列翻译成另一个语言序列。经典的RNN结构的输入输出序列是等长的,seq2seq是不等长的Attention机制•attention机制是模仿人类注意力而提出的一种解决问题的办法,简单地说就是从大量信息中快速筛选出高价值信息。主要用于解决LSTM/RNN模型输入序列较长的时候很难获得最终合理的向量表示问题,做法是保留LSTM的中间结果,用新的模型对其进行学习,并将其与输出进行关联,从而达到信息筛选的目的。•Encoder和decoder应用于seq2seq问题,其实就是固定长度的输入转化为固定长度输出。问题就是当输入长度非常长的时候,这个时候产生的语义中间件效果非常的不好,需要调整。Attention机制•attention模型用于解码过程中,它改变了传统decoder对每一个输入都赋予相同向量的缺点,而是根据单词的不同赋予不同的权重。在encoder过程中,输出不再是一个固定长度的中间语义,而是一个由不同长度向量构成的序列(权重),decoder过程根据这个序列子集进行进一步处理。Attention机制•Attention机制的关键就在于每个元素的权重计算.•加了attention机制以后,encoder层的每一步输出都会和当前的输出进行联立计算(wx+b形式),最后用softmx函数生成概率值。最后的结果就是一个加权和的形式。抽象语法树(AST)CODE2SEQ•本文将给定的代码片段表示为其抽象语法树(AST)上的一组合成路径,之后使用LSTM将每个路径压缩为固定长度的向量。在解码期间,CODE2SEQ计算出不同路径的加权平均值以生成出输出符号。MODELARCHITECTURE•模型遵循NMT标准的编码器解码器结构,同时编码器为每个AST路径创建矢量表示,然后,解码器会在生成目标序列时计算出已编码的AST路径。•编码器将输入序列x=(x1,x2…xn)映射到连续的序列z=(z1,z2…zn)。•给定z,解码器一次性输出y=(y1,y2…ym)。因此对条件概率建模。在每个解码步骤中,下一个目标符号的概率取决于先前生成的符号。•在每个基于attention的模型中,解码阶段中的每个步骤t,通常都会使用由LSTM计算得到的解码状态ht得到的z中的元素来计算上下文向量ctMODELARCHITECTURE•上下文向量ct和解码状态ht组合起来用于预测当前的目标符号yt。一种标准方法是将ct呵ht传递给MLP(多层感知器),然后使用softmax预测下一个符号的概率ASTENCODER•给定一个AST路径的集合{x1,x2…xk},目标是对每个路径创建一个向量表达式zi。之后使用biLSTM分别表示每个路径,以对其进行编码,并使用嵌入的子符号来捕捉终端符号的组成性质。•每个AST路径均由节点及其子索引组成,这些节点及其子索引来自最多364个符号的有限词汇表•AST路径的第一个和最后一个节点是终端,其值是代码中的符号,这些符号有时会被分成字符号,例如ArrayList将分解为Array和List,我们使用学习的嵌入矩阵Esubtokens表示每个子符号,然后对子符号向量求和以表示完整符号:ASTENCODER•为表示路径,我们将路径的表示形式与每个终端节点的符号表示形式进行连接,之后应用全连接层。•上式中的value是终端节点与其关联值的映射,是一个的矩阵•下式中的h0是解码器的初始状态•Attention机制用于在解码时动态选择k个组合表示形式的分布,与seq2seq的类似EXPERIMENTEXPERIMENT