CRF的learning问题
如通常的分类问题,x属于分类y的概率模型为:
名词解释
术语 | 含义 |
---|---|
样本特征,可以包括文本序列、词性序列、实体指示词序列等,如果是LSTM+CRF,则x是embedding序列 | |
样本label,是一个长度与输入文本相同的序列 | |
在位置t上的label | |
样本(y,x)在特征模板k上的取值 |
对数似然函数为:
损失函数为在样本集上的对数似然的负数:
求解等式右侧 的值需要穷举所有的路径,是指数复杂度的,是不可解的。那怎么办?这里列举两个思路(对应2个序列标注模型)。
退而求其次,不在整体上拟合全序列label,而是在每个局部位置上拟合状态转移概率,将学习到的概率转移矩阵放到隐马尔可夫模型的框架中,计算全序列概率。这就是MEMM(Maximum Entropy Markov Model)方法,相比于隐马模型,其概率转移矩阵是与x相关的(用最大熵模型求解的),其表达能力有了很大的提升,但其仍然是一个Markov Model,状态转移概率归一化是在每一步独立进行的,而不是在全局上进行的,导致一个重大的缺陷即“Label Bias Problem”。
如果可以把打分函数
拆解为局部特征(unigramt特征
和bigram特征
)的加权和,这时候
是可解的(这个设定,和
这个设定是等价的。而
这个设定,又和概率图模型
满足马尔可夫性即
是等价的。有兴趣的可以自己推导一下)。这就是CRF方法。
以下讨论CRF方法对特征权重的求解方法。
定义 是样本
在特征模板K上的取值,
是特征
的权重:
注:等式右边,第一部分是特征在样本中的计数,也就是特征在经验分布中的期望。(the data feature counts)
第二部分是特征在model分布中的期望(the model expectet feature counts)
问题的关键,是第二部分的求解。
为简化问题,对上式,去掉外层的求和,即对单个样本进行求解:
Forword-Backword算法
记
则:
定义前向向量和后向向量:
则有:
全路径概率总和:
求解unigram特征权重时需要的:
求解bigram特征权重时需要的:
预测问题
转化为最大路径求解的问题,计算好矩阵后,用verterbi算法求解即可。
工程实践
传统方法,比如基于CRF++,基于特征模板:参考用CRF做命名实体识别(三)
特征 | F1值 | 精度 | 召回率 |
---|---|---|---|
字 | 0.8399 | 0.8472 | 0.8327 |
字+词性+边界 | 0.8711 | 0.8839 | 0.8589 |
字+词性+边界+实体指示词 | 0.8856 | 0.9076 | 0.8649 |
字+词性+边界+特征词 | 0.8847 | 0.8990 | 0.8709 |
字+词性+边界+实体指示词 +特征词 | 0.8853 | 0.8994 | 0.8718 |
字+词性+边界+常用词 | 0.928 | 0.9382 | 0.9182 |
字+词性+边界+特征词+常用词 | 0.9293 | 0.9381 | 0.9207 |
字+词性+边界+实体指示词+特征词+常用词 | 0.9261 | 0.9334 | 0.9191 |
现在都不会这么做,一般是依靠LSTM,bert来做特征的提取,比人工精心设计的特征模板会强很多。但是只要是序列标注问题,损失还得靠CRF搞定,都会接一个CRF层。
参考
条件随机场(Conditional Random Field)简介 - Carl-Xie
https://blog.csdn.net/aws3217150/article/details/68935789
CRF++源码解读 - Carl-Xie
https://blog.csdn.net/aws3217150/article/details/69212445
LSTM+CRF
https://github.com/pytorch/tutorials/blob/master/beginner_source/nlp/advanced_tutorial.py
github
推荐一下我的开源项目 exFM c++ deepFM