Bi-LSTM+CRF理解

学习资料:
[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(包括特殊标记).

对于一个样本而言,全连接层的输出 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^)=iyilogy^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^ii

而真实 tag 序列的概率为(图来自资料[3]):
Bi-LSTM+CRF理解_第1张图片也就是只需要算出 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]):

Bi-LSTM+CRF理解_第2张图片

具体的例子可以见资料 [2] [3]

预测阶段

预测阶段也使用动态规划,也称为维特比算法,只不过这种情况下只需要求解非规范概率的最大值对应的序列即可。具体见李航的统计机器学习 11.5 节或者参考资料[4]。下面是资料[4]中对维特比算法求解最佳路径的DP矩阵解释图:

在这里插入图片描述

你可能感兴趣的:(Interview,NLP)