序列标注-3:CRF介绍

        想象一下,你有来自贾斯汀·比伯的一天生活的的一系列快照,你想用它所代表的活动(吃饭、睡觉、开车等)来标记每个图像。你会怎么做?

        一种方法是忽略快照的顺序性质,并构建一个图像分类器。例如,给定一个月的被标记的快照,你可能知道,黑暗拍摄的图像往往是在早上睡觉,有耀眼的色彩图像往往是跳舞,汽车的图像往往在驾驶,等等。

        然而,忽略这个连续的方面,你会失去很多信息。例如,如果你看到一张嘴巴的特写照片是关于唱歌还是吃饭?如果你知道前一张图片是贾斯汀·比伯吃或做饭的照片,那么这张照片更有可能是关于吃的;如果,前一张图片包含贾斯汀·比伯唱歌或跳舞,那么这张照片可能暗示他在唱歌。

        因此,为了增加我们的标注的精度,我们应该结合它附近的照片的标签,而这正是一个条件随机场所能做的。

1.词性标注

        让我们使用更为常见的词性标注示例来进一步研究一些细节。在词性标注中,目标是用ADJECTIVE、 NOUN、PREPOSITION、VERB、ADVERB、ARTICLE等标签来标记句子(单词或记号的序列)。例如,对于句子“Bob drank coffee at Starbucks”,标注为”Bob (NOUN) drank (VERB) coffee (NOUN) at (PREPOSITION) Starbucks (NOUN)”。我们建立一个条件随机场对句子进行词性标注。就像任何的分类器,我们首先需要选择一组特征函数。

2.CRF中的特征函数

       在CRF中,每个特征函数都是采用以下特征作为输入,以实数为输出(一般是0或者1)

  • 一个句子
  • 句子的第i个字
  • 当前字的标签
  • 前一个字的特征

        注意:通过限制我们的特性依赖于当前和以前的标签,而不是整个句子中的任意标签,我实际上构建了一个特殊的线性链CRF,这里将忽略一般的CRF。例如,一个可能的特征函数可以衡量在前一个字为“very”的情况下,当前单词应该被标记为一个形容词。

3.特征到概率

        接下来给每个特征函数$f_j$一个权重$\lambda_j$ (我们将会讨论怎么从数据中学习到这些权重)。对于给定的一个句话,我们现在可以累加句中所有字加权后的特征来得到标签序列$l$的分数:

$score(l|s)=\sum_{j=1=0}^m \sum_{i=1}^n \lambda_j f_j(s,i,l_i,l_{i-1})$

第一个求和是对每个特征函数,里面的求和是对句子的每个字。

最后,我们可以将这些得分通过指数函数然后归一化转换成在0到1之间的概率$p(l|s)$

$p(l|s)=$ $exp[score(l|s) \over \sum_{ l’}exp[score(l’|s)] $ =$exp[\sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1}) ]\over \sum_{ l’}exp[\sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1}) ] $

4.特征函数举例

        词性标注中,可以包含以下特征:

  • $f_1(s,i,l_i,l_{i-1})=1 \: $ 如果$\: l_i=ADVERB$ 和第$i$个词以“-ly”结尾;否则,特征函数为0。如果和这个特征关联的权重$\lambda_1$是大的正数,这个特征表明我们倾向于把以“-ly”结尾的词标注为“ADVERB”。
  • $f_2(s,i,l_i,l_{i-1})=1 \: $ 如果$ i=1,\: l_i=VERB$ 和这个句子一问号结尾时。否则,特征函数为0。同样,如果该特征的权重值$\lambda_2$ 为大的正数,就偏向于将问句里的第一个词标为VERB(例如 “Is this a sentence beginning with a verb?”)
  • $f_3(s,i,l_i,l_{i-1})=1 \: $ 如果$l_{i-1}=ADJECTIVE$ 和$l_i=NOUN$。否则特征函数为0。同样的,一个正数意味着“NOUN”跟着“ADJECTIVE”后面。
  • $f_3(s,i,l_i,l_{i-1})=1 \: $如果$l_{i-1}=PERPOSITION $和 $l_1=PERPOSTION$。一个负的权重$\lambda_4$对这个特征函数意味着“prepostion”后面不太可能跟着“preposition”,所以我们应该避免这种标签的产生。

        这就是全部。总的来说,为了建立一个条件随机场,你只需要定义一系列的特征函数(依赖整个句子,当前位置,和附近的标签),给它们赋上对应的权重,然后对它们求和。如果需要的话,在最后把它们变成概率。

现在让我们回到前面并且比较一下CRF和其他类似的机器学习方法。

5.看起来像逻辑回归

        CRF的概率形式$p(l|s)=$$exp[\sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1}) \over \sum_{ l’}exp[\sum_{j=1}^m \sum_{i=1}^n \lambda_j f_j (s,i,l_i,l_{i-1})] $ 看起来有些熟悉。这是因为CRF是逻辑回归的序列化版本:逻辑回归是一个用于分类的对数线性模型,CRF是一个用于序列标注的对数线性模型。

6.看起来像隐马尔可夫模型

        回忆隐马尔可夫模型是另外一个用于词性标注的模型。CRF是计算一系列特征函数的得分,而HMM是一个用于序列标注的生成式模型。定义

  • $p(l,s)=p(l_1)\prod p(l_i|l_{i-1}) p(w_i|l_i)) $
  • $p(l_i|l_{i-1})$ 是转移概率(例如,介词后面是名词的概率)
  • $p(w_i|l_i)$ 是发射概率(例如,“dad”是名词的概率)

        CRF跟HMM比较怎么样?CRF更强大,它可以建模所有HMM能建模的,甚至更多。下面举个例子:

注意到HMM的对数形式为$log\:p(l,s)=log\:p(l_0)+\sum_{i}\:log\:p(l_i|l_{i-1})+\sum_i\:p(w_i|l_i)$ 。如果我们考虑这些对数概率为关联二进制的转移和发射特征的权重。这实际上是CRF的一个对数线性形式。

这样,我们就可以通过一些方式建立一个与HMM等价的CRF模型:

  1. 对HMM中的每个转移概率$p(l_i=y|l_{i-1}=x)$ ,定义一个人转移特征$f_{x,y}(s,i,l_i,l_{i-1})=1$ if $l_i=y\: and\:l_{i-1}=x$ 。给每个特征一个权重$w_{x,y}=log\:p(l_i=y|l_{i-1}=x)$ 。
  2. 类似地,对每个发射概率$p(w_i=z|l_i=x)$ 定义系列特征$g_{x,y}(s,i,l_i,l_{i-1})=1\:if \: w_i=z\:and \: l_i=x$ 。给每个特征一个权重$w_{x,z}=log\:p(w_i=z|l_i=x)$ 。

        因此,$p(l|s)$ 通过CRF这些特征计算得到的分数与HMM计算的分数是成比例的,所有每个HMM都等价某个CRF。

然而,因为以下两个原因,CRF可以对更丰富的标签分布建模。

  1. CRF可以定义更大的特征集合。HMM本质是局部的(因为被限制到转移特征函数和发射特征函数,这些函数要求,每个词只取决于当前的标签,每个标签只依赖前一个标签),但是CRF可以使用更多的全局特征。以词性标注的一个特征为例,如果句子以问号结尾,这个词被标注为“VERB”的概率会增加。
  2. CRF可以有任意的权重。HMM的概率必须满足某种约束(例如,$0<=p(w_i|l_i)<=1,\sum_{w} p(w_i=w|l_i)=1$),但是CRF中的权重不受限制(例如$log\:p(w_i|l_i)$ 可以是任意的)

7.权重的学习

        我们回到如何学习CRF的权重这个问题。毫无疑问的一种方式是使用梯度下降。假设我们有一系列的训练实例(被词性标注的句子)。随机初始化我们CRF模型中的权重。为了调整这些随机初始化的权重到正确的权重,对于每一个训练实例:

  1. 遍历每一个特征函数,然后对$\lambda_i$ 计算每一个训练实例对数概率的梯度。

${\partial} \over { \partial w_j} $$log\:p(l|s)=\sum_{j=1}^m f_i(s,j,l_j,l_{j-1})-\sum_{l’} \:p(l’|s)\sum_{j=1}^m f_i(s,j,l’_j,l’_{j-1} )$

  1. 注意梯度中的第一项是特征$f_i$ 在正确标注下的贡献,第二项是特征$f_i$在当前模型中的贡献。这就是你所期望采用的梯度上升公式。
  2. 将$\lambda_i$ 朝着梯度下降的方向移动:$ \lambda_i = \lambda_i+\alpha[\sum_{j=1}^m f_i(s,j,l_{j},l_{j-1})-\sum_l’p(l’|s)\sum_{j=1}^{m} f_{i}(s,j,l_{j}^{‘},l_{j-1}^{‘})]$
  3. 重复以上步骤直到停止条件(例如 更新低于某个阈值)。

换句话说,每一个步骤都在学习我们想要的模型和当前模型的状态的差异,然后使$\lambda_i$沿着这个差异的方向移动

8.找到最优标注

        假设我们已经训练好了我们的CRF模型,现在有一个新的句子,我们怎么对它进行标注呢?

        最简单的方式是对每个可能标签序列计算$p(l|s)$ ,然后选择是这个概率最大的标签序列。然而,对于有k种标签的集合和长度为m的句子,就会有$k^m$ 种可能的标签序列,时间复杂度是指数型。一个更好的方式是意识到线性链CRF满足最优化子结构性质,可以使用动态规划算法(多项式复杂度)找到最优标签序列,与隐马尔可夫模型中的维特比算法类似。

9.一个更有趣的应用

       词性标注有些无聊,已经有很多词性标注器。什么时候会在生活中使用CRF呢?

假设你想从推特上挖掘人们在圣诞节上到礼物类型,你怎么知道哪些词是指礼物?

为了收集数据,我只是简单地寻找“我想要圣诞节balabala”和“我在圣诞节得到balabala”的短语。然而,一个更复杂的CRF的变种可以使用GIFT作为词性标注的一部分(甚至添加其他标签如gift-giver和gift-receiver,获得更多的信息,谁得到来自谁的东西),像对待一个词性标注问题。特征可以基于诸如如果前面的字是一个”gift-receiver”并且这个字之前是“gave“这个词是一个礼物或者如果这个词接下来的两个词是“for Christmas”,这个词也是一个礼物。

翻译自http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/

本文标题:序列标注-3:CRF介绍

文章作者:goingcoder

发布时间:2018年01月23日 - 13:01

最后更新:2018年01月23日 - 14:01

原始链接:https://goingcoder.github.io/2018/01/23/ner3/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------