论文笔记:用神经网络的方式生成炉石传说的code:Abstract Syntax Neural Network

转载于https://zhuanlan.zhihu.com/p/79486610

这篇文章主要介绍的一种新颖的neural semantic parsing的方法来做code generation,这个特殊设计网络的名字叫Abstract Syntax Network(ASN),是伯克利在2017年的工作。其中有几个亮点:

  1. 使用了神经网络的方式生成code
  2. 使用了一种语法树来限制神经网络只能生成有效的输出。这种语法树是由一种叫Abstract Syntax Description Language(ADSL)的语言来描述的,而python同样也在用这种语法树,这就保证了这种方法天然的适合生成python code。
  3. 作为一个炉石粉丝,最让我感兴趣的是他用这种方法生成的是炉石传说的code,将来发明一张新卡,写code可以减少很多工作量吧。

Semantic Parsing

semantic parsing这个任务很好理解。主要任务是建立一个从自然语言(utterance)到机器可执行的逻辑语言(logic form)的一个映射模型。按照wikipedia的说法:

Semantic parsing is the task of converting a natural languageutterance to a logical form: a machine-understandable representation of its meaning[2].

Neural Approaches

semantic parsing是个自然语言处理中非常古老的任务,传统上有很多种方法,这里我们就讲最近的神经网络的方法。

其实任务定义清楚后,就可以看到这跟机器翻译很像,都是从一个语言到另外一个语言。机器翻译现在最常用的就是seq2seq[4]的方法,semantic parsing很自然的也可以使用这种方法。

Seq2Seq这个模型很多人都很清楚了,主要是一个encoder把一个input sequence encode成一个向量,然后decoder根据这个向量来decode出一个output sequence。

但是这个方法在semantic parsing中有很大的缺点,就是他会产生无效的output sequence。

如果decoder产生错误的token,那么整个输出的语法就错了。这个时候我们就需要想办法来限制decoding的process来使这个LSTM decoder生成语法有效的答案。这就涉及到一个新的研究topic,constraint decoding。

Constraint Decoding

Constraint Decoding主要指的是在decoding的inference阶段给decoder加上一些限制强制decoder能生成有效的输出,同样。Constraint Decoding主要可以被分为两类,Token-based Methods和Grammar-based Methods:

  1. Token-based Methods主要是是指decoder直接生成的都是logic form里面的tokens。但是这些token的生成都必须遵循一些constraint。
  2. Grammar-based Methods主要是相对于Token-based Methods来说的。主要是指decoder生成的不再是logic form里面的tokens,而是grammar trees。再根据生成的语法树来得到logic forms。

这两种方法我都会给出例子,第二个例子就是我们想要介绍的Abstract Syntax Net。

Seq2Tree

Seq2Tree来自文章Language to Logical Form with Neural Attention[5]。就是一个改造的seq2seq,结构非常的一目了然。

看一下这个Seq2Tree的decoder结构,是一个树形层级的LSTM。logic form中所有的nonterminal结构,就是括号里面的部分,都被代替为了一个<n>的token。首先decoder会跟普通的seq2seq结构一样根据input sequence的hidden vector,decode出一个sequence。然后每次当有<n>生成的时候,这个<n>的embedding vector又会作为下一个层级的decoder输入来decode出一个子序列,这个子序列原本应该出现在上一层级的nonterminal <n>处。这样recursive循环的生成,直到最后生成的序列(sequence)完全没有nonterminal为止,decoding结束。

这里生成的始终还是logic form里面的tokens,只不过使用这种特殊的LSTM来限制输出只能为一个在句法上有效的树形结构。但是这种方法也有缺陷,就是它虽然能保证生成的输出是句法上有效的,但是不能保证生成的序列是语义上有效的。比如在我生成(departure_time $0)时,Seq2Tree可以保证我生成了一个左括号一定会接上一个右括号,这样会使一个有效的树形结构。但是假如我生成了($1 $0)这个输出的logic form同样是无效的,无法被数据库识别,而Seq2Tree没有办法限制这种错误的发生。此时又会有另外一种类型的方法Grammr-based Methods来解决这种问题。

 

Abstract Syntax Networks

Abstract Syntax Networks是一种典型的借助语法Grammar来限制decoding的方法。它的方法虽说也是一个Seq2Tree的方法,但是它decoding生成的是grammar tree而不是logic form里面的token本身,再通过grammar tree来生成logic form。这里这篇文章用的grammar tree叫abstract syntax tree(AST),描述这种树的语言叫abstract syntax description language(ADSL)。接下来我会介绍这两个概念。

 

看这个图片里面的例子,我们可以看到这个左下的code被parse成了一颗abstract syntax tree(AST)。在生成训练数据的时候,由于我们已经有了grammar和python code。code to AST的过程是一个bottom-up的过程,code里面的每一个token会被当成叶子节点,然后会被分到它属于的类,然后这个类别也会属于另外一个层级的类别,到最后会到一个root节点,形成一个tree。这棵树生成严格遵循一套语法,保证这个树生成过程是deterministic的。

Python ADSL grammar

关于python的[6]语法,长得就是以下这个样子:

长得很像context free grammar(CFG),但又有很多不同,这套grammr是由ADSL这个语言来描述的。

Abstract Syntax Description Language (ADSL)

ADSL主要有几个元素,Primitive types,Composite types,Constructors,Composite nodes,Fields 。

举个例子:

stmt = FunctionDef(identifier name, arg* args, stmt* body)

| Return(expr? value)

| . . .

python code里面的每一个token首先都会被归类到一个primitive type。在这个例子里面,primitive type有identifier。然后这些token会作为fields,比如name就是一个field,被Constructors组合起来形成一个Composite node。Constructors在这个例子里面有FunctionDef和Return。然后这些Composite nodes的组合又会被归类到一个Composite type,比如stmt。同样的Composite type也会被作为另一个field的type然后被另外的Constructors组合起来形成Composite node,这种recursive最终会到根结点的type停止,这里root结点的type是stmt。另外注意这里的stmt* body和expr? value,*意思是sequential,代表body这个field有可能有1到多个,?意思是optional代表value这个field有0到1个。相信学过regular expression的同学可以很同意理解。

Seq2AST

明白了什么是AST后,其实ASN这个网络的目标就很明确了,就是根据input utterance生成一个AST tree。接下里我来介绍下这个tree的结构。

 对应上composite type,constructor,field和primitive type,作者在普通的LSTM decoder基础上加上了4个modules。我会根据下面这个图来一一介绍这四个modules。

我们前面提过在生成训练数据的时候,code to AST的过程是一个bottom-up的过程。但是在decoding inference的时候这个过程,这个过程确实top-down而且recursive的。

首先encoder生成的hidden vector会被输入进一个单个cell的LSTM。这个LSTM叫做vertical LSTM。然后这个LSTM的output vector会被输入composite type module。这个composite type module其实是个classifier,每个composite type会有属于自己的classifier。这个分类器会分类得出当前的type在一个层级的constructor是哪一个。由于stmt是所有python AST的root节点,这个分类器在一开始就是属于stmt的,所以在这个例子中得到了constructor "If"。然后constructor “If”会有四个fields,这四个fields的type所对应的vector会又被输入vertical LSTM。LSTM输出的vectors会有几个去向。如果是普通的type,这个vector又会被输入vertical LSTM。如果type是?(optional)的,vector会进入一个binary classifier,决定这个vector是否要进入这个vertical LSTM。如果type是*(sequential)的,vector会作为一个horizontal LSTM的input。这个horizontal LSTM也是一个decoder,但是所有cell外层都会套一个binary classifier,当前cell的输入都是上一个cell的输出,停止decoding的条件是binary classifier输出为0。horizontal LSTM的主要目的就是碰到*类型的时候决定到底有多少个fields。这个horizontal LSTM的output vector也会作为sequential field的representation输入进入vertical LSTM。最后如果碰到了primitive type,这个primitive type也会被输入vertical LSTM,但是对应的vertical LSTM的输出会被输入primitive type module来决定叶子节点的python code是哪一个。而其他的又回回到开始的composite type module来decoding,直到全部最后全部都是primitive type,decoding才会结束。

Summary

其实基本所有的在神经网络seq2seq之前的传统方法都是用用grammar来限制输出的。所以他们不会碰到seq2seq的生成logic form无效的问题,但是传统方法的模型拟合能力没有神经网络那么强。这篇文章优势在于结合了传统的grammar constraint的方法和最近的神经网络的拟合能力强的优势,达到了当时state-of-art的效果。当然token-based的方法也有优势,它不需要decode过于复杂的东西,这个grammar有时候可以很复杂,会给decoding增加很大的难度,而token-based方法就不需要应对这些麻烦。nerual semantic parsing里两条不同的分支都有各自的优势。

参考

  1. ^http://nlp.cs.berkeley.edu/pubs/Rabinovich-Stern-Klein_2017_AbstractSyntaxNetworks_paper.pdf
  2. ^https://en.wikipedia.org/wiki/Semantic_parsing
  3. ^https://www.cs.utexas.edu/users/ml/nldata/geoquery.html
  4. ^https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf
  5. ^https://www.aclweb.org/anthology/P16-1004
  6. ^https://docs.python.org/2/library/ast.html

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值