您的位置:首页 > 理论基础 > 计算机网络

用于代码生成的抽象语法网络 (侵图删)

2017-11-05 20:49 225 查看
本文是《Abstract Syntax Networks for Code Generation and Semantic Parsing》阅读笔记, 此篇论文主要介绍一种用于代码生成的抽象神经网络,数据集是关于



炉石传说卡牌仿真游戏的,其中模型输入一张卡牌,输出这张卡牌描述的代码



这段代码主要是关于食腐土狼类的初始化以及功能描述代码。

本篇则从语法生成的角度,将最后要生成的代码用语法生成树来表示,



预备知识:

要想得到输入序列,然后输出另一个序列,最开始研究的时候往往是一对一的,即输入与输出序列的长度是一样,显然这种模型实用性很窄,人们相应提出一个 Seq2Seq 模型,这种模型则不要求输入输出长短一致,常见的应用有机器翻译,语音识别,文本摘要等等

相应地要实现这种模型,人们提出一个实用的 encoder-decoder 的模型, 如下图,我们可以填入 “我爱中国”, 最后输出 “I love China”



值得注意的是中间的语义向量 c 是长度是固定的, 这就是说 c 应该代表了 x1,x2,x3,x4 的所有信息,然而这样表示的 c 长度应该非常长,是不利于训练的,若长度适中,则明显的会丧失一些信息,对于解码模型的训练损失就会很大。因而有必要改善这种单一向量的形式,于是人们提出了一个 Attention 机制,此机制先在解码层初始化的时候给出一个适当的语义向量,在其后的解码过程中就会根据当前需解码的内容给予相应被编码的向量以相对大的权重,



比如在训练 “I” 的时候就要求“我”的隐含层状态 h1的权重会大一些,然后得到c1用于解码



相应的 a1j 的求法是根据当前编码层的隐含层状态以及上一层得到的解码层的隐含层状态进行求解的。

本文的抽象语法网络主要是扩展了当前的 encoder-decoder 框架,编码层采用了分层的 Attention 机制, 解码层则采用了模块化的解码层,每个子模块采用了自顶向下的方式生成抽象语法树

其中数据表示使用较为通用的抽象语法描述语言,其中包括基本类型和复合类型,基本类型就相当于编译原理中提到的终结符,书中的叶节点,当节点是基本类型的话就不用往下在递归了



复合类型一般有语句或者表达式,基本类型一般以标识符为常见,

主要的模型架构,整体上是一个基于分层 Attention 的 encoder-decoder 模型,encoder 层使用双向 LSTM 生成语义向量, decoder 层则有一系列相互递归的子模块组成,

模型用的损失函数是副对数似然函数。

解码层是相对核心的模块,分为复合类型模块,构造方法模块,构造域模块,基本类型模块





首先是由根节点开始,一般为复合类型语句,这一模块通过训练,最后由 softmax 层得到一个 if 的构造方法,再有 if 的构造方法选择其相应的表达式或者语句,传入构造域中,用一个网络循环训练,直到损失可接受,输出一个相应的语句,若该语句是基本类型则停止,若复合类型则递归前面的模块,不断训练,最终得到一颗理想的抽象语法树。

最后实验结果采用了精确匹配和 BLEU 判别标准的来比较模型训练效果的好坏。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息