一、问题描述
这是一篇使用神经网络来做依存句法分析的经典文章,传统的依存句法分析特征向量稀疏,特征向量泛化能力差,特征计算消耗大,用神经网络做transition-based贪心模型可以缓解上述问题,准确率提高,速度变快。由于源代码是java写的,所以本人看了用tensorflow改写的代码,但是该代码存在一些问题,只预测是LEFT-ARC,RIGHT-ARC,SHIFT中的一种(即三分类),但没有预测ARC是哪种依赖关系(label),也就是只预测unlabeled attachment scores(UAS),不能预测labeled attachment scores(LAS),但是有助于特征处理以及整个模型过程的理解,看不懂论文和博客的建议看一下代码。
二、transition-based dependency parser
首先每一个决策过程都是基于当前的状态(configuration)做的决策(transition),做好transition后更新configuration进入下一步决策过程中,做决策时采用贪心算法哦,就是每一步都选择当前认为最好的transition就行,这样只损失了一丢丢准确率,换来了速度的大幅度提升。
configuration:,是一个栈(stack),为缓存队列(buffer),为当前已经画好的依赖弧线集合(dependency arcs),假设一个句子为,为句子中的单词哦,初始configuration为,,,如果一个configuration的buffer是空的,且,则这是最后一个configuration,即终点状态哦,即结束整个决策过程了哦。
transition:有三种,LEFT-ARC,RIGHT-ARC,SHIFT。下面详细介绍,先用代表stack的第几个top元素(注意栈的先进后出哦,是按出的顺序算第几个的),用对应buffer中的第几个元素(队列先进先出,是按出的顺序算第几个的),则
:当stack中元素个数大于等于2时,添加一个dependency arc为,且该arc对应的依赖关系(label)为,然后将从stack中移除。
:当stack中元素个数大于等于2时,添加一个dependency arc为,且该arc对应的依赖关系为,然后将从stack中移除。
:当buffer中元素个数大于等于1时,将从buffer中移除,添加到stack中。
代表依赖关系总共的种类数,那么在一个configuration对应的transition有种,也就是说每一步决策都是一个分类问题。将上述过程对应一下下图一看就明白了。
三、将上述过程用神经网络表示
神经网络为三层,输入层,隐藏层,softmax输出层
输入层:当然是从configuration中提取的特征啦,将单词、词性、已产生的arc label三种输入的embedding cancat起来,那么这三种输入分别为什么呢?
单词:,,,,,,,,,,,,,,,,,。
共18个特征哦,其中代表对应的单词,代表left-most children,代表right-most children,比如上上图中,has的left-most children就是所有从has画起的箭头指向的单词中在has左边且最靠左的(在句子中最靠开头的),has的right-most children就是所有从has画起的箭头指向的单词中在has右边且最靠右的(在句子中最靠开头的),he是has的left-most children, (末尾的句号)是has的right-most children。
词性:,,,,,,,,,,,,,,,,,。共18个特征哦,其中代表对应的词性。
arc label:,,,,,,,,,,,。共12个特征哦,其中代表对应的依赖关系。
输入层到隐层为全连接,在隐层后面加全连接和softmax,输出属于中某一种的概率。
四、trick
1. 隐层的激活函数不用relu,而用立方函数,主要是立方函数刚好拟合上述48中特征的各种组合,非常像人工设计的那种。你看下面的公式一下就能明白。
2.提前计算好高频率单词的embedding和权重矩阵相乘,这样后面需要计算的时候只需要去里面找,减少重复计算,节约时间。
3.目标函数加入了正则化项。
五、和传统方法相比
上面可知神经网络为48个特征,因为神经网络是非线性,包括立方函数都能帮助提取各个特征直接的隐含联系,比如是否共同出现这种。但是传统的方法只能人工将这48个特征各种组合,表示一起出现的情况,那样就会出现成千上百种组合,即成千上百种特征,但是每个句子可能只出现了一两种,这样特征向量(0101那种向量)就会非常稀疏。而且统计起来也很耗时,关键是人工设计的特征容易漏掉一些信息,换一种场景,特征就得重新设计,泛化能力差。
六、实验结果
验证用了三种数据,英文的有两种CoNLL dependencies和Stanford dependencies,中文的有CTB。
精度判读:
unlabeled attachment scores(UAS):只预测是LEFT-ARC,RIGHT-ARC,SHIFT中的一种(即三分类)
labeled attachment scores(LAS):还有预测是那种依赖关系,即分类。
1. 准确率和速度基本都最好
2. 立方函数效果最好
3. 使用预训练的词向量初始化比随机初始化词向量效果好
4.词性和已有依赖关系作为输入是有用的,但是若已经有词性,再加入已有依赖关系则效果甚微,因为词性已经捕捉了依赖关系信息。
5. 将隐层的每一个神经元作为一个特征(feature),分别看这个神经元与输入(word,pos,label)的权重矩阵大于0.2的部分,看图中多数分布在pos,说明pos特征很重要。这个方法可以帮我们看出什么特征更重要,比传统方法好。