在用LSTM+CRF做命名实体识别任务时,由于pytorch框架的crf需要自己实现,网上的很多教程都跳过了一些关键部分导致自己难以理解。本文用来记录自己的相关理解,仅针对线性链式的CRF。欢迎指正。
1. log linear model
CRF、MEMM、N元逻辑回归都属于log linear model。我们先来理解这个大类。
p(y∣x;w∣J∣)=∑y′∈Yexp(w∣J∣⋅F∣J∣(x,y′))exp(w∣J∣⋅F∣J∣(x,y))
其中
w为模型参数,
F∣J∣(x,y)为给定输入特征
x,输出标签
y的特征向量。
注意:这里模型参数和特征向量都为J, 物理意义是该模型一共有J个特征。点乘表示用这J个特征计算一个分数。与NLP任务中输入序列长度无关!
1.2 逻辑回归
各种log linear model模型的区别,仅仅是在特征函数
F∣J∣(x,y)的定义不同。对于逻辑回归,假设特征x长度为M, 标签类别数为N, 那么
J=M∗N。且
Fj=flaten(x×Iy=C)
1.1 CRF与逻辑回归的区别
CRF与逻辑回归的不同,在于
- (1)CRF的特征函数
F∣J∣(x,y)考虑了输入数据中的时序信息
F∣J∣(x,y)=i=2∑Tf∣J∣(xi,yi,yi−1)(1.1)
- (2)CRF的y与x都增加了一个维度,即序列长度T
2. NER中的LSTM+CRF
2.1 CRF的特征定义
对于NER任务中,序列长度为T,tag类别数为C的数据,LSTM的输出特征矩阵
BT×C作为CRF层的输入,
Bi,j为第
i个时间步为标签
j的概率。NER任务的CRF中我们定义了两个特征函数:
- 输入特征B (代码中的feats, 可以理解为发射概率矩阵)
- 和转移特征A (代码中的transition矩阵)
权重
w=[1,1]现在重写CRF的特征如下,并将其定义为score:
score(y∣A,B)=w∣J∣⋅F∣J∣(x,y))=w⋅i=2∑Tf∣J∣(xi,yi,yi−1)=i=2∑TBi,yi+i=2∑TAyi−1,yi
理解了这两个特征,就成功的将CRF于NER任务结合了。下面要知道如何估计特征参数,即反向传播A和B。
2.2 参数估计
对于一个训练样本,有一个输入序列x和一个tag序列y。x经过LSTM层得到特征矩阵B。
我们的目标是求现有参数下的概率
p(y∣A,B),并最大化这个值,按照老规矩使用其负对数作为loss, 回到log-linear model的定义,:
loss=−log(p(y∣A,B))=−log(∑y^exp(score(y^∣A,B))exp(score(y∣A,B)))=log(y^∑exp(score(y^∣A,B)))−score(y∣A,B)
一旦loss确定,剩下的事就可以交给pytorch框架来自动优化了。但是上面这个loss怎么计算呢?
score(y∣A,B)这一项好说,线性复杂度O(T)。
2.3 全局正则项的计算优化
Z=log(∑y^exp(score(y^∣A,B)))这一项,如果用暴力计算,就是要先算出每一个时间步的所有可能路径,复杂度为
O(CT), 分类数稍多一点就会凉。需要想办法消掉指数复杂度。这个强烈推荐参考文献4。
参考文献
- Pytorch Bi-LSTM + CRF 代码详解
- Bi-LSTM-CRF for Sequence Labeling
- Bi-LSTM Conditional Random Field Discussion
- 系列文章:CRF Layer on the Top of BiLSTM - 5