条件随机场简介

一篇英文博客的翻译版本,详情请戳原文
欢迎留言讨论及转载、分享,但请注明出处并附上英文原文链接。

假如你可以得到Justin Bieber日常一天的连续快照,然后你想根据Justin Bieber正在进行的活动(吃饭、睡觉、开车等)对这些照片进行分类,那么你该怎么做呢?

一种方法就是,忽略照片之间的关系,建立并训练一个接收单一照片的分类器。比如说,在对一个月的标记好的连续快照进行学习后,给定一张较黑暗的、在早晨6点拍摄的照片,那么分类器认为这很可能是睡觉的照片;给定一张有着明亮的、五颜六色的灯光的照片,则认为是在舞会;如果照片里有车,则认为是在开车等。

因为忽略了照片之间的关系,所以这种方法丢失了很多重要的信息。比如说,给一张嘴巴特写的照片,那么分类器该怎么判断呢?是在吃饭,还是在唱歌?此时,如果你知道在前一张照片中Justin Bieber在做饭,那么当前这一张很可能就是在吃饭;如果前一张是在跳舞,那么当前很可能是在唱歌。

因此,为了提高分类器的准确率,我们应该综合利用附近照片的标签信息。利用条件随机场,我们就可以做到这些。

词性标注

接下来利用词性标注中的例子,来探讨一些更加深入的细节。

在词性标注中,根本目标是对一个句子(更准确的是对句子分词后的元素)进行贴标签操作。标签包括:形容词,名词,介词,动词,副词,冠词等。

举例来说,给定一个句子“Bob drank coffee at Starbucks”,那么词性标注后的结果为:“Bob(n,名词) drank(v,动词) coffee(n,名词) at(prep,介词) Starbucks(n,名词)”。

注:在对中文进行词性标注时,应该先进行分词。这也是为什么上文说是对“分词后的元素”进行贴标签,因为中文中最小的语义单位是词而不是字。——译者注

所以,我们可以建立一个条件随机场来对句子进行词性标注。与其他任何分类器一样,首先我们需要建立一个特征函数 f i f_i fi的集合。

CRF中的特征函数

在CRF中,每一个特征函数都接收如下形式的参数作为输入:

  • 句子 s s s
  • 某个词在句子中的位置 i i i
  • 当前词的标签 l i l_i li
  • 前一个词的标签 l i − 1 l_{i-1} li1

输出是为0或者1。

注:通过限制特征函数仅与当前字和前一个字的标签有关,而不是和句子中的任一标签有关,我们实际上得到的线性链条件随机场的一种特殊情形。为简单起见,将不对一般的CRF进行展开说明。

例如,一个可能的特征函数可以衡量在给定前一个词是“very”时,我们多大程度上认为当前词应该标为形容词。

由特征到概率

下一步,给每一个特征函数 f i f_i fi赋一个权重 λ i \lambda_i λi(下面会讲如何从数据中学习得到这些权重)。给定一个句子 s s s,通过对所有加权的特征函数求和,我们可以得到当给 s s s贴上某个标签序列 l l l时的分值:
s c o r e ( l ∣ s ) = ∑ j = 1 m ∑ i = 1 n λ j f j ( s , i , l i , l i − 1 ) score(l | s) = \sum_{j = 1}^m \sum_{i = 1}^n \lambda_j f_j(s, i, l_i, l_{i-1}) score(ls)=j=1mi=1nλjfj(s,i,li,li1)

其中, m m m是特征函数的个数, n n n是句子中词的个数。

最后,通过求幂和归一化的操作,我们可以把所有的评分转化为概率 p ( l ∣ s ) p(l|s) p(ls)
p ( l ∣ s ) = e x p [ s c o r e ( l ∣ s ) ] ∑ l ’ e x p [ s c o r e ( l ’ ∣ s ) ] = e x p [ ∑ j = 1 m ∑ i = 1 n λ j f j ( s , i , l i , l i − 1 ) ] ∑ l ’ e x p [ ∑ j = 1 m ∑ i = 1 n λ j f j ( s , i , l ’ i , l ’ i − 1 ) ] p(l | s) = \frac{exp[score(l|s)]}{\sum_{l’} exp[score(l’|s)]} = \frac{exp[\sum_{j = 1}^m \sum_{i = 1}^n \lambda_j f_j(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})]} p(ls)=lexp[score(ls)]exp[score(ls)]=lexp[j=1mi=1nλjfj(s,i,li,li1)]exp[j=1mi=1nλjfj(s,i,li,li1)]

分母中对 l ′ l' l求和表示考虑对句子 s s s所有可能的标注。

特征函数举例

在理解特征函数时,我陷入了一个误区,以为是“特征的函数”,而其实是“抽取特征的函数”,即“特征”应该是函数的因变量而不是自变量。——译者注

具体的特征函数长什么样子呢?词性标注中的一些例子如下:

  • 如果 l i l_i li=副词且第 i i i个词以“-ly”结尾,则 f 1 ( s , i , l i , l i − 1 ) = 1 f_1(s, i, l_i, l_{i-1}) = 1 f1(s,i,li,li1)=1;否则该函数为0。此时如果该函数的权重 λ 1 \lambda_1 λ1为正数且很大,那么这个特征说明我们倾向于认为将以“-ly”结尾的词标为副词。
  • 如果 i i i=1, l i l_i li=动词且句子以问号结尾,则 f 2 ( s , i , l i , l i − 1 ) = 1 f_2(s, i, l_i, l_{i-1}) = 1 f2(s,i,li,li1)=1;否则该函数为0。此时如果该函数的权重 λ 2 \lambda_2 λ2为正数且很大,那么这个特征说明我们倾向于认为动词开头的句子通常是疑问句。
  • 如果 l i l_i li=名词且 l i − 1 l_{i-1} li1=形容词,则 f 3 ( s , i , l i , l i − 1 ) = 1 f_3(s, i, l_i, l_{i-1}) = 1 f3(s,i,li,li1)=1;否则该函数为0。同样的,较大的正数权重意味着我们倾向于认为形容词后面跟着名词。
  • 如果 l i l_i li=介词且 l i − 1 l_{i-1} li1=介词,则 f 4 ( s , i , l i , l i − 1 ) = 1 f_4(s, i, l_i, l_{i-1}) = 1 f4(s,i,li,li1)=1;否则该函数为0。此时,绝对值较大的负数权重说明我们倾向于认为不可能出现两个介词连用的情况。

这就是特征函数了!总结一下:要建立一个条件随机场,你只需要定义一组特征函数(这些函数依赖句子 s s s,当前词在句子中的位置以及附近词的标签),然后对这些函数赋权,再将它们相加求和,最后转化成概率形式。

现在,让我们回过头来比较一下条件随机场和其他的一些常见的机器学习技术。

我认为作者举得这几个例子并不是十分恰当。例如对 f 2 f_2 f2而言,“句子以问号结尾”这一现象通过四个输入的参数怎么表达呢?显然 i i i l i l_i li l i − 1 l_{i-1} li1是无法表达的,那么只能理解为 s s s表达了这层意思。有人可能认为, s s s代表的是整个句子,当然含有“句子以问号结尾的信息”。但是按照这个逻辑,那么只需要一个输入 s s s就可以了,它显然能表示其他三个参数的信息。 所以,作者的例子并不止于线性链条件随机场。整个特征函数的输入可以理解为一种“现象”,当函数的权重越大时,则认为这种现象出现的可能性越大,也即这种现象越合理。 ——译者注

逻辑回归与CRF

对于上面的 p ( l ∣ s ) p(l | s) p(ls)有的读者可能感觉很熟悉,可以去这里看看。

很像对吧?这是因为CRF实际上就是逻辑回归的序列化后的形式:逻辑回归是一种用于分类的对数线性模型,而CRF是一个给序列进行标注的对数线性模型。

其实并不是很理解,有待后续学习。——译者注

隐马尔科夫模型

HMMs是另一类词性标注(序列标注)模型。与CRF将任意特征函数进行组合求标注评分的方式不同,HMM利用了一种生成方式来贴标签。作如下定义:
p ( l , s ) = p ( l 0 ) ∏ i p ( l i ∣ l i − 1 ) p ( w i ∣ l i ) p(l,s) = p(l_0) \prod_i p(l_i | l_{i-1}) p(w_i | l_i) p(l,s)=p(l0)ip(lili1)p(wili)
这里,

  • p ( l i ∣ l i − 1 ) p(l_i | l_{i-1}) p(lili1)为转移概率(由词性 l i − 1 l_{i-1} li1转移到 l i l_i li的概率)
  • p ( w i ∣ l i ) p(w_i | l_i) p(wili)为输出概率(由词性 l i l_i li输出词 w i w_i wi的概率)

关于HMM以及CRF,可以参考吴军博士的《数学之美》(第二版)一书,非常详细且易于理解。——译者注

那么HMM与CRF相比如何呢?结论是CRF更加强大——它可以完成HMM能完成的工作,并且可以解决HMM无法解决的问题。

对上面的 p ( l , s ) p(l,s) p(l,s)的HMM概率取对数,可以得到 log ⁡ p ( l , s ) = log ⁡ p ( l 0 ) + ∑ i log ⁡ p ( l i ∣ l i − 1 ) + ∑ i log ⁡ p ( w i ∣ l i ) \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) logp(l,s)=logp(l0)+ilogp(lili1)+ilogp(wili)

把这个式子与上文的 s c o r e ( l ∣ s ) score(l | s) score(ls)比较,注意到 f j f_j fj的取值非0即1。若将上式中的每一个 l o g log log项看成是一个特征函数的权重(即一共有 2 n + 1 2n+1 2n+1个特征函数, m = 2 n + 1 m = 2n+1 m=2n+1),那么 s c o r e ( l ∣ s ) score(l | s) score(ls) log ⁡ p ( l , s ) \log p(l,s) logp(l,s)就统一起来了。

具体操作如下:

  • 对于HMM中的每一个转移概率 p ( l i = y ∣ l i − 1 = x ) p(l_i = y | l_{i-1} = x) p(li=yli1=x),定义一类CRF的转移特征函数满足: f x , y ( s , i , l i , l i − 1 ) = 1 f_{x,y}(s, i, l_i, l_{i-1}) = 1 fx,y(s,i,li,li1)=1如果 l i = y l_i = y li=y l i − 1 = x l_{i-1}= x li1=x。给每个函数赋权重 λ x , y = log ⁡ p ( l i = y ∣ l i − 1 = x ) \lambda_{x,y} = \log p(l_i = y | l_{i-1} = x) λx,y=logp(li=yli1=x)
  • 对于HMM中的每一个生成概率 p ( w i = z ∣ l i = x ) p(w_i = z | l_{i} = x) p(wi=zli=x),定义一类CRF的状态特征函数满足: g x , y ( s , i , l i , l i − 1 ) = 1 g_{x,y}(s, i, l_i, l_{i-1}) = 1 gx,y(s,i,li,li1)=1如果 w i = z w_i = z wi=z l i = x l_i = x li=x。给每个函数赋权重 λ x , z = log ⁡ p ( w i = z ∣ l i = x ) \lambda_{x,z} = \log p(w_i = z | l_i = x) λx,z=logp(wi=zli=x)

这样,利用这些特征函数的CRF所计算的 p ( l ∣ s ) p(l|s) p(ls)与根据相关的HMM计算得到的分值成正比,也就是说,每一个HMM都可以对应到某一个CRF。

另一方面,CRF可以标注更加丰富的标签分布集,主要由于以下两个原因:

  • CRFs可以定义更加庞大的特征集合。HMMs模型实质上刻画的是局部特征(因为它限定为二元的转移特征函数与输出特征函数,并且假设每个单词只依赖于当前标签,每个标签只依赖于前一个标签),而CRFs可以利用全局特征。上面给出的特征函数 f 2 f_2 f2就是一个利用全局信息的例子,这利用HMMs是无法做到的。
  • CRFs可以有任意的权重。HMMs的权重必须满足某些限制( 0 ≤ p ( w i ∣ l i ) ≤ 1 0 \leq p(w_i | l_i) \leq 1 0p(wili)1 ∑ w p ( w i = w ∣ l 1 ) = 1 \sum_w p(w_i = w | l_1) = 1 wp(wi=wl1)=1),然而CRFs的权重却是没有限制的。

权重的学习

让我们回到如何学习模型权重的问题上。毫无疑问,我们可以利用梯度下降的方法。

假设我们有一系列训练集(句子和对应的词性标注)。首先初始化模型的参数,然后对每一个样本,我们按照如下的方法更新权重:

  • 遍历每一个特征函数 f i f_i fi,计算训练样本的概率对数对权重 λ i \lambda_i λi的梯度: ∂ ∂ λ j log ⁡ p ( l ∣ s ) = ∑ j = 1 m f i ( s , j , l j , l j − 1 ) − ∑ l ’ p ( l ’ ∣ s ) ∑ j = 1 m f i ( s , j , l ’ j , l ’ j − 1 ) \frac{\partial}{\partial \lambda_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}) λjlogp(ls)=j=1mfi(s,j,lj,lj1)lp(ls)j=1mfi(s,j,lj,lj1)
  • 在上面的梯度中,第一项是在真实标签下特征 f i f_i fi的贡献量,第二项是在当前模型中特征 f i f_i fi的预期贡献量。这正是你期望梯度增加所采取的形式。
  • 在梯度的反方向上移动 λ i \lambda_i λi λ i = λ i − α ∗ [ ∑ j = 1 m f i ( s , j , l j , l j − 1 ) − ∑ l ’ p ( l ’ ∣ s ) ∑ j = 1 m f i ( s , j , l ’ j , l ’ j − 1 ) ] \lambda_i = \lambda_i-\alpha*\left[ \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})\right] λi=λiα[j=1mfi(s,j,lj,lj1)lp(ls)j=1mfi(s,j,lj,lj1)] α \alpha α为学习率。
  • 重复上面的步骤直至满足设定的停止条件。

也就是,每一步训练都得到我们想要的模型和当前状态之间的差异,然后在减小这种差异的方向上移动权重。

寻找最优的标注

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

一个单纯的想法是,对于每一个标注方法 l l l计算 p ( l ∣ s ) p(l|s) p(ls),然后选择使 p ( l ∣ s ) p(l|s) p(ls)达到最大的那种标注方法。然而,对于一个含有 n n n个词的句子,若标签共有 k k k种,则一共存在 k n k^n kn中可能的标记,这种方法必须进行指数级的标签计算。

注意到,线性链条件随机场满足最优的子结构性质,因此可以利用动态规划的算法来寻找最优解,正如利用维特比算法求HMMs模型的最优解一样。

一个更加有趣的应用

好了,词性标注可能有些无聊,如今已经有大量的词性标注工具了。那在生活中何时会用到CRF呢?

假如你想根据Twitter上的文本挖掘一下人们都收到了怎样的圣诞礼物:

What people on Twitter wanted for Christmas, and what they got: twitter.com/edchedch/statu…

你怎样区分那个词指代的是礼物呢?

在为上述任务收集到的数据中,我简单地查找具有“I want XXX for Christmas”或者 “I got XXX for Christmas”等形式的句子来提取礼物的内容。然而,一种更加复杂的CRF变体能够将GIFT作为一种“类词性”标签(甚至你可以增加“GIFT_GIVER”和“GIFT_RECEIVER”等类词性标签来得到“谁从谁处得到礼物”等更具体的信息)进而将此转化为一个词性标注问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值