条件随机场(Conditional Random Field)简介

来源:互联网 发布:车解码器软件 编辑:程序博客网 时间:2024/05/17 14:24

条件随机场(CRF)由Lafferty等人于2001年提出,是一种判别式概率模型,在许多自然语言处理任务中比如分词,命名实体识别等表现尤为出色。本篇与lafferty原始论文相同,将着重介绍条件随机场的一种特殊形式——线性链条件随机场(Linear Chain CRF)。

为什么需要CRF

作为Motivation,我们考虑如下词性标注任务:

对于一段输入文字“The dog barks”,我们希望获得他的词性标注“The/D(冠词) dog/N(名词) barks/V(动词)”。也就是对于一段输入序列x⃗ =[x1,x2,....,xn],我们希望获得相应的特定任务的输出序列s⃗ =[s1,s2,...,sn]。比如刚刚举的词性标注例子,此时xn将对应字典集V里面的词,sn则是词性集S里面的元素

一个解决方案——MEMM

为了解决上述问题,一个解决思路是建立一个条件概率模型: 

p(s⃗ |x⃗ )

McCallum等人为了解决HMM模型表达能力的局限性,于2000年提出了MEMM(Maximum Entropy Markov Model),该模型如下: 
p(s⃗ |x⃗ )=p(s1,s2,....,sn|x1,x2,...,xn)=i=1np(si|s1,s2,...,si1,x1,x2,...,xn)=i=1np(si|si1,x1,x2,...,xn)=i=1nexp(w⃗ Tf(si,si1,x⃗ ))sSexp(w⃗ Tf(s,si1,x⃗ ))

MEMM做了一个假设,就是状态的转移仅仅依赖于上一状态(这里我将标注标签称为一种状态)。在这样的假设下,转移概率被定义为: 
p(si|si1,x1,x2,...,xn)=exp(w⃗ Tf(si,si1,x⃗ ))sSexp(w⃗ Tf(s,si1,x⃗ ))

其中f(si,si1,x⃗ )是特征函数,作用是将当前状态和上一状态连同输入映射为一个数值向量: 
f(si,si1,x⃗ )Rd

w⃗ 是权重向量,是模型的参数。通过这样定义,可以很容易求解模型参数w⃗ ,并用viterbi算法求出该模型下的最优序列s⃗ 

Label Bias Problem

MEMM虽然可以很优雅地解决上述问题,然而却存在一个重大缺点,也就是所谓的“标注偏好”问题。什么是标注偏好呢?那就是模型在为输入序列x⃗ 打标签的时候,存在偏袒心里,会倾向于选择某些标签。且看stanford大学的一个PPT: 
这里写图片描述
从图中可以观察,局部状态转移时,s1倾向于转移到s2,而s2倾向于停留在s2, 但是最终最好的序列却是:s1,s1,s1,s1(0.4*0.45*0.5=0.09取得最大概率!)。为什么会这样呢?注意到s1只有两种转移状态:s1,s2,而s2有5种转移状态:s1,s2,s3,s4,s5。对于s1的转移概率,由MEMM的定义,可得: 

p(s1|s1,x⃗ )=exp(w⃗ Tf(s1,s1,x⃗ ))ss1,s2exp(w⃗ Tf(s,s1,x⃗ ))p(s2|s1,x⃗ )=exp(w⃗ Tf(s2,s1,x⃗ ))ss1,s2exp(w⃗ Tf(s,s1,x⃗ ))

而对于s2的转移概率计算则是: 
p(s1|s2,x⃗ )=exp(w⃗ Tf(s1,s2,x⃗ ))ss1,...,s5exp(w⃗ Tf(s,s2,x⃗ ))p(s2|s2,x⃗ )=exp(w⃗ Tf(s2,s2,x⃗ ))ss1,...,s5exp(w⃗ Tf(s,s2,x⃗ ))...p(s5|s2,x⃗ )=exp(w⃗ Tf(s5,s2,x⃗ ))ss1,...,s5exp(w⃗ Tf(s,s2,x⃗ ))

说明什么问题呢?因为s1的转移状态很少,所以不管实际训练观测值有多少,由于每一步的状态转移概率都要归一化,所以s1的转移概率都会被放大,而s2由于转移状态多,因此每一步转移概率归一化的时候都被平均分摊了。因此在计算最优序列的时候,MEMM会偏袒那些状态转移少的标签,而忽略了实际观察值,为了说明该现象,我们再举出原始论文的例子,如下图: 
这里写图片描述
假设我们有一个辨别单词的状态机,对于单词rib和rob,从字母r出发分出两条边,经过i和o,最后到达b。对于MEMM,它对于一个单词x判断是rib的概率为: 
p(rib|x)=p(r|,x)p(i|r,x)p(b|i,x)

判断为rob的概率为: 
p(rob|x)=p(r|,x)p(o|r,x)p(b|o,x)

注意到p(b|i,x)=p(b|o,x)=1,因为这些状态的转移都只有一条边,所以必然转移到下一个状态,那么只要训练数据中rob更加多,也就是p(i|r,x)<p(o|r,x)那么在预测阶段,预测值将始终是rob,而不管实际观测值x

CRF

为了解决Label Bias Problem,CRF便诞生了。首先我们必须明确MEMM产生Label Bias的根源是什么,这是因为MEMM的状态转移概率的计算方式,为了获得转移概率,它每一步的状态转移都会进行归一化,从而导致问题的产生。CRF认清了问题的根源,只要不要在每一步状态转移进行归一化,而在全局进行归一化即可: 

p(s⃗ |x⃗ )=exp(w⃗ TΦ(s⃗ ,x⃗ ))sSnexp(w⃗ TΦ(s,x⃗ ))

CRF相对于MEMM做了几个改动,首先在特征函数上面做了变动: 
Φ(s⃗ ,x⃗ )Rd

它将输入序列x⃗ 和输出标注s⃗ 映射为一个d维实数向量,而MEMM的特征函数拥有的信息只是输入序列x⃗ 和当前状态以及上一个状态,也就是说CRF的特征函数掌握信息量更多,从而表达能力更强。第二个的改进是它不再每一次状态转移进行归一化,而是在全局进行归一化,这样完美解决Label Bias问题。 
有得必有失,注意到模型的分母需要罗列所有的状态序列,对于序列长度为n的输入序列,状态序列的个数为|S|n,对于这种指数增长问题,在实际应用中一般都是intractable的,只能付诸于近似求解,比如我们之前提过的Variational Bayes或者Gibbs Sampling等等。不过有一种特殊结构的CRF,精确快速求解的方式是存在的,因此在早期得以广泛应用。

Linear Chain CRF

此处揭晓我们的主角——线性链CRF。熟悉概率图模型的同学可以一睹它的容貌: 
这里写图片描述 
对于这样的无向图,通过定义特征函数Φ,可以将原来intractable的问题变为tractable。我们来看看到底是如何定义的: 

Φ(s⃗ ,x⃗ )=iϕ(si1,si,x⃗ )

对于第k维的特征函数值则记录为: 
Φk(s⃗ ,x⃗ )=iϕk(si1,si,x⃗ )

通过这样巧妙的定义:全局特征等于局部特征的和,一切阻碍都迎刃而解!

参数估计

接下来我们介绍对于Linear Chain CRF如何进行参数参数估计的。假设我们有训练集x1,x2,...,xN,对应的标注集合s1,s2,...,sN,那么其对应的对数似然函数为: 

L=iNlog p(si|xi)=iNlog exp(w⃗ TΦ(si,xi))sSnexp(w⃗ TΦ(s,xi))=iNlog exp(kwkΦk(si,xi))sSnexp(kwkΦk(s,xi))

wj进行求导可得: 
Lwj=iNΦj(si,xi)iNsSnexp(kwkΦk(si,xi))Φj(si,xi)sSnexp(kwkΦk(s,xi))=iNΦj(si,xi)iNsSnp(s|xi)Φj(si,xi)

问题出现在上面减号的右半部分,我们单独讨论(为了记号方便,我们省去上标i): 
s⃗ Snp(s⃗ |x)Φj(s⃗ ,x⃗ )=s⃗ Snp(s⃗ |x)kϕj(sk1,sk,x⃗ )=ks⃗ Snp(s⃗ |x)ϕj(sk1,sk,x⃗ )=kaS,bSϕj(sk1=a,sk=b,x⃗ )s⃗ Sn,sk=b,sk1=ap(s⃗ |x⃗ )

现在问题在于对于任意a,b我们是否能快速求解 
s⃗ Sn,sk=b,sk1=ap(s1,s2,...,si1,si,...,sn|x⃗ )=s⃗ Sn,sk=b,sk1=ap(s1,s2,...,sk1,sk,...,sn|x⃗ )=p(sk1=a,sk=b|x⃗ )

Forward-Backward 算法

首先对于如下概率图模型: 
这里写图片描述 
根据定义,我们可得: 

p(s⃗ |x⃗ )=ψ(s⃗ ,x⃗ )ψ(x⃗ )=exp(w⃗ TΦ(s⃗ ,x⃗ ))sSnexp(w⃗ TΦ(s,x⃗ ))

因此有: 
ψ(x⃗ )=s⃗ Snexp(w⃗ TΦ(s⃗ ,x⃗ ))=s⃗ Snexp(kwkjϕk(sj1,sj,x⃗ ))=s⃗ Snexp(jkwkϕk(sj1,sj,x⃗ ))=s⃗ Snjexp(kwkϕk(sj1,sj,x⃗ ))

对于熟悉概率图模型的同学,如果我们定义: 
ψ(sj1,sj)=exp(kwkϕk(sj1,sj,x⃗ ))

那么ψ(sj1,sj)就是链式CRF图模型的一个因子,sj1,sj是其最大clique。因此: 
ψ(x⃗ )=s1s2...snj=1n+1ψ(sj1,sj)=s1s2...snψ(s0=,s1)ψ(s1,s2)...ψ(sn1,sn)ψ(sn,sn+1=STOP)=[snψ(sn,STOP)[sn1ψ(sn1,sn)...[s1ψ(s1,s2)[ψ(,s1)]...]

如果定义 
α(sk)=[sk1ψ(sk1,sk)[sk2ψ(sk2,sk1)...[s1ψ(s1,s2)ψ(,s1)]...]

则容易得到如下动态规划方程: 
α(sk)=sk1ψ(sk1,sk)α(sk1)

因此有: 
ψ(x⃗ )=α(sn+1)=snψ(sn,STOP)α(sn)

该动态规划方程便是forward阶段,其初始值定义为: 
α(s1)=ψ(,s1)

若用程序实现,伪代码如下:

# n为序列x的长度for s in S:    alpha(1,s) = psi(*,s)for(m = 2; m <= n; m++):    for s in S:        for s' in S:            alpha(m, s) += psi(s', s) * alpha(m-1, s')for s in S:    alpha(n+1, STOP) += psi(s, STOP) * alpha(n, s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

类似的有: 

ψ(x⃗ )=s1s2...snj=1n+1ψ(sj1,sj)=s1s2...snψ(,s1)ψ(s1,s2)...ψ(sn1,sn)ψ(sn,STOP)=[s1ψ(,s1)[s2ψ(s1,s2)...[sn1ψ(sn2,sn1)[snψ(sn1,sn)ψ(sn,STOP)]...]

如果定义 
β(sk)=[sk+1ψ(sk,sk+1)...[sn1ψ(sn2,sn1)[snψ(sn1,sn)ψ(sn,STOP)]...]

则容易得到如下动态规划方程: 
β(sk1)=skψ(sk1,sk)β(sk)

因此有: 
ψ(x⃗ )=β(s0)=s1ψ(,s1)β(s1)

该动态规划方程便是backward阶段,其初始值定义为: 
β(sn)=ψ(sn,STOP)

伪代码实现如下:

#n为序列x的长度for s in S:    beta(n, s) = psi(s, STOP)for(m = n-1; m >= 1; m--):    for s in S:        for s' in S:            beta(m, s) += psi(s, s') * beta(m+1, s')for s in S:    beta(0, *) = psi(*, s) * beta(1, s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

有上述的动态规划方程,我们可以很方便求解α,β所对应的各个值。 
对于α,β,现在我们考察发现: 

α(sk)β(sk)ψ(x⃗ )=[sk1ψ(sk1,sk)[sk2ψ(sk2,sk1)...[s1ψ(s1,s2)ψ(,s1)]...][sk+1ψ(sk,sk+1)...[sn1ψ(sn2,sn1)[snψ(sn1,sn)ψ(sn,STOP)]...]/ψ(x⃗ )=s1s2...sk1sk+1...snjψ(sj1,sj,x⃗ )ψ(x⃗ )=p(sk|x⃗ )

也既是: 
p(sk|x⃗ )=α(sk)β(sk)ψ(x⃗ )

同理可得: 
p(sk1,sk|x⃗ )=α(sk1)ψ(sk1,sk)β(sk)ψ(x⃗ )

由于能高效求出α,β,边缘概率p(sk1,sk|x⃗ )也可高效求出,那么我们可以精确高效地求出梯度! 
只要能快速求解梯度,接下来我们就可以利用SGD或者L-BFGS对CRF进行快速参数估计。

序列推断(Inference)

现在模型参数估计已经知道如何求解了,接下来就是对于一个新的输入序列x⃗ ,如何推测最优的标注序列:

argmaxs⃗ Snp(s⃗ |x⃗ )

首先考虑: 
argmaxs⃗ Sn p(s⃗ |x⃗ )=argmaxs⃗ Snexp(w⃗ TΦ(s⃗ ,x⃗ ))sSnexp(w⃗ TΦ(s,x⃗ ))=argmaxs⃗ Snexp(w⃗ TΦ(s⃗ ,x⃗ ))=argmaxs⃗ Snw⃗ TΦ(s⃗ ,x⃗ )=argmaxs⃗ Snw⃗ T(iϕ(si1,si,x⃗ ))=argmaxs⃗ Sniw⃗ Tϕ(si1,si,x⃗ )

Viterbi算法

同样可以利用动态规划快速求解,我们首先定义一个动态规划表格π(n,s),其含义是,以s结尾长度为n的最优序列,所谓的最优序列就是使得iw⃗ Tϕ(si1,si,x⃗ )取得最大值。则其递推方程如下: 

π(n,s)=maxsS{π(n1,s)+w⃗ Tϕ(s,s,x⃗ )}

如果我们为每个训练数据加上人造初始状态s0,那么该动态规划方程的初始解为: 
π(1,s1)=w⃗ Tϕ(,s1,x⃗ )

其为代码如下:

for s in S:    pi(1, s) = w.dot(phi(*, s, x))for(m = 2; m <= n; m++):    for s in S:        maxVal = -Infinity        best = null        for s' in S:            val = pi(m-1, s') + w.dot(phi(s', s, x))            if val > maxVal:                maxVal = val                best = s'        pi(m, s) = maxVal        bPtr(m, s) = bestmaxVal = -Infinityfor s in S:    val = pi(n, s) + w.dot(phi(s, STOP, x))    if val > maxVal:        bPtr(m+1,STOP) = s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

因此我们可以非常迅速求解CRF的推断问题,而这样的动态规划解也被成为viterbi算法。

参考引用

Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data 
Log-Linear Models, MEMMs, and CRFs 
The Forward-Backward Algorithm 
Conditional random field PPT 
Log-linear models and conditional random fields 
PRML第8章《Graphical Models》 
PRML第13章《Sequential Date》

版权声明:欢迎转载,原文地址http://blog.csdn.net/aws3217150
阅读全文
0 0
原创粉丝点击