Abstract
这篇论文是一篇很经典的semantic parser的论文。
这个领域目前还是不是很了解,semantic parser的主要作用是将自然语言转换成一些logic form,然后就可以利用其他的工具对logic form进行计算得出结果。
上图就是一个logic form,当然形式不只是一种,Hop和Argmax都是方法,V1,V2都是变量,意思则是收集所有的城市,找出最大人口的城市。semantic parser的难点有三个,1.同一个语句的parser方式不止一种(Paraphrase)。2.如何组合这些解析出来的方法和语句(Compositionality)。3.这是有很大的搜索空间(optimization)。在得到logic form的形式后,需要争对这些程序在数据库中查找,这些数据库可以是知识图谱,比如Freebase,也可以是table,有些knowledgebase的内容非常多,那么就导致了搜索空间巨大。
semantic parser的full-supervised method只能争对小数据,对于大量的数据不具备泛化能力,因为program是没有办法大量标注。这篇文章提出了一种神经逻辑机,结合了seq2seq model和lisp interpreter,并结合了强化学习的方法训练模型。由于强化学习在前期的训练非常缓慢,作者加上了极大似然预训练。
这篇文章对于这三个难点只考虑了search和compositionality。
Introduction
在semantic parser这个领域,以往的program inductive任务都是给出一个标注好的程序,然后利用这些标注好的程序做监督学习任务;或者是提供一些low-level的存储方式或者可微分的存储方式,使得计算机可以进行反向传播。但是这些方法存在很大的缺陷,然后做监督学习,那么需要大量的人力物力去标注程序,这样很耗费精力,其次如果使用可微分的方式,那么离散操作和一些传统的executor,比如专家系统就用不了了。
所以文章提出了一种弱监督学习的方式来解决这个问题。
model由三部分组成,manager,可以类比于强化学习的环境,用于评估任务完成的好坏;programmer,将自然语言输入转换成程序,并且需要参考manager给出的reward训练;computer,执行得到的program输出结果。本文的框架是Neural Symbolic Machine,programmer由seq2seq组成,computer由一个Lisp解释器组成。
同时还附带了三种作者提出的技术,semantic parser的compositionality,由于seq2seq是需要支持的,所有执行完的语句需要存储结果,于是作者提出了key-variable memory用于存储执行后得到的变量。其次在生成program的时候,很可能会出现语法和语义的错误,我们在这方面加以限制。最后就是结合MaxLikelihood来训练。 在数据集WebQuestionsSP取得了更高的准确率。
Model
Computer
和lisp的语法很相似,但是没有用上lisp的所有语法,循环还行流程控制这些没有加上,因为这不是必要的。
作者在wikiTable这个数据集上定义了22个函数。由于是边生成边执行,如下图,生成了Hop R1 !Cityln之后就立刻执行,在每次生成的时候都会做语法检查,比如生成了"(",那么下一个一定是函数,如果生成的是函数,那么下一个一定是变量。通过Grammar Checking减少search space
Programmer
programmer由seq2seq模型+attention+key-variable memory组成。seq2seq由一个encoder和一个decoder组成,程序是一个接一个的生成,边生成边执行,这里就涉及到了operation和variable的组合问题,于是论文添加了一个key-variable memory存储中间变量,operation和variable通过softmax从词汇表里面选择。
在encoding阶段,在编码的时候通过一个entity linker将文本中的实体筛选出来,variable就是值本身,key则是encoding之后的hidden state。在decoding阶段,当整个表达生成的时候就会被执行,执行后的变量又会存储下来继续准备下一次执行。
Training with weak-supervised
主要是使用一种Iterative ML的方法进行计算,很想EM算法和强化学习的策略迭代算法,固定参数选择最优的解,优化参数,再固定参数以此类推。为了加快训练,还增加了一些其他的方法,但是大致思路差不多。
首先介绍一下强化学习,reinforce learning。给定一个问题x,state,action,reward,我们可以得到一个三元组
(
s
t
,
a
t
,
r
t
)
(s_t, a_t, r_t)
(st,at,rt),由于
a
t
a_t
at之间并不是完全独立的,所以定义的state =
(
x
,
a
0
:
t
−
1
)
(x,a_{0:t-1})
(x,a0:t−1),问题和history of action作为状态。action实际上是program的一部分,所以完整的action历史就是整个程序了。reward只有在生成完程序后才会生成,
r
t
=
I
[
t
=
T
]
∗
F
1
(
x
,
a
0
:
T
)
r_t = I[t = T]*F_1(x, a_{0:T})
rt=I[t=T]∗F1(x,a0:T)。 用于计算gold answer和generated answer的F1 score。
直接使用reforce会带来一些问题,reward signal delay奖励延迟,large search space搜索空间巨大。另外由于偏置项B(x)是通过beam search得到的,beam search的k的选择也是很大的问题。所以程序在一开始的时候很可能会陷入冷启动。文章映入了maxlikelihood辅助训练。
Iterative ML
如果是有监督的学习,完全可以利用label进行训练,但我们只有结果而没有程序,没办法直接用上reforce的方法。gold answer拿不到那就取一个pesudo gold answer,也就算一个pesudo-label。
学习方法很像EM算法,先找出一个下界,趋近这个下界之后再优化下界,不断重复。一个好的模型可以生成一个好的程序,而一个好的程序又可以生成更好的模型。Iterative ML的缺点:1.生成的程序可能是偶然得到的正确答案,而不是程序理解了问题,所以这种程序没办法做扩展。2.由于我们只得到了正确的程序,错误的程序都忽略了,所以很难区分他们之间的关系。
前面提到了一个偏执项
B
(
x
)
B(x)
B(x),每得到一个pesudo-gold program就会存入beam,这样通过beam search得到的偏执项会随model不断变化适应。下面的算法描述了整个过程:
首先,先执行Iterative ML跑N个回合,记录下所有best program,然后利用这些program更新参数。maxmize likelihood极大似然更新 如下:
第一行的C存储所有的pesudo-gold program。初始化参数,对于每一个数据,选出
B
M
L
B_{ML}
BML个程序做完这个问题x的Beam,选择最好的那个用极大似然更新参数。
其次,reinforce训练。best program会比普通的程序多出
α
\alpha
α的概率,使得model更倾向于生成best program。 reinforce和iterative ML是两种不同的更新方式,并不都是强化学习。
Iterative ML目前看来就算极大似然,先用极大似然函数预训练model,再用强化学习训练model。
Experiment
实验是使用WEBQUESTIONSSP数据集,包含了3098个训练集,1639个测试集,知识库使用FreeBase。模型使用GloVe做为embedding
Conclusion
这里所使用的weak supervisied和LBF的又有所不同,这里的weak supervisied主要是借助于神经网络的参数调整,而LBF是利用溯因推理完成。
对比溯因推理的方法,这种方法更具备泛化能力,可以应用到更多的场景上去。这里用F1 score个人感觉他应该是觉得所有他算了一下所有的结果都比别人差所以才拿了这个吧。