《Stanford's Graph-based Neural Dependency Parser at the CoNLL 2017 Shared Task》

Stanford的CoNLL 2017参赛系统研究,文章见 《Stanford’s Graph-based Neural Dependency Parser at the CoNLL 2017 Shared Task》。该系统来自他们ICLR 2017的文章 《DEEP BIAFFINE ATTENTION FOR NEURAL DEPENDENCY PARSING》,其中删掉了对预测弧标签部分网络结构的具体介绍,可以在Review的版本中找到(虽然有很多错误)。

Deep Biaffine Parser

他们的网络结构灵感来源于第一篇 neural graph-based parser的工作《Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations》(主要是用BiLSTM代替传统graph-based parser中的score function,对于一个n个词的句子,用MLP算出所有\(n^2\)条可能的弧的分数,然后用dp算法找出最大生成树(MST))。

Parser结构

如图所示,一句话中所有词的Embedding(来自词和词性)作为BiLSTM(多层)的输入,每个词对应的输出通过4个不同的ReLU层,得到4种特殊的向量表示(左侧最上层):

  • 该词作为dependent(子节点)寻找head(父节点)
  • 该词作为head寻找其所有的dependents
  • 该词作为dependent决定其label(弧标签)
  • 该词作为head决定其所有dependents的label

这些向量将在两个biaffine分类器中分别用于计算所有可能弧的分数以及计算给定词对的弧标签。

接下来给出正式定义

给定n个词的句子,每个词的表示向量为:

$$ \textbf{x}_i = \textbf{v}_i^{(word)} \oplus \textbf{v}_i^{(tag)} $$

将它们输入BiLSTM后获得每个词的输出向量:

$$ \textbf{r}_i = BiLSTM(\textbf{r}_0, (\textbf{x}_1,\dots,\textbf{x}_n))_i $$
$$ \textbf{h}_i, \textbf{c}_i = split(\textbf{r}_i) $$

然后通过4个独立的MLP获得上述4种向量表示:

$$ \textbf{h}_i^{(arc-dep)} = MLP^{(arc-dep)}(\textbf{h}_i) $$
$$ \textbf{h}_i^{(arc-head)} = MLP^{(arc-head)}(\textbf{h}_i) $$
$$ \textbf{h}_i^{(rel-dep)} = MLP^{(rel-dep)}(\textbf{h}_i) $$
$$ \textbf{h}_i^{(rel-head)} = MLP^{(rel-head)}(\textbf{h}_i) $$

预测弧

这里的intuition是用MLP将两个方向的LSTM输出先组合起来,再进行利用,而以前的工作都是直接将两个方向的输出拼接起来,这样其实还是相当于分别使用两个方向的输出向量。此外,这种处理也能起到降维的作用。(这部分感觉Review的版本讲的清楚一些)

对于第i个词,其它所有词作为其head的分数为:

$$ \textbf{s}_i^{(arc)} = H^{(arc-head)}W^{(arc)}\textbf{h}_i^{(arc-dep)} + H^{(arc-head)}\textbf{b}^{\top(arc)} $$
$$ y_i^{(arc)} = \text{arg} \max_j s_j ^{(arc)} $$

这样就能得到最可能作为第i个词的head的词 \( y_i^{(arc)} \)。

假设前面4个向量长度均为\(h\)。这里\( H^{(arc-head)} \)维度为\( n \times h \),参数矩阵 \( W^{(arc)} \)维度为\( h \times h \),偏置参数向量 \( \textbf{b}^{\top(arc)} \)维度为\( h \times 1 \)。因此得到评分向量\( \textbf{s}_i^{(arc)} \)维度为\( n \times 1 \)。

上式中的第一项计算的是给定arc-head和arc-dep这两个向量中信息的情况下,词j作为词i的head的概率(例如在知道词i是“the”,词j是”cat”的情况下j是i的head的概率);第二项计算的是在只知道arc-head的信息的情况下,词j作为词i的head的概率(例如在知道词j是“the”的情况下j是i的head的概率,根据语言学知识我们知道,无论i是什么词,”the”作为其head的概率都很低)。

预测标签

在决定了词i的head之后,使用另一个网络预测这条弧的label(下式中\(\textbf{h}y^{(rel-head)}\)其实是\(\textbf{h}{y_i}^{(rel-head)}\),后者打不出来所以简略…)

$$ \textbf{s}_i^{(rel)} = \textbf{h}_y^{\top(rel-head)}\textbf{U}^{(rel)}\textbf{h}_i^{(rel-dep)} + W^{(rel)} ( \textbf{h}_i^{(rel-dep)} \oplus \textbf{h}_y^{(rel-head)} ) + \textbf{b}^{(rel)} $$
$$ y_i^{(rel)} = \text{arg} \max_j s_j^{(rel)} $$

假设\(r\)是label的种类。这里\(\textbf{h}_y^{(rel-head)}\)和\(\textbf{h}_y^{(rel-dep)}\)维度为\( h \times 1 \),\(\textbf{U}^{(rel)}\)是一个参数tensor,维度为\( h \times r \times h \),参数矩阵\(W^{(rel)}\)维度为\(r \times 2h \)。因此得到对应所有label的评分向量\(\textbf{s}_i^{(rel)}\)维度为\( r \times 1 \)。

类似的,上式中第一项计算的是在head和dependent都给定的情况下每种label的概率(例如已知词i是“the”,其head是“cat”时label为“det”的概率);第二项计算的是给定head和dependent其中一个的情况下每种label的概率(例如已知词i是“the”,或者已知词j是“cat”时label为“det”的概率)。

训练时,以上述两个分类器的softmax交叉熵损失作为优化目标。在测试时,通过为每个可能的根迭代地解决环问题生成一棵符合约束的树,然后选择其中总分最高的。这里的描述看起来像Chu-Liu/Edmonds算法,但是注释里又写了“Although in the future we intend to implement than the Chu-Liu/Edmonds algorithm for nonprojective MST parsing”,所以不知道他们解码的时候到底是用的什么算法,具体还得看源码

Character-Level Model

在词的表示上,他们首先用了官方提供的用word2vec预训练的embedding(由于Gothic没有提供,他们用了Facebook提供的FastText训练的词向量),以及高频词的holistic word embedding(这个不太清楚什么意思,估计应该是训练过程中更新的词向量)。此外,还用了基于单向LSTM的字级别模型,也就是每个字有一个可训练的向量,将一个词中的所有字按序输入LSTM。

一般对于这种character-level LSTM会使用最后一个隐层的输出作为整个词的表示。除此之外,也可以利用attension先计算出每个隐层的权,然后用所有隐层输出的加权和还表示该词。这里他们综合了两种方法,将两种方法的结果拼接起来表示这个词。

接下来给出正式定义

对于有n个字的词,首先将每个字的向量按顺序输入LSTM:

$$ \textbf{r}_i = LSTM(\textbf{r}_0, (\textbf{v}_1^{(char)},\dots,\textbf{v}_n^{(char)})_i $$

$$ \textbf{h}_i, \textbf{c}_i = split(\textbf{r}_i) $$

接着在隐层输出堆叠矩阵\( H \)上计算linear attention,将得到的加权和与最终层的cell state拼接得到词的表示:

$$ \textbf{a} = \text{softmax}(H\textbf{w}^{(attn)}) $$
$$ \textbf{h} = H^\top \textbf{a} $$
$$ \textbf{v} = W(\textbf{h} \oplus \textbf{c}_n) $$

这里有点奇怪的是他拼接的是final cell state(\(\textbf{c}_n\))而不是final hidden state(\(\textbf{h}_n\))。

接下来,把刚刚得到的\(\textbf{v}\)和预训练的词向量以及holistic word embedding求elementwise sum。另一边,对UPOS和XPOS的embedding同样做elementwise sum。最后这两个向量 拼接(concatenate) 起来就是一个词的最终向量表示。

POS Tagger

除了parser之外,他们还用这套框架写了一个POS tagger。简单来说就是将一句话中的词按顺序输入一个BiLSTM,然后在每个词处用一个ReLU层生成对应所有tag的分数向量。

首先将词序列输入BiLSTM:

$$ \textbf{r}_i = BiLSTM(\textbf{r}_0,(\textbf{v}_1^{(word)},\dots,\textbf{v}_n^{(word)})_i $$
$$ \textbf{h}_i, \textbf{c}_i = split(\textbf{r}_i) $$

然后通过一个MLP计算出分数向量:

$$ \textbf{h}_i^{(pos)} = MLP^{(pos)}(\textbf{h}_i) $$
$$ \textbf{s}_i^{(pos)} = W\textbf{h}_i^{(pos)}+\textbf{b}^{(pos)} $$

训练过程中采用交叉熵损失之和作为优化目标,tagger与parser是分开训练的。

其他

在实验部分还做了关于非投射性(nonprojectivity)的测试。具体实验这里就不列了,说一下他们得出的结果:

  • graph-based和transition-based方法的差距随着非投射情况的增加而变大(p<0.001,graph-based一直要高)。
  • 当训练集的非投射弧占比远小于测试集时,graph-based方法表现相对较好,当训练集中也存在大量非投射弧时,两种方法的性能变得相近。这一结论暗示了graph-based方法在非投射弧的学习和泛化能力上比transition-based方法优秀。

当然实验中的transition-based方法选用的是UDPipe的baseline系统,他们自己也说了,以上结论要建立在UDPipe的系统能代表大多数利用了swap动作的transition-based系统的基础上。