介绍
这篇是新鲜出炉的NAACL19的关于无监督循环神经网络文法(URNNG)的论文,在语言模型和无监督成分句法分析上都取得了非常不错的结果,主要采用了变分推理和RNNG。本文公式量较大,因此我也推了好久,算法也挺多的,首先上一张我推导的公式笔记:
我这篇博客就不按照论文的顺序来讲了,就按照我上面这张笔记讲一讲我的理解吧,很多细节可能会忽略,请参见原文吧。
首先对于无监督成分句法分析,常规做法就是学习一个生成模型 ,就比如RNNG就是一个生成模型,但是缺少句法树 z 的监督信号怎么办呢?现在给你的输入只有句子 x ,那么只能用语言模型 来做监督了。习惯上我们喜欢取对数,也就是:
这里就存在几个问题,比如 z 的状态空间太大了,不可能穷举所有的,所以接下来按步骤讲解如何求解。
URNNG模型
先上一张模型图,让大家对整体模型有个大概的认知:
左边是一个推理网络(Inference Network),用来根据输入 x 推理出隐变量也就是句法树 z 的概率分布 。右边是一个生成模型(Generative Model),用来计算从推理网络中采样出来的句法树 z 的联合概率 ,最后根据上面语言模型算出句子的概率,最大化这个概率即可。
接下来分别讲解这两个部分和具体的优化方法。
Inference Network
首先将词向量 和位置向量 拼接,作为推理网络LSTM的输入:
然后算出span 的得分,计算方式和以往一样,用BiLSTM前后向输出做差,然后通过一个前馈神经网络得到分数:
接下来就需要计算句法树的概率分布了,这里不直接计算句法树 z ,而是计算它的邻接矩阵 B 的概率分布,这个邻接矩阵意思就是如果span 存在,那么 ,否则的话 。然后就可以用CRF计算出邻接矩阵 B 对应的概率:
其中 是配分函数,也就是用来将概率归约到0到1之间的:
注意这里的 并不是所有的01矩阵集合,而是必须满足能产生合法句法树的矩阵,而这情况也很多,不能穷举求解,在这里采用经典的inside算法来求解这个配分函数:
不过我觉得这里是错的!就是这里的两处 应该改成 。不过具体代码实现的时候并没有这么做,初始值一样都是 ,但是递推的时候采用了如下式子:
其实就是用 来取代 了,化简后就是代码实现这个式子,应该是为了防止数值溢出。
然后就是采样了,推理网络目的就是计算出句法树的概率分布,然后根据这个分布采样出若干个句法树,那么现在给定一棵句法树可以根据上面的算法计算出它的概率了,那怎么采样呢?其实还是可以通过刚刚计算得出的 数组来采样,采样算法如下:
其实就是自顶向下的根据概率分布来采样每个span的split,用一个队列来保存所有还没有采样出split的span,然后把所有采样出的span在邻接矩阵中的对应值标为1。
最后推理网络采样出了若干个句法树 z ,然后根据CRF计算出每个句法树的概率 ,后面的事情就交给生成网络了。