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