CRF简单随机场

来源:互联网 发布:olap 大数据 实现方案 编辑:程序博客网 时间:2024/05/24 22:45

为了了解CRF,学习了Edwin Chen的博客:Introduction to Conditional Random Fields(本文学习翻译的英文出处,如有侵权联系即删!)


为了快速学习,简单翻译了中文,略粗糙,如下,有错误望指正。


条件随机场介绍

 

    想象一下,贾斯汀·比伯(JustinBieber)生活中有一天会有一系列的快照,而你想用每个图像的活动(吃饭,睡觉,开车等等)来标记每个图像。你怎么能这样做?

    一种方法是忽略快照的顺序性质,并构建一个每图像分类器。例如,如果给予一个月的标签快照,您可能会发现早上6点拍摄的黑色图像往往是关于睡觉的,有很多鲜艳颜色的图像往往是关于跳舞,汽车图像是关于驾驶的,等等。

    然而,通过忽略这个连续的方面,你失去了大量的信息。例如,如果您看到一张嘴巴的特写图片会发生什么?是关于唱歌还是饮食?如果你知道前面的图片是贾斯汀·比伯(Justin Bieber)的饮食或烹饪图片,那么这张图片更有可能是关于吃东西的。但是,如果前面的图像包含贾斯汀·比伯(Justin Bieber)唱歌或者跳舞,那么这个人可能也会演唱他。

    因此,为了提高贴标机的精度,我们应该加入附近照片的标签,这正是条件随机场所所做的。

 

 

 

词性标注

 

    让我们进入一些更详细的部分,使用更常见的词性标注的例子。

    在POS标记中,目标是用诸如ADJECTIVE,NOUN,PREPOSITION,VERB,ADVERB,ARTICLE等标签来标记一个句子(一个单词或一个令牌序列)。

    例如,给出“Bob在星巴克喝咖啡”的句子,标签可能是“Bob(NOUN)在(PREPOSITION)星巴克(NOUN)喝(VERB)咖啡(NOUN)”。

    那么让我们建立一个条件随机场来为他们的词性标注句子。就像任何分类器一样,我们首先需要决定一组特征函数$ f_i $。

 

 

CRF中的特征函数

 

在CRF中,每个特征函数都是一个输入的函数:

 

~一个句子 s

~单词i在句子中的位置

~当前单词的标签 $ l_i $

~前一个词的标签 $ l_ {i-1} $

并输出一个实数值(尽管数字通常只是0或1)。

(注意:通过限制我们的特性只依赖当前和之前的标签,而不是整个句子中的任意标签,我实际上构建了一个线性CRF的特殊情况。为了简单起见,在这篇文章中我将忽略通用CRFs)

 

例如,一个可能的特征函数可以测量我们怀疑当前单词应该被标记为形容词,因为前一个单词是“非常”的。

 

特征到概率

 

    接下来,将每个特征函数$ 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})$

 

(第一个和在每个特征函数$ j $上运行,内部和运行在句子的每个位置$ i $上。)

 

最后,我们可以通过指数化和规范化将这些分数转换成0到1之间的概率     $ p(l | s)$:

 

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

 

 

 

示例特征函数

 

那么这些功能函数是什么样的呢? POS标记功能的例子可以包括:

~ $ f_1(s,i,l_i,l_ {i-1})= 1 $ if $ l_i = $ ADVERB,第i个字以“-ly”结尾;否则为0。

     ~如果与此功能相关的重量$ \ lambda_1 $大而正,那么这个特性实际上就是说我们更喜欢标签,其中以-ely结尾的单词被标记为ADVERB。

~  $f_2(s,i,l_i,l_ {i-1})= 1 $if $ i = 1 $,$ l_i = $ VERB,句子以问号结尾;否则为0。

     ~同样,如果与此特征相关联的权重$ \ lambda_2 $是大的并且是肯定的,那么将VERB分配给问题中的第一个单词的标号(例如,“这是一个以动词开头的句子吗?”)是优选的。

~ $ f_3(s,i,l_i,l_ {i-1})= 1 $ if $ l_ {i-1} = $ ADJECTIVE和$ l_i = $NOUN;否则为0。

     ~同样,这个特征的正面权重意味着形容词往往被名词所覆盖。

~ 如果$ l_ {i-1} = $ PREPOSITION和$ l_i = $ PREPOSITION,$ f_4(s,i,l_i,l_ {i-1})= 1 $。

     ~这个函数的负权重$ \ 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可以做的所有事情。看到这个的一个方法如下。

    注意,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)$。如果我们认为这些对数概率是与二元过渡和排放指标特征相关的权重,那么这完全是CRF的对数线性形式。

 

也就是说,我们可以构建一个与任何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中的特征权重的问题。一种方法是(surprise)使用渐变上升。

    假设我们有一堆训练实例(句子和相关的词性标签)。随机初始化我们的CRF模型的权重。要将这些随机初始化权重转换为正确的权重,对于每个训练示例:

     ~ 通过每个特征函数$ f_i $,并计算训练样例相对于$ \ lambda_i $:$ \ frac {\ partial} {\partial w_j} \ log p(l | s)= (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})$

     ~ 请注意,梯度中的第一项是真实标签下特征$ f_i $的贡献,梯度中的第二项是当前模型下特征$ f_i $的预期贡献。这正是您期望渐变的形式。

     ~ $ \ lambda_i = \ lambda_i + \ alpha [\ sum_ {j= 1} ^ m f_i(s,j,l_j,l_ {j-1}) - \sum_ {其中$ \ alpha $是一些学习速率。

     ~ 重复前面的步骤,直到达到一些停止条件(例如,更新低于某个阈值)。

 

    换句话说,每一步都要把模型学习的内容和模型的当前状态区分开来,并且在这个差异的方向上移动$ \ lambda_i $。

 

寻找最佳标签

 

    假设我们已经训练了我们的CRF模型,现在又出现了一个新句子。我们如何标记它?

    幼稚的方法是为每个可能的标签l计算$ p(l | s)$,然后选择最大化这个概率的标签。然而,由于对于大小为k的标签集和长度为m的句子,存在$ k ^ m $个可能的标签,所以这种方法将不得不检查指数数量的标签。

    一个更好的方法是认识到(线性链)CRFs满足一个最佳的子结构属性,允许我们使用(多项式时间)动态规划算法来寻找最佳标签,类似于维特比算法的隐马尔科夫模型。

 

 

更有趣的应用程序

 

好的,词性标注有点无聊,现在有很多POS标签。什么时候可以在现实生活中使用CRF?

假设你想挖掘Twitter的圣诞礼物:

(是的,我刚刚嵌入了一个推特,BOOM。)

 

    你怎么知道哪个词是指礼物?

    为了收集上述图表的数据,我只是寻找“我想要圣诞节XXX”和“我有XXX圣诞节”这样的短语。然而,更复杂的CRF变体可以使用GIFT类似于词类的标签(甚至添加诸如GIFT-GIVER和GIFT-RECEIVER的其他标签以获得关于谁从谁那里得到的更多信息)并且将其视为POS标记问题。特征可以基于诸如“如果前一个单词是一个礼物接收者,并且之前的单词是'给'',这个单词是一个礼物”或者“如果接下来的两个单词是'圣诞节',这个单词是一个礼物”。。

 

Fin

我会结束一些更随机的想法:

 

~ 我明确地跳过了条件随机域所在的图形模型框架,因为我不认为它们增加了对CRF的最初理解。但如果您有兴趣了解更多信息,Daphne Koller将于1月份开始免费提供图形模型在线课程。

~ 或者,如果您对CRF的许多NLP应用(如词性标注或命名实体提取)更感兴趣,Manning和Jurafsky本着同样的精神教授NLP类。

我也略微比较了CRF之间的类比:HMM和Logistic回归:朴素贝叶斯。 这张图片(来自Sutton和McCallum对条件随机场的介绍)归纳起来,并且显示了CRF的图形模型性质:

   注:这张图片已经没有了~