Dynamic Oracles简介
最后再解释一下Dynamic Oracle是干嘛用的,传统的Static Oracle就是在转移的每一步按照标准转移序列中的action进行转移,但是这样会有一个问题,如果预测的时候某一步预测错了,遇到了一个训练阶段没有出现过的状态,那么该怎么进行转移呢?这时候就要用到Dynamic Oracle,用来针对不同的错误情况进行动态的指导,引导它转移到正确的状态中去。另外在训练时可以手动加入一些错误状态,来训练模型,不然的话遇到的错误状态还是太少了,不足以训练好模型。
Dynamic Oracles
Goldberg (2012)证明了Dynamic Oracle可以通过定义一个损失函数来直接实现,而这个损失函数可以用来衡量当前状态可以产生的最优句法树和标准句法树的距离。最小化这个距离就会使得错误状态也会转移到最终错误最少的状态。而这个损失函数就要和当前状态c挂钩了,这样才能达到和传统的Dynamic Oracle类似的效果。
损失函数
传统的损失函数定义为预测短语成分集合和标准短语成分集合不相交的元素数量,即:
根据上一篇博文
更快的基于非二叉化自底向上策略的转移系统成分句法分析godweiyang.com
的推导,该损失函数可以计算为
上面的损失函数是上一篇论文中介绍的bottom-up的转移系统的Dynamic Oracle,但是本文主要讨论top-down和in-order的转移系统,因为转移系统多了non-terminal,所以需要新加入两项损失,用来衡量当前状态可以产生的最优句法树与标准句法树之间的汉明损失。
这两项新加的损失分别是:
- 当前栈中已经生成的non-terminal集合 中不包含在标准non-terminal集合 中的non-terminal数量,即 。
- 当前栈中违反了标准树中non-terminal顺序的non-terminal数量。
所以最终的损失函数为:
前面三项都很容易求得,至于最后一项,可以通过计算栈里的gold non-terminal序列的最长上升子序列来得到,而序列中每个non-terminal的标号就是它在标准树转移序列的non-terminal顺序标号。
短语的可达性
在这里用短语集合 来表示一棵句法树,我们假设状态c的短语集合为 ,那么我们说,标准句法树中的一个短语 当且仅当满足如下三个条件之一时,称它是“各自可达短语”:
对于top-down转移系统:
- (因为短语已经包含在了状态c已生成的短语集合里,那么它当然是可达的)。
- (因为短语还在buffer中,并且短语的non-terminal还没有入栈,所以可以通过入栈 ,再不断SHIFT然后REDUCE得到)。
- (这种情况表明了短语的左端点恰好位于栈里某个短语的边界处,而右端点又还在buffer里,所以还可以通过不断SHUFT然后REDUCE得到短语。但是如果左端点不是栈里短语的边界,那说明产生了交叉,自然不会可达了。而如果右端点已经在栈里了,那之后也不会得到了,因为转移系统每次都是REDUCE栈顶的短语,不可能从栈里面开始REDUCE的,当然这些前提条件当然是non-terminal 已经在栈里了)。
对于in-order转移系统:
- (因为短语已经包含在了状态c已生成的短语集合里,那么它当然是可达的)。
- (因为短语还在buffer中,所以可以通过入栈第一个左儿子,再入栈 ,再不断SHIFT然后REDUCE得到)。
- (这种情况表明了第一个左儿子已经生成了一部分或者完全生成了,并且根结点non-terminal还没有入栈,所以依然可以生成)。
- (这种情况表明了第一个左儿子已经完全生成了,并且根结点non-terminal在栈里,所以依然可以生成)。
枚举标准树中的所有短语,根据以上规则可以得到可达短语集合 ,然后从标准短语集合中排除掉这部分短语,剩下的就是不可达短语集合 。这部分短语就是不论采取何种动作序列,最后都不可能生成的短语集合。
关于这两个Dynamic Oracles的正确性,这里就不再证明了,证明过程和上一篇bottom-up的差不多。
实验结果
本文和基础的几个转移系统做了对比,代码也是在他们基础上进行修改的,结果如下:
可以发现,加了Dynamic Oracles之后,结果还是有略微提高的。