训练
模型结构
下面的问题就是给出一个句子,如何学习出它的三元组 呢?
首先将每个单词的词向量和tag向量拼接作为输入,然后送入一个Bi-LSTM,得到隐含层输出为
对于每个单词,可能存在一元结点,也可能不存在,不存在的话就标记为 ,用一个前馈神经网络和softmax预测每个单词的一元结点:
为了得到每个split的表示,对两两相邻单词进行卷积:
注意输出比输入少一个,因为split数量比单词少一个。
然后再将输出通过一层Bi-LSTM,得到最终的split表示:
当然这里也可以选择采用self-attention,详见我的上一篇博客。
最后将输出通过一个两层前馈神经网络,得到每个split的句法距离值:
每个内结点的label同样用一个前馈神经网络和softmax预测:
损失函数
对于训练样例 ,它的损失函数就是 d 和 c 的损失函数之和。
对于 c ,因为用的是softmax预测的,所以直接用交叉熵即可得到损失 。
对于 d ,可以用均方误差:
然而我们并不在意句法距离的绝对值大小,我们只要它的相对大小是正确的即可,所以均方误差在这里不是很合适,可以换成如下损失函数:
最后总的损失函数为:
下面这张图形象的说明了模型的结构,由下往上,第一层圆圈是单词之间的LSTM,然后每个单词上面的五边形是前馈神经网络用来预测一元label,两个相邻单词之间的三角形是卷积,卷积得到的结果再通过一个LSTM得到split表示,最后每个split上面有两个五边形,一个是前馈神经网络用来预测label,另一个是前馈神经网络用来预测句法距离。
实验
在PTB数据集上的实验结果如下:
可以看出,结果还是很有竞争力的,虽然有很多比本文高的模型,但本文解释了,那是因为他们用了Char-LSTM,用了外部数据,用了半监督方法或者重排序方法。。。目前单模型最高的方法依然是上一篇博客讲的span-based模型。
最后值得一提的是模型的运行速度,之前理论分析时间复杂度非常低,而实际上运行速度的确快了许多,结果如下:
总结
本文最大的创新点就是应用句法距离进行句法分析,并且时间复杂度很低。至于文章题目为什么叫“Straight to the Tree”,文章最后说因为只通过一个最普通的LSTM和卷积就预测出了句法树,所以是很直接的。。。
本文的模型还比较粗糙,我觉得仍然有许多改进之处:
- 可以将LSTM替换为self-attention,因为之前博客讲到了,伯克利的self-attention编码器比LSTM编码器准确率高了1个多的百分点。
- 可以尝试最近新出的词向量模型ELMo,也许会有特别大的提升。
- 加入词级别的Char-LSTM,可能会有一定提升。
- 我觉得split的表示可以更加复杂化一点,而不仅仅是一层卷积+一层LSTM这么简单。