CRF:Conditional Random Fields 条件随机场
统计机器学习所有的模型(个别instant model和优化算法以及其他的特种工程知识点除外)的工作流程都是如此:
a.训练模型参数,得到由参数唯一确定的模型
b.预测给定的测试数据。
概述
CRF 条件随机场是给定一组输入随机变量条件下,另一组输出随机变量的 条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。线性链条件随机场属于由输入序列对输出序列预测的判别模型,形式为对数线性模型,其学习方法通常是极大似然估计或正则化的极大似然估计。
词性标注
记录 crf 之前先从词性标注任务说起,词性标注任务,词性标注就是给定一个序列,比如一句中文序列,分词之后,为每一个词打上其输入哪一种词性的标签,比如这句话:我 喜欢 在 学校 吃 苹果,注明词性之后得到的是:我/n 喜欢/v 在/pre 学校/pl 吃/v 苹果/n
可以看到词性标注任务属于给定一个输入序列,然后对输出序列进行预测的线性链条件随机场。这时,在条件概率中,是输出变量,表示标记序列,是输入变量,表示需要标注的观测序列。
学习时,利用训练数据集通过极大似然估计或正则化的极大似然估计得到条件概率模型;预测时,对于给定的输入序列,求出条件概率最大的输出序列。
现在就看看 如何用 crf 模型 来处理词性标注问题
特征函数
- 每一种语言都遵循一定的句法结构,比如通常 名词后面会跟一个动词,动词后面再跟一个名词,等等类似这样的句法约定,我们把序列标注中,合理的句法约定看做一个 特征函数,比如:名词+动词;动词+名词,动词+动词...
- 所有的这些约定,但是:动词+动词,一般在一句话里是不合法的,这样的错误组合也全部考虑进特征函数集合中,然后用这个定义的特征函数集合去给 输入序列 进行打分,当序列中两个 词是:名词+动词的组合,那么根据特征函数中的预先定义的,这是一个合法的句法特征,那么为当前的这个序列 加分,如果序列中出现了:动词+动词 的不合法句法特征,则相应为当前序列标注减分。
- 最后,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。
概率定义
特征函数的参数如下:
- 句子 s(就是我们要标注词性的句子)
- i ,用来表示句子 s 中第 i 个单词
- l_i ,表示要评分的标注序列给第 i 个单词标注的词性
- l_i-1 ,表示要评分的标注序列给第 i-1 个单词标注的词性
特征函数输出值为 0 或 1,0 表示要评分的标注序列不符合这个特征,1 表示要评分的标注序列符合这个特征。
定义好一组特征函数后,我们要给每个特征函数 f_j 赋予一个权重 λ_j 。现在,只要有一个句子 s,有一个标注序列 l,我们就可以利用前面定义的特征函数集来对 l 评分。
上式中有两个相加,外面的相加用来相加每一个特征函数 f_j ,里面的相加用来相加句子中每个位置的单词的的特征值。
对这个分数进行指数化和标准化,我们就可以得到标注序列l的概率值,如下所示:
为了建一个条件随机场,首先要定义一个特征函数集,每个特征函数都以整个句子 s,当前位置 i,位置 i 和 i-1 的标签为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列 l ,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值。
以上内容参考作者:工程师milter
如何用简单易懂的例子解释条件随机场(CRF)模型?
作者的例子能通俗理解 crf ,但是深入肝还是要结合HMM等概率图模型的只知识。
BiLSTM+CRF
根据上面的理解可以知道 crf 能够对句子序列起到一定的约束作用,下面记录一下 在循环神经网络 BiLSTM 的输出之后在接一层 CRF 所起到的作用:
下面这张图是 命名实体任务中,当我们的序列输入一个 BiLSTM 网络之后,再输入一个分类器,对于每个词应该属于哪一种 实体标签给出了概率预测值,但是我们知道这样的预测不一定就是正确的,所以此时在 BiLSTM 层后面再接一个 CRF 层。
CRF层可以加入一些约束来保证最终预测结果是有效的。这些约束可以在训练数据时被CRF层自动学习得到。如下:
可能的约束条件,也就是上文提到的特征函数:
- 句子的开头应该是“B-”或“O”,而不是“I-”。
- “B-label1 I-label2 I-label3…”,在该模式中,类别1,2,3应该是同一种实体类别。比如,“B-Person I-Person” 是正确的,而“B-Person I-Organization”则是错误的。
- “O I-label”是错误的,命名实体的开头应该是“B-”而不是“I-”。
加上这些约束之后,再得到预测序列,理论上错误会大大减少
1. Transitions Score
可以看到这些约束中,在指定指定从一个序列转移到下一个序列的可能性,这个可能性称作转移分值 Transition Score ,这些序列和序列之间的转移分值会构成一个矩阵,在训练模型之前,可以随机地初始化矩阵中所有的 transition score。
self.transitions = nn.Parameter(
torch.randn(self.tagset_size, self.tagset_size))
在之后的训练过程中,这些随机初始化的 score 将会被自动更新。CRF 层可以自己学习到这些约束。我们并不需要手动创建这样一个矩阵。这些分数值会随着训练的迭代次数的增加,变得越来越 “合理”。转移矩阵 如下图例:
2. Emission Score
BiLSTM 的输出是每个词对应的每个 lable 的概率,那么这个词:label 的矩阵就形成了 发射矩阵,Emission score 就是对应生成每个 label 的概率值。如下图;
于是发射矩阵和初始化的转移矩阵形成 CRF 的训练要素,在不断迭代过程中更新转移矩阵的参数值,在预测阶段时,输入一个序列,根据转移矩阵的参数进行维特比解码,得到最优化的预测序列标注值。
3. CRF 损失函数
损失函数由真实转移路径值和所有可能转移路径值两部分组成。真实路径表示在所有可能转移路径中具有最高 score 的路径。在训练阶段,BiLSTM-CRF模型的参数值将会一直不停的被更新,来提高真实路径的分数值所占的比重。最终得到最合理的标注序列结果。
假设每条可能的路径最终的分数值为:,现在有条可能的路径,那么所有路径的分数值为:,如果说第3条路径是真实的路径,也就是训练集提供的该句子真实的实体标记序列路径,那么应该在全部可能的路径中占最高的分值比例。于是得到损失函数:
在训练过程中,训练目标为不断使得真实路径值占全部路径值的概率值达到最大。
关于 BiLSTM-CRF 的理解主要是翻译这篇英文:https://createmomo.github.io/