CRF
- 什么是CRF?CRF用来干什么?
- CRF模型公式?
- 特征函数是什么意思?特征模版什么意思?
- CRF损失如何计算的?全部路径loss怎么算?
- CRF的数据是如何生成的?
- 维特比算法没看懂,啥意思?
- 源代码怎么学习?道理我都懂,怎么用呢?
- 手撕BiLSTM + CRF
CRF
【1】什么是CRF?CRF用来干什么?
该博客使用一个“照片分类”任务生动介绍了CRF在序列标注中的应用场景。
英文的地址为:Introduction to Conditional Random Fields
想象一下,贾斯汀·比伯(JustinBieber)生活中有一天会有一系列的快照,而你想用每个图像的活动(吃饭,睡觉,开车等等)来标记每个图像。你该怎样做呢?
一种方法是忽略快照的顺序性质,并构建一个图像分类器。例如,如果给予一个月的标签快照,您可能会发现早上6点拍摄的黑色图像往往是关于睡觉的,有很多鲜艳颜色的图像往往是关于跳舞,汽车图像是关于驾驶的,等等。
然而,通过忽略这个连续的方面,你失去了大量的信息。例如,如果您看到一张嘴巴的特写图片会发生什么?是关于唱歌还是饮食?如果你知道前面的图片是贾斯汀·比伯(Justin Bieber)的饮食或烹饪图片,那么这张图片更有可能是关于吃东西的。但是,如果前面的图像包含贾斯汀·比伯(Justin Bieber)唱歌或者跳舞,那么这个人可能也会演唱。
因此,为了提高labeller的精度,我们应该加入附近照片的标签,这正是条件随机场所做的。
词性标注
让我们进入一些更详细的部分,使用更常见的词性标注的例子。
在POS标记中,目标是用诸如ADJECTIVE,NOUN,PREPOSITION,VERB,ADVERB,ARTICLE等标签来标记一个句子(一个单词或一个令牌序列)。
例如,给出“Bob drank coffee at Starbucks”的句子,标签可能是“ob (NOUN) drank (VERB) coffee (NOUN) at (PREPOSITION) Starbucks (NOUN)”。
那么让我们建立一个条件随机场来为他们的词性标注句子。就像任何分类器一样,我们首先需要决定一组特征函数$ f_i $
CRF中的特征函数
在CRF中,每个特征函数都是一个输入的函数:
一个句子 s
单词 i 在句子中的位置
当前单词的标签 $ l_i $
前一个词的标签 $ l_ {i-1} $
输出的是一个实数值(尽管数字通常只是0或1)。
(注意:通过限制我们的特性只依赖当前和之前的标签,而不是整个句子中的任意标签,我实际上构建了一个linear-chain CRF的特殊情况。为了简单起见,在这篇文章中我将忽略 general CRFs)
例如,一个可能的特征函数可以测量我们怀疑当前单词应该被标记为形容词,因为前一个单词是“very”
特征到概率
接下来,将每个特征函数$ f_j $ 分配一个权重 $ \lambda_j $(我将在下面讨论如何从数据中学习这些权重)。给定句子s,现在我们可以通过在句子中的所有单词上加上权重特征来对s的标签进行评分:
$ score(l | s)= \sum_{j = 1} ^ m \sum_ {i = 1} ^ n \lambda_j f_j(s,i,l_i,l_ {i-1})$
(The first sum runs over each feature function $ j $, and the inner sum runs over each position $ i $ of the sentence.)
最后,我们可以通过指数化和规范化将这些分数转换成0到1之间的概率 $ p(l | s)$:
示例特征函数
那么这些功能函数是什么样的呢? POS标记功能的例子可以包括:
$ f_1(s,i,l_i,l_ {i-1})= 1 $ if $ l_i = $ ADVERB,and 第i个字以“-ly”结尾;否则为0。如果与此功能相关的重量$ \lambda_1 $大而正,那么这个特征实际上就是说,我们更喜欢将其中以-ly结尾的单词标记为ADVERB。
$f_2(s,i,l_i,l_ {i-1})= 1 $if $ i = 1 $,$ l_i = $ VERB,and 句子以问号结尾;否则为0。同样,如果与此特征相关联的权重$ \lambda_2 $是大的并且是肯定的,那么将VERB分配给问题中的第一个单词
$ f_3(s,i,l_i,l_ {i-1})= 1 $ if $ l_ {i-1} = $ ADJECTIVE and $ l_i = $NOUN;否则为0。同样,这个特征的正面权重意味着形容词往往被名词所覆盖。
- $ f_4(s,i,l_i,l_ {i-1})= 1 $ if $ l_ {i-1} = $ PREPOSITION and $ l_i = $ PREPOSITION。这个函数的负权重$ \lambda_4 $将意味着介词不倾向于跟在介词后面,所以我们应该避免在这种情况发生的地方进行标记。
总结一下:为了建立一个条件随机场,你只需要定义一堆特征函数(可以依赖于整个句子,当前位置和附近的标签),赋予它们权重,并将它们加在一起,必要时将其转换为概率。
现在让我们退后一步,比较CRF和其他一些常见的机器学习技术。
看起来像逻辑回归…
CRF概率的形式:$ p(l | s)= \frac {exp {\sum_ {j = 1} ^ m \sum_ {i = 1} ^ n f_j(s,i,l_i,l_ {i-1 }}]} {\sum_ {l’} exp [\sum_ {j = 1} ^ m \sum_ {i = 1} ^ nf_j(s,i,l’_i,l’_ {i-1}) ]} $ 可能看起来很熟悉。
这是因为CRF确实是逻辑回归的顺序版本: 而逻辑回归是分类的对数线性模型,CRF是顺序标签的对数线性模型。
看起来像HMMs …
回想一下,隐马尔可夫模型是词性标注的另一种模型。鉴于CRF将任何一组函数放在一起以获得标签分数,HMM采用生成方法来标记,定义:
$ p(l,s)= p(l_1)\prod_i p(l_i | l_ {i-1})p(w_i| l_i)$
其中:
$ p(l_i | l_ {i-1})$ 是转移概率 (例如介词后跟一个名词的概率)
$ p(w_i | l_i)$ 是发射概率 (例如,名词发出单词“爸爸”的概率)
那HMM怎么和CRF比较? CRF功能更强大 - 它们可以模拟HMM可以做的所有事情。One way of seeing this is as follows.
注意,HMM概率的对数是 $ \log p(l,s)= \log p(l_0)+ \sum_i \log p(l_i | l_ {i-1})+ \sum_i \log p(w_i | l_i)$。This has exactly the log-linear form of a CRF if we consider these log-probabilities to be the weights associated to binary transition and emission indicator features.
也就是说,我们可以构建一个与任何HMM等价的CRF通过:
对于每个HMM转移概率$ p(l_i = y | l_ {i-1} = x)$,定义一组CRF转移特征,形式为$ f_ {x,y}(s,i,l_i,l_ {i -1})= 1 $如果$l_i = y $和$ l_ {i-1} = x $。给每个特征赋予$ w_ {x,y} = \log p(l_i = y | l_ {i-1} = x)$的权重
类似地,对于每个HMM发射概率$ p(w_i = z | l_ {i} = x)$,定义一组CRF发射特征的形式为$ g_ {x,y}(s,i,l_i,l_ {i -1})= 1 $如果$w_i = z $和$ l_i = x $。给每个特征赋予权重$w_ {x,z} = \log p(w_i = z |l_i = x)$
因此,由CRF使用这些特征函数计算的得分$ p(l| s)$正好与由相关的HMM计算的得分成正比,因此每个HMM等同于一些CRF。
然而,通用报告格式也可以模拟更丰富的标签分布,主要有两个原因:
CRF可以定义更多的特征。尽管HMM本质上是本地的(因为它们被限制于二进制转换和发射特征函数,这迫使每个词只依赖于当前标签,而每个标签仅依赖于以前的标签),CRF可以使用更多的全局特征。例如,上面POS标记器中的一个特征增加了标签的可能性,如果句子结尾包含问号,则将标签的第一个单词标记为VERB。
CRF可以有任意的权重。而HMM的概率必须满足一定的约束(例如,$ 0 <= p(w_i | l_i)<= 1,\sum_w p(w_i = w | l_1)= 1)$,CRF的权重是不受限制的,$ \log p(w_i | l_i)$可以是任何想要的)。
学习权重
让我们回到如何学习CRF中的特征权重的问题。一种方法是使用梯度下降 gradient descent。
假设我们有一堆训练examples (句子和相关的词性标签)。随机初始化我们的CRF模型的权重。要将这些随机初始化权重转换为正确的权重,对于每个训练示例:
通过每个特征函数$ f_i $,并计算训练样例相对于$ \lambda_i $的梯度:
$ \frac{\partial}{\partial w_{i}} \log p(l \mid s)=\sum_{j=1}^{m} f_{i}\left(s, j, l_{j}, l_{j-1}\right)-\sum_{l^{\prime}} p\left(l^{\prime} \mid s\right) \sum_{j=1}^{m} f_{i}\left(s, j, l_{j}^{\prime}, l_{j-1}^{\prime}\right)$
请注意,梯度中的第一项是真实标签下特征$ f_i $的贡献,梯度中的第二项是当前模型下特征$ f_i $的预期贡献。这正是您期望渐变的形式。
在渐变方向上移动 $λ_i$:$\lambda_{i}=\lambda_{i}+\alpha\left[\sum_{j=1}^{m} f_{i}\left(s, j, l_{j}, l_{j-1}\right)-\sum_{l^{\prime}} p\left(l^{\prime} \mid s\right) \sum_{j=1}^{m} f_{i}\left(s, j, l_{j}^{\prime}, l_{j-1}^{\prime}\right)\right]$,其中α是学习率。
重复前面的步骤,直到达到一些停止条件(例如,更新低于某个阈值)。
In other words, every step takes the difference between what we want the model to learn and the model’s current state, and moves λiλi in the direction of this difference.
寻找最佳标签
假设我们已经训练了我们的CRF模型,现在又出现了一个新句子。我们如何标记它?
最简单的方法是为每个可能的标签 $l$ 计算$ p(l | s)$,然后选择最大化这个概率的标签。然而,由于对于大小为k的标签集和长度为m的句子,存在$ k ^ m $个可能的标签,所以这种方法将不得不检查指数数量的标签。
一个更好的方法是认识到(线性链)CRFs满足一个最佳子结构属性( optimal substructure ),允许我们使用动态规划算法来寻找最佳标签,类似于用于隐马尔科夫模型的维特比算法。
【2】CRF模型公式?
这部分知识比较硬核,说实话目前还没有看到哪篇文章完整推导出CRF公式,大都走马观花,关键部分截图。
所以这里直接推荐看 李航的《统计学习》第二版,第11章, 11.2小结《条件随机场的定义与形式》。
【3】特征函数是什么意思?特征模版什么意思?
阅读过《统计学习》相关文章的读者会发现,条件概率P(y|x)
中定义的特征函数tk
,sl
,还是令人迷惑的,数学公式过于抽象。CRF模板 这篇博文举例了特征函数和模版的使用。实际场景中,模版的定义可能多达几十个。
【4】CRF损失如何计算的?全部路径loss怎么算?
在《统计学习》中,CRF的P(y|x)
为规范化后的条件概率。规范化因子Z(x)
,即全路径的计算,是一个难点。CRF的全路径损失计算 该文详细讲解了计算的过程。
【5】CRF的数据是如何生成的?
阅读过市面上很多关于CRF的文章,会发现很多文章对于训练数据的举例,似乎只有两三列。word
,POS
,label
,这可能会对读者造成误解。实际场景下,会设计很多人工特征,添加到训练数据里,提升CRF模型的学习能力。
你以为的:
1 |
|
实际的:
1 |
|
人工设计的特征,可以有效提升CRF模型性能;但有可能会造成过拟合。
【6】维特比算法没看懂,啥意思?
CRF的预测算法,《统计学习》书中介绍维特比算法,虽然举了一个例子,相对来说还是抽象了点。如何理解viterbi算法 该文形象的解释了维特比算法的原理以及求解过程。再回去过看《统计学习》就很好理解了。
【7】源代码怎么学习?道理我都懂,怎么用呢?
关于如何阅读源码,在博主的另一篇文章手把手教你读源码——BiLSTM+CRF,进行了详细的介绍。
【8】BiLSTM + CRF ?
随着深度学习的普及,BiLSTM + CRF似乎成了很多序列标注任务的标配,这两个工具是如何结合起来的呢?参考这篇文章,手把手推理了手撕 BiLSTM-CRF