1. CRF理解的过程
1.1 判别式模型 和 生成式模型
判别式模型的核心就是设定一个边界,直接对输入判定结果。
生成式模型就是先构建数据的联合分布,然后预测不同输出的概率,选取概率最大的输出最为预测输出。
前者因为是确定边界,所以需要的训练数据量不需要太大。后者因为是要拟合训练集的分布,所以需要的数据量很大,才能拟合到真实的分布。
在hmm和crf的理解过程中,了解他们是什么样的模型非常重要,确定了是哪种类型的模型之后,就可以直接建模。关于crf为什么那么建模,是作者直接规定的;关于crf的直观图为什么那么画,是由公式决定的。
1.2 HMM
HMM的五个要素:
- 状态序列集合N
- 观测序列集合M
- 转移矩阵
- 观测矩阵
- 初始状态
为了进行预测首先会进行学习,学习的是联合概率分布,联合概率分布也就是转移矩阵,观测矩阵和初始状态的学习。学习过程使用极大似然估计,根据统计来估算矩阵里面的每一项。
然后就是进行预测,预测也是一种解码的过程,解码使用 维特比解码。
1.3 CRF
因为知道是判别式模型,所以直接建模,建模的公式是作者给出来的,不用做过多的纠结。
学习过程主要是学习每个特征函数的权重,这个学习需要使用梯度下降等方法。
序列预测问题也是使用维特比解码。
1) 关于CRF的疑问
为什么当前的状态序列只与前后的状态序列相关呢?为什么不扩大下范围,这样应该能获取更充分的信息。
比如我/O住/O在/O北/B京/I
这样一个句子,B不仅与我住在北京
有关,而且还与前一个O和后一个I有关,为什么不和前面的几个O都有关系呢?
最大熵思想:
- 如果先验知识中,不存在输入x,那么输出就是均匀分布。
- 先验知识中存在输入x,输出就是在输入x下面熵最大的分布。
最大熵模型是一个多分类模型。
维特比解码
维特比解码利用了DP的思想,会记录历史路径的最大概率和历史最优的路径,节省计算量。
[维特比通俗理解](图解Viterbi维特比算法 - Yuanche.Sh的文章 - 知乎
https://zhuanlan.zhihu.com/p/63087935)
crf++
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
# Bigram
B
T:%x[#,#]中的T表示模板类型,两个"#"分别表示相对的行偏移与列偏移。
一共有两种模板:
第一种是Unigram template:第一个字符是U,这是用于描述unigram feature的模板。每一行%x[#,#]生成一个CRFs中的点(state)函数: f(s, o), 其中s为t时刻的的标签(output),o为t时刻的上下文.如CRF++说明文件中的示例函数:
func1 = if (output = B and feature="U02:那") return 1 else return 0
它是由U02:%x[0,0]在输入文件的第一行生成的点函数.将输入文件的第一行"代入"到函数中,函数返回1,同时,如果输入文件的某一行在第1列也是“那”,并且它的output(第2列)同样也为B,那么这个函数在这一行也返回1。
第二种是Bigram template:第一个字符是B,每一行%x[#,#]生成一个CRFs中的边(Edge)函数:f(s', s, o), 其中s'为t – 1时刻的标签.也就是说,Bigram类型与Unigram大致机同,只是还要考虑到t – 1时刻的标签.如果只写一个B的话,默认生成f(s', s),这意味着前一个output token和current token将组合成bigram features。
疑问
在公式中,CRF会同时考虑当前标注 与 全量观测序列,前后标注序列的关系。但是在上面的配置模板中,我们只看到了与全量观测序列 和 前一个标注序列的关系?
我觉得是因为在进行维特比解码的时候,是顺序解码的,前面的状态序列无法预知后面的状态序列。
Bilstm CRF
- 直接使用Bilstm预测会出现什么情况?因为不具有CRF的约束,所以预测出来的结果可能是不合理的。比如O后面直接跟了I。
- Bilstm + CRF的损失函数具有两个数值相加:Emission score + transmission score。其中Emission score是由每一位置Bilstm层的输出的分值相加;transmission score是由预测序列的转移得分相加。
- transmission矩阵是随着crf的训练逐渐得到的,crf的计算过程还不太清楚。论文里面说,CRF的参数只有transmission矩阵,那么是不是crf层真的只是在做维特比计算。回头更详细地看下相关文档,再阅读下源码确认下。
- bilstm的输出不是直接怼给crf的,而是经过一层全连接,把它转换成了[batch_size, lenght, tag_num]维度的向量,原文写到,本来是要用softmax去预测,现在使用crf去解析了。
网友评论