介绍
一般来说,自然语言是由词汇和句法组成的,但是标准的语言模型一般都只用RNN对词汇进行建模,句法信息都是隐式的学习到的,没有办法显式地拿出来使用。所以本文提出的语言模型的变体可以结合结构上的attention,在中间过程中学习到结构信息,然后这层结构信息可以拿来生成句法树,用来做无监督的句法分析。
那么为什么要做无监督的句法分析呢?主要原因还是一些小语种标注语料太少了甚至没有,不能用监督句法分析来做。而且无监督句法分析学到的信息还可以用来增强语言模型或者更为下游的任务的性能,使它们能更好的融合句法结构信息。
本文提出的模型(PRPN)主要有如下三个组成部分:
- 可微分的Parsing Network 主要用来学习句子的句法距离(syntactic distance),这个在之前的博客中有讲到,是同一个组做的工作,链接:Straight to the Tree:Constituency Parsing with Neural Syntactic Distance 然后产生出门函数(gate function),也就是句子中每个词的权重,这样跑RNN的时候就没有必要考虑之前的所有信息了,只需要考虑句法距离最近的,也就是同一个短语中的信息。这里可微分后面会详细讲到,也就是不能直接预测离散的序列,不然梯度没办法反向传播,所以预测的是一个分布。
- Reading Network。这个部分就和普通的RNN差不多,区别就是利用了上面的attention,然后每个时刻的输入不仅仅是上一个时刻的隐含层状态,还包括了历史所有相关的隐含层状态。
- Predict Network。最后预测下一个词也不是直接采用当前时刻的隐含层输出,而是采用所有attention后的历史隐含层信息。
最后模型训练好之后,用Parsing Network学习到的句法距离就可以产生出无监督的句法树,当然这里只能产生unlabeled的句法树,也就是说,无监督的成分句法分析都是只评测unlabeled F1值,因为nonterminal信息实在是无法无监督的预测出来,除非结合外部标注器或者人工制定规则?
由于我觉得这篇论文写作有点粗糙,很多地方写的很乱,甚至还有公式变量和图片不对应,所以下面的公式我有些自行修改过了,如果觉得有疑问的,可以参考原文,并且告诉我。
动机
下图是一个输入句子及其对应的句法树示例:
其中实线表示成分句法树的结构,而虚线表示同一棵子树的若干个子结点之间的联系。我们用 表示输入句子,用 yi 表示句法树中的某一个结点,用 r 表示根结点。定义 yi 所表示的短语范围是 ,例如在上图中 y1 表示的范围是 (2,6) ,所以有 和 。
下图是模型的Reading Network和Predict Network大致框架:
其中实线表示Reading Network中RNN每个时刻的输入依赖于之前的哪些时刻,虚线表示Predict Network中预测下一个词时需要考虑哪些时刻的隐含层输出(这里有个小错误,图中最上面一行函数参数从 m3 开始,但实际上虚线表明应该从 m2 开始)。
首先是Parsing Network。这种和之前状态的连接在这里被叫做“跨越连接”(skip connection),而具体和哪些状态连接,就要用到门 ,表示当前处在 t 时刻,和之前的第 i 时刻有没有关联,有就是1,没有就是0。在这里先定义变量 为 和之前最远到哪个位置的单词有关联,分成两种情况:如果 xt 不是某个子树最左边的叶子结点,那么 就定义为它的父结点的最左边那个叶子结点,也就是 最左边那个兄弟结点。比如上图中的 ,因为它在子树中位于中间,所以 ,也就是说它最远和 x3 有一定关联,而再往前的单词由于不在同一个短语里,关联就不大了。如果 xt 是某一个子树 yi 最左边的子结点,那么 就定义为 yi 最左边那个兄弟结点的最左边的叶子结点。比如上图中 ,因为 x3 是 y3 的最左边的子结点,而 y2 是 y3 最左边的兄弟结点, x2 又是 y2 最左边的叶子结点,也就是说 x3 最远和之前的 y2 有关联,它们共同组成了更大的短语 y1 。(这里定义又不是很严谨,例如对于上面那个例子, x2 既是 y1 又是 的最左子结点,这种情况下不能按照 y2 来计算,因为它没有最左的兄弟结点!所以按照 y2 来算的话得到。)
根据这个 就可以将 定义为:
但是因为这是离散的决策,没法传递梯度,所以之后会介绍用概率来替代这里的0和1。
然后是Reading Network。得到了gates之后,就可以修改RNN,用下面公式计算 t 时刻的隐含层状态:
具体是怎么使用这个gates的,后面再具体介绍,反正只要知道多考虑了很多个历史状态就行了,每个状态都有一个权重,表示考虑了多少。
最后就是Predict Network,用来预测下一个单词 ,用到的是历史多个隐含层状态信息:
这里后面也会具体讲到。