深入理解成分句法分析中的Dynamic Oracle

原文链接:

深入理解成分句法分析中的Dynamic Oracle

本文将从定义到证明,一步步理清成分句法分析中用到的Dynamic Oracle函数。参考了James Cross在2016年发表在EMNLP上面的论文:论文地址,该论文还是当年的best paper。深入理解成分句法分析中的Dynamic Oracle本文将从定义到证明,一步步理清成分句法分析中用到的Dynamic Oracle函数。参考了James Cross在2016年发表在EMNLP上面的论文:论文地址,该论文还是当年的best paper。

成分句法分析系统

首先本文用到的成分句法分析系统是基于span-based的转移系统,在这里只做简略介绍,详见Parsing with Recurrent Neural Networks

深入理解成分句法分析中的Dynamic Oracle


上图展示了该转移系统的转移过程,其中结构化预测只用到了shift(sh)和combine(comb)两种动作,因为stack中存放的是span的左右边界下标,所以comb动作不需要区分左右,这与另一种转移系统的reduce动作不同。而对于label的预测,如果栈首的span不构成短语结点,那么就预测为nolabel,否则就预测为 深入理解成分句法分析中的Dynamic Oracle

每个时刻的状态用三元组 深入理解成分句法分析中的Dynamic Oracle 表示,分别表示第几个动作、栈(span的split序列)、当前已生成的结点 深入理解成分句法分析中的Dynamic Oracle 集合。注意到对于长度为 深入理解成分句法分析中的Dynamic Oracle 的句子,只需要用 深入理解成分句法分析中的Dynamic Oracle 个动作就可以分析出句法树了,并且第偶数个动作做结构预测(sh和comb),第奇数个动作做label预测。

深入理解成分句法分析中的Dynamic Oracle


上图是一个转移的具体例子,下面将全部以这个句子为例进行介绍。注意到多叉树隐式的转化为了二叉树,临时结点预测为nolabel。

Dynamic Oracle

Dynamic Oracle是Goldberg和Nivre在2013年总结出来的,发表在TACL上面:Training Deterministic Parsers with Non-Deterministic Oracles

提出的动机就是为了解决测试阶段贪心预测错误导致误差越来越大的问题。在训练的时候,原来的静态Oracle方法就是每一步都严格按照标准树的动作来进行预测,最终拟合得和标准树动作序列相同,但是测试的时候没有标准树了,如果某一步预测错误,可能会到达一个训练中没有出现过的状态,那就会导致之后的预测越来越错。所以就提出了Dynamic Oracle的技巧,在训练过程中的每一步预测,不再局限于标准树中的一个动作,而扩展为一个动作集合,只要采取集合中的动作,那么最终得到的动作序列一定也是最优的。

这种方法主要用于贪心的预测方法,例如本文的转移系统就是在每一步贪心的预测当前动作,再如之前介绍过的成分句法分析top-down模型A Minimal Span-Based Neural Constituency Parser中,自顶向下贪心的选择每一个span的最佳split,也要用到Dynamic Oracle来防止错误扩大。之前的博客有过专门介绍,可以去翻看一下:Dynamic Oracle

下面就将从定义、证明等方面来详细阐述Dynamic Oracle。

定义

定义1: 定义 深入理解成分句法分析中的Dynamic Oracle 为状态 深入理解成分句法分析中的Dynamic Oracle 经过动作 深入理解成分句法分析中的Dynamic Oracle 之后转移到状态 深入理解成分句法分析中的Dynamic Oracle ,写成函数的形式就是 深入理解成分句法分析中的Dynamic Oracle 。另外定义 深入理解成分句法分析中的Dynamic Oracle 为所有动作 深入理解成分句法分析中的Dynamic Oracle 的并集,也就是状态 深入理解成分句法分析中的Dynamic Oracle 经过任意动作之后转移到状态 深入理解成分句法分析中的Dynamic Oracle 。定义 深入理解成分句法分析中的Dynamic Oracle深入理解成分句法分析中的Dynamic Oracle 的自反和传递闭包。

定义2(派生树/可到达树): 定义 深入理解成分句法分析中的Dynamic Oracle 为从状态 深入理解成分句法分析中的Dynamic Oracle 出发,最终可以产生的句法树的集合,即
深入理解成分句法分析中的Dynamic Oracle
也可以称作“派生树”或者“可到达树”。

定义3( 深入理解成分句法分析中的Dynamic Oracle值): 定义预测树 深入理解成分句法分析中的Dynamic Oracle 关于标准树 深入理解成分句法分析中的Dynamic Oracle深入理解成分句法分析中的Dynamic Oracle 值为
深入理解成分句法分析中的Dynamic Oracle
其中 深入理解成分句法分析中的Dynamic Oracle

定义4:深入理解成分句法分析中的Dynamic Oracle 扩展为状态 深入理解成分句法分析中的Dynamic Oracle 的函数,定义 深入理解成分句法分析中的Dynamic Oracle 为从状态 深入理解成分句法分析中的Dynamic Oracle 出发可以产生的 深入理解成分句法分析中的Dynamic Oracle 值最高的句法树的 深入理解成分句法分析中的Dynamic Oracle 值,即
深入理解成分句法分析中的Dynamic Oracle

定义5(oracle): 定义状态 深入理解成分句法分析中的Dynamic Oracle 的oracle为使状态 深入理解成分句法分析中的Dynamic Oracle 转移过后最优 深入理解成分句法分析中的Dynamic Oracle 值不变的动作集合,即
深入理解成分句法分析中的Dynamic Oracle
至于这个集合该怎么求解,下面将会讲到。

定义6(span包含): span 深入理解成分句法分析中的Dynamic Oracle 被span 深入理解成分句法分析中的Dynamic Oracle 包含,当且仅当 深入理解成分句法分析中的Dynamic Oracle ,记为
深入理解成分句法分析中的Dynamic Oracle

定义7(严格包含): span 深入理解成分句法分析中的Dynamic Oracle 被span 深入理解成分句法分析中的Dynamic Oracle 严格包含,当且仅当 深入理解成分句法分析中的Dynamic Oracle ,并且 深入理解成分句法分析中的Dynamic Oracle ,记为
深入理解成分句法分析中的Dynamic Oracle
同样可以将偏序关系从span扩展到类别,即 深入理解成分句法分析中的Dynamic Oracle ,当且仅当 深入理解成分句法分析中的Dynamic Oracle

定义8(可到达类别): 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,定义它的可到达类别集合为
深入理解成分句法分析中的Dynamic Oracle
其中左右可到达类别集合又分别定义为
深入理解成分句法分析中的Dynamic Oracle
光看定义可能有点生涩,通俗理解就是, 深入理解成分句法分析中的Dynamic Oracle 为标准树中包含span 深入理解成分句法分析中的Dynamic Oracle 的类别集合,并且类别的左端点与栈中的span没有交叉,也就是说类别的左端点就是栈中除了 深入理解成分句法分析中的Dynamic Oracle 以外的其余split中的某一个。而 深入理解成分句法分析中的Dynamic Oracle 为标准树中还处于队列中没有进栈的类别集合。

深入理解成分句法分析中的Dynamic Oracle


如上图所示,还以之前的句法树为例,现在的状态为 深入理解成分句法分析中的Dynamic Oracle ,此时的栈顶span 深入理解成分句法分析中的Dynamic Oracle ,也就是红色梯形部分,那么 深入理解成分句法分析中的Dynamic Oracle 就是深蓝色类别, 深入理解成分句法分析中的Dynamic Oracle 就是天蓝色类别。而灰色类别因为与红色类别交叉了,所以属于不可到达类别,而标准树中还有一个类别 深入理解成分句法分析中的Dynamic Oracle 由于已经被识别出来了,所以也属于不可到达类别。

上面定义是基于动作序号为偶数的情况,而对于动作序号为奇数的情况,也就是预测label的动作,只需要将偏序 深入理解成分句法分析中的Dynamic Oracle 修改为 深入理解成分句法分析中的Dynamic Oracle 即可,因为转移过后span依然是本身,所以不是严格包含关系。

特殊情况(初始值):
深入理解成分句法分析中的Dynamic Oracle
很显然,初始时 深入理解成分句法分析中的Dynamic Oracle 中所有类别都属于 深入理解成分句法分析中的Dynamic Oracle

最后需要注意的一点是,根据以上定义有
深入理解成分句法分析中的Dynamic Oracle
这一点也是很显然的, 深入理解成分句法分析中的Dynamic Oracle 都是严格包含span 深入理解成分句法分析中的Dynamic Oracle 的,所以与 深入理解成分句法分析中的Dynamic Oracle 不存在交集,而 深入理解成分句法分析中的Dynamic Oracle 在队列里,更不可能存在交集,观察上面的例子会更加好理解。

定义9(next类别): 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,上面已经定义了它的可到达类别集合,最后再定义它的下一个可到达类别为严格包含span 深入理解成分句法分析中的Dynamic Oracle 的可到达类别集合(即 深入理解成分句法分析中的Dynamic Oracle )中偏序关系最小的类别
深入理解成分句法分析中的Dynamic Oracle

结构化和label Oracles

对于任意动作序号为偶数的状态 深入理解成分句法分析中的Dynamic Oracle ,记 深入理解成分句法分析中的Dynamic Oracle ,那么定义它的结构化Dynamic Oracle为

深入理解成分句法分析中的Dynamic Oracle


也就是使当前状态向着标准树中最接近它的状态 深入理解成分句法分析中的Dynamic Oracle 转移,如果 深入理解成分句法分析中的Dynamic Oracle ,那么应该再移进栈里一些单词;如果 深入理解成分句法分析中的Dynamic Oracle ,那么不能再移进了,而应该在栈里combine两个span;如果 深入理解成分句法分析中的Dynamic Oracle ,那么移进或者归约都可以,反正总能达到前两种状态。

特殊情况(初始值):
深入理解成分句法分析中的Dynamic Oracle
即使当前预测的span是错的,也可以经过Dynamic Oracle指导,几步之后预测到正确的 深入理解成分句法分析中的Dynamic Oracle 。而如果没有Dynamic Oracle,可能就一直错下去了。

深入理解成分句法分析中的Dynamic Oracle


上图是几种任意状态的Dynamic Oracle示例,除了第一种之外,其余三个都是预测错误的,如果没有Dynamic Oracle,甚至都不知道下一步转移的动作是什么。

引理1: 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,任意动作 深入理解成分句法分析中的Dynamic Oracle ,有
深入理解成分句法分析中的Dynamic Oracle
而对于任意动作 深入理解成分句法分析中的Dynamic Oracle ,有
深入理解成分句法分析中的Dynamic Oracle

最后是label Dynamic Oracle,这个就很简单了,如果span 深入理解成分句法分析中的Dynamic Oracle 出现在了标准树中,那么预测类别就行了,否则的话预测为nolabel:

深入理解成分句法分析中的Dynamic Oracle


正确性证明

主要证明两点内容: 首先定义一个特殊的树 深入理解成分句法分析中的Dynamic Oracle ,下面会证明它是从状态 深入理解成分句法分析中的Dynamic Oracle 开始可以得到的得分最高的树。
然后证明从状态 深入理解成分句法分析中的Dynamic Oracle 开始按照Dynamic Oracle策略,确实可以得到最优树 深入理解成分句法分析中的Dynamic Oracle

定义10( 深入理解成分句法分析中的Dynamic Oracle): 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,定义最优树 深入理解成分句法分析中的Dynamic Oracle深入理解成分句法分析中的Dynamic Oracle 中的子树 深入理解成分句法分析中的Dynamic Oracle 并上当前状态可到达的类别集合,也就是
深入理解成分句法分析中的Dynamic Oracle
下面我们会证明, 深入理解成分句法分析中的Dynamic Oracle 的确是当前状态可以得到的得分最高的树。

深入理解成分句法分析中的Dynamic Oracle


上图形象的说明了几种树之间的关系。当前子树 深入理解成分句法分析中的Dynamic Oracle 与标准树 深入理解成分句法分析中的Dynamic Oracle 不一定完全重合,可能有预测错误的,所以是交叉的。那么接下来的预测如果全部预测为标准树中的 深入理解成分句法分析中的Dynamic Oracle ,那么得分一定是最高的。而剩余的白色部分就是与 深入理解成分句法分析中的Dynamic Oracle 的span产生交叉的类别,属于不可到达的。

引理2: 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,最优树 深入理解成分句法分析中的Dynamic Oracle 一定是 深入理解成分句法分析中的Dynamic Oracle 的派生树,也就是
深入理解成分句法分析中的Dynamic Oracle

定理1: 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,有
深入理解成分句法分析中的Dynamic Oracle

也就是说最优树 深入理解成分句法分析中的Dynamic Oracle 的得分一定是当前状态可以得到的最高分数。

证明也很简单,根据召回率和准确率公式,最优树 深入理解成分句法分析中的Dynamic Oracle 是在 深入理解成分句法分析中的Dynamic Oracle 的基础上加入了所有的标准树中的可到达类别 深入理解成分句法分析中的Dynamic Oracle ,所以召回率分子不会降下来,召回率不可能更高了;同时并没有加入任何不在标准树中的类别,所以准确率的分母也不可能减小,准确率也不会更高了。因此 深入理解成分句法分析中的Dynamic Oracle 就是当前状态可以得到的最优树。

推论1: 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,对任意 深入理解成分句法分析中的Dynamic Oracle ,都有
深入理解成分句法分析中的Dynamic Oracle
上面已经证明了 深入理解成分句法分析中的Dynamic Oracle 是最优树,所以自然其余的树得分都比它低了。

最后需要证明的一点就是,按照Dynamic Oracle策略进行转移,一定能到达这个最优树吗?

引理3: 对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,对任意动作 深入理解成分句法分析中的Dynamic Oracle ,都有
深入理解成分句法分析中的Dynamic Oracle
反之如果 深入理解成分句法分析中的Dynamic Oracle ,那么有
深入理解成分句法分析中的Dynamic Oracle
原文并没有给出证明,粗略理解的话,按照Dynamic Oracle策略,下面应该向着 深入理解成分句法分析中的Dynamic Oracle 这个类别靠近,而在这个过程中,包含在 深入理解成分句法分析中的Dynamic Oracle 内的 深入理解成分句法分析中的Dynamic Oracle 都会被sh动作识别,而其余不在标准树中的类别都会被识别为nolabel, 深入理解成分句法分析中的Dynamic Oracle 又是第一个 深入理解成分句法分析中的Dynamic Oracle ,所以所有的 深入理解成分句法分析中的Dynamic Oracle 都可以被识别,所以这是符合 深入理解成分句法分析中的Dynamic Oracle 定义的。

反之如果不按照Dynamic Oracle策略来转移,下一步产生的span一定会与 深入理解成分句法分析中的Dynamic Oracle 产生交叉,因此 深入理解成分句法分析中的Dynamic Oracle 再也无法被包括进最终的句法树中,所以第二点也成立。

最终综合引理3、定理1和推论1,得到了本文中最关键的结论:

定理2: 深入理解成分句法分析中的Dynamic Oracle 函数符合定义5中的oracle定义,即对于任意状态 深入理解成分句法分析中的Dynamic Oracle ,有
深入理解成分句法分析中的Dynamic Oracle

总结

至此关于Dynamic Oracle已经全部介绍完了,在黄亮老师的个人主页上面,还有这篇论文的会议视频和ppt,还有github源码,大家可以去深入学习:Liang Huang

当然,在具体实现中,由于在训练集上过早的拟合,单纯使用Dynamic Oracle并没有得到任何效果提升,所以要加入exploration机制,也就是人为的干预动作分类,使模型故意预测错误的动作,这样就能学习到更多的情况了,事实证明这样的确得到了略微提升。PTB上的结果如下:

深入理解成分句法分析中的Dynamic Oracle


最后提一个小疑问,关于引理1,原文说之后定理的证明会用到它,但我没看出来哪里用到了。而且我对它的正确性也有所怀疑,按照Dynamic Oracle转移之后, 深入理解成分句法分析中的Dynamic Oracle 不可能一直不变啊,按理说会先不变,再变少,交替变化,最后生成句法树后变为空集。并且原文中引理1符号也出现了一个小错误,我在这里修改正确了。

关于这一点疑问,我已经发邮件请教了原作者James Cross,他也已经回复我了,更深入的解答不久应该就会告诉我了,到时候我再更新一下。如果大家有想法的话,也可以提出来。