Bi-LSTM+CRF理解
学习资料:
[1] 基于BiLSTM-CRF模型的序列标注(Tensorflow)
[2] 最通俗易懂的BiLSTM-CRF模型中的CRF层介绍
[3] CRF Layer on the Top of BiLSTM - 5 资料[2]的原系列文章的一篇
[4] HMM与CRF笔记
总的理解
如果分别学习过Bi-LSTM和CRF的原理,只需要看下面这段话即可理解他们是如何结合的:
1、Bi-LSTM 层充当的是原始 CRF 中的状态特征函数
将长为 的句子序列通过Bi-LSTM,接上一层全连接层,该全连接层的神经元个数为所有tag的种类数 (包括特殊标记<start>和<end>).
对于一个样本而言,全连接层的输出 logits 就是 的矩阵,可以当作对每个位置(时间步)的每个词性的评分。这些评分加下来用于 CRF 层的计算。
2、CRF 层需要训练的参数是转移矩阵,而且是和 Bi-LSTM 中的参数一起训练的
3、训练阶段使用交叉熵损失,但并不需要算出所有可能序列的概率
利用极大似然估计即可推导出交叉熵损失,但为了得到 Loss 进行前向计算时,并不需要算出所有可能序列的概率(共有 个可能序列),而只需要算出真实 tag 序列的概率。理由见“训练阶段”一节。
4、预测阶段使用维特比算法
这一点和传统 CRF 是一样的
注:几个参考资料都没有提到特征函数的权重,我怀疑是直接设为 1 的,以后看过别人实现的源代码再来补充这点。
训练阶段
资料 [1] 对BiLSTM的那部分解释比较清楚,但是讲到CRF层出错了。就像资料 [2,3] 所说,我们需要计算的是的真实tag序列的概率。
注:只需要计算真实 tag 序列的概率是因为,交叉熵损失的计算实际上只需要对其概率 取负对数,其他非真实 tag 序列的概率在交叉熵损失公式中都是 0. 交叉熵损失的公式如下:
而 是一个 one-hot 向量,意味着只有真实 tag 序列对应的位置 ,才有,其他非真实 tag 序列对应的 都是 ,从而:
而真实 tag 序列的概率为(图来自资料[3]):也就是只需要算出 的分母 .
而这一项可以通过动态规划来计算(此图来自资料[1]):
具体的例子可以见资料 [2] [3]
预测阶段
预测阶段也使用动态规划,也称为维特比算法,只不过这种情况下只需要求解非规范概率的最大值对应的序列即可。具体见李航的统计机器学习 11.5 节或者参考资料[4]。下面是资料[4]中对维特比算法求解最佳路径的DP矩阵解释图: