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

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

为什么需要CRF

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

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

一个解决方案——MEMM

为了解决上述问题,一个解决思路是建立一个条件概率模型:
p ( s ⃗ ∣ x ⃗ ) p(\vec{s}|\vec{x}) p(s x )
McCallum等人为了解决HMM模型表达能力的局限性,于2000年提出了MEMM(Maximum Entropy Markov Model),该模型如下:
p ( s ⃗ ∣ x ⃗ ) = p ( s 1 , s 2 , . . . . , s n ∣ x 1 , x 2 , . . . , x n ) = ∏ i = 1 n p ( s i ∣ s 1 , s 2 , . . . , s i − 1 , x 1 , x 2 , . . . , x n ) = ∏ i = 1 n p ( s i ∣ s i − 1 , x 1 , x 2 , . . . , x n ) = ∏ i = 1 n e x p ( w ⃗ T f ( s i , s i − 1 , x ⃗ ) ) ∑ s ′ ∈ S e x p ( w ⃗ T f ( s ′ , s i − 1 , x ⃗ ) ) p(\vec{s}|\vec{x}) \\=p(s_1,s_2,....,s_n|x_1,x_2,...,x_n) \\=\prod_{i=1}^{n}p(s_i|s_1,s_2,...,s_{i-1},x_1,x_2,...,x_n) \\=\prod_{i=1}^{n} p(s_i|s_{i-1}, x_1,x_2,...,x_n) \\=\prod_{i=1}^{n} \frac{exp(\vec{w}^Tf(s_i,s_{i-1},\vec{x}))}{\sum_{s'\in S}exp(\vec{w}^Tf(s',s_{i-1},\vec{x}))} p(s x )=p(s1,s2,....,snx1,x2,...,xn)=i=1np(sis1,s2,...,si1,x1,x2,...,xn)=i=1np(sisi1,x1,x2,...,xn)=i=1nsSexp(w Tf(s,si1,x ))exp(w Tf(si,si1,x ))
MEMM做了一个假设,就是状态的转移仅仅依赖于上一状态(这里我将标注标签称为一种状态)。在这样的假设下,转移概率被定义为:
p ( s i ∣ s i − 1 , x 1 , x 2 , . . . , x n ) = e x p ( w ⃗ T f ( s i , s i − 1 , x ⃗ ) ) ∑ s ′ ∈ S e x p ( w ⃗ T f ( s ′ , s i − 1 , x ⃗ ) ) p(s_i|s_{i-1}, x_1,x_2,...,x_n) \\=\frac{exp(\vec{w}^Tf(s_i,s_{i-1},\vec{x}))}{\sum_{s'\in S}exp(\vec{w}^Tf(s',s_{i-1},\vec{x}))} p(sisi1,x1,x2,...,xn)=sSexp(w Tf(s,si1,x ))exp(w Tf(si,si1,x ))
其中 f ( s i , s i − 1 , x ⃗ ) f(s_i,s_{i-1},\vec{x}) f(si,si1,x )是特征函数,作用是将当前状态和上一状态连同输入映射为一个数值向量:
f ( s i , s i − 1 , x ⃗ ) → R d f(s_i,s_{i-1},\vec{x}) \rightarrow R^d f(si,si1,x )Rd
w ⃗ \vec{w} w 是权重向量,是模型的参数。通过这样定义,可以很容易求解模型参数 w ⃗ \vec{w} w ,并用viterbi算法求出该模型下的最优序列 s ⃗ \vec{s} s
##Label Bias Problem
MEMM虽然可以很优雅地解决上述问题,然而却存在一个重大缺点,也就是所谓的“标注偏好”问题。什么是标注偏好呢?那就是模型在为输入序列 x ⃗ \vec{x} x 打标签的时候,存在偏袒心里,会倾向于选择某些标签。且看stanford大学的一个PPT
这里写图片描述
从图中可以观察,局部状态转移时, s 1 s_1 s1倾向于转移到 s 2 s_2 s2,而 s 2 s_2 s2倾向于停留在 s 2 s_2 s2, 但是最终最好的序列却是: s 1 , s 1 , s 1 , s 1 s_1,s_1,s_1,s_1 s1,s1,s1,s1(0.40.450.5=0.09取得最大概率!)。为什么会这样呢?注意到 s 1 s_1 s1只有两种转移状态: s 1 , s 2 s_1,s_2 s1,s2,而 s 2 s2 s2有5种转移状态: s 1 , s 2 , s 3 , s 4 , s 5 s_1,s_2,s_3,s_4,s_5 s1,s2,s3,s4,s5。对于 s 1 s_1 s1的转移概率,由MEMM的定义,可得:
p ( s 1 ∣ s 1 , x ⃗ ) = e x p ( w ⃗ T f ( s 1 , s 1 , x ⃗ ) ) ∑ s ′ ∈ s 1 , s 2 e x p ( w ⃗ T f ( s ′ , s 1 , x ⃗ ) ) p ( s 2 ∣ s 1 , x ⃗ ) = e x p ( w ⃗ T f ( s 2 , s 1 , x ⃗ ) ) ∑ s ′ ∈ s 1 , s 2 e x p ( w ⃗ T f ( s ′ , s 1 , x ⃗ ) ) p(s_1|s_1, \vec{x})=\frac{exp(\vec{w}^Tf(s_1,s_1,\vec{x}))}{\sum_{s'\in s_1,s_2}exp(\vec{w}^Tf(s',s_1,\vec{x}))} \\p(s_2|s_1, \vec{x})=\frac{exp(\vec{w}^Tf(s_2,s_1,\vec{x}))}{\sum_{s'\in s_1,s_2}exp(\vec{w}^Tf(s',s_1,\vec{x}))} p(s1s1,x )=ss1,s2exp(w Tf(s,s1,x ))exp(w Tf(s1,s1,x ))p(s2s1,x )=ss1,s2exp(w Tf(s,s1,x ))exp(w Tf(s2,s1,x ))
而对于 s 2 s2 s2的转移概率计算则是:
p ( s 1 ∣ s 2 , x ⃗ ) = e x p ( w ⃗ T f ( s 1 , s 2 , x ⃗ ) ) ∑ s ′ ∈ s 1 , . . . , s 5 e x p ( w ⃗ T f ( s ′ , s 2 , x ⃗ ) ) p ( s 2 ∣ s 2 , x ⃗ ) = e x p ( w ⃗ T f ( s 2 , s 2 , x ⃗ ) ) ∑ s ′ ∈ s 1 , . . . , s 5 e x p ( w ⃗ T f ( s ′ , s 2 , x ⃗ ) ) . . . p ( s 5 ∣ s 2 , x ⃗ ) = e x p ( w ⃗ T f ( s 5 , s 2 , x ⃗ ) ) ∑ s ′ ∈ s 1 , . . . , s 5 e x p ( w ⃗ T f ( s ′ , s 2 , x ⃗ ) ) p(s_1|s_2, \vec{x})=\frac{exp(\vec{w}^Tf(s_1,s_2,\vec{x}))}{\sum_{s'\in s_1,...,s_5}exp(\vec{w}^Tf(s',s_2,\vec{x}))} \\p(s_2|s_2, \vec{x})=\frac{exp(\vec{w}^Tf(s_2,s_2,\vec{x}))}{\sum_{s'\in s_1,...,s_5}exp(\vec{w}^Tf(s',s_2,\vec{x}))}\\.\\.\\.\\p(s_5|s_2, \vec{x})=\frac{exp(\vec{w}^Tf(s_5,s_2,\vec{x}))}{\sum_{s'\in s_1,...,s_5}exp(\vec{w}^Tf(s',s_2,\vec{x}))} p(s1s2,x )=ss1,...,s5exp(w Tf(s,s2,x ))exp(w Tf(s1,s2,x ))p(s2s2,x )=ss1,...,s5exp(w Tf(s,s2,x ))exp(w Tf(s2,s2,x ))...p(s5s2,x )=ss1,...,s5exp(w Tf(s,s2,x ))exp(w Tf(s5,s2,x ))
说明什么问题呢?因为 s 1 s_1 s1的转移状态很少,所以不管实际训练观测值有多少,由于每一步的状态转移概率都要归一化,所以 s 1 s_1 s1的转移概率都会被放大,而 s 2 s_2 s2由于转移状态多,因此每一步转移概率归一化的时候都被平均分摊了。因此在计算最优序列的时候,MEMM会偏袒那些状态转移少的标签,而忽略了实际观察值,为了说明该现象,我们再举出原始论文的例子,如下图:
这里写图片描述
假设我们有一个辨别单词的状态机,对于单词rib和rob,从字母r出发分出两条边,经过i和o,最后到达b。对于MEMM,它对于一个单词 x x x判断是rib的概率为:
p ( r i b ∣ x ) = p ( r ∣ ∗ , x ) p ( i ∣ r , x ) p ( b ∣ i , x ) p(rib|x) = p(r|*,x)p(i|r,x)p(b|i,x) p(ribx)=p(r,x)p(ir,x)p(bi,x)
判断为rob的概率为:
p ( r o b ∣ x ) = p ( r ∣ ∗ , x ) p ( o ∣ r , x ) p ( b ∣ o , x ) p(rob|x) = p(r|*,x)p(o|r,x)p(b|o,x) p(robx)=p(r,x)p(or,x)p(bo,x)
注意到 p ( b ∣ i , x ) = p ( b ∣ o , x ) = 1 p(b|i,x)=p(b|o,x)=1 p(bi,x)=p(bo,x)=1,因为这些状态的转移都只有一条边,所以必然转移到下一个状态,那么只要训练数据中rob更加多,也就是 p ( i ∣ r , x ) < p ( o ∣ r , x ) p(i|r,x)<p(o|r,x) p(ir,x)<p(or,x)那么在预测阶段,预测值将始终是rob,而不管实际观测值 x x x
#CRF
为了解决Label Bias Problem,CRF便诞生了。首先我们必须明确MEMM产生Label Bias的根源是什么,这是因为MEMM的状态转移概率的计算方式,为了获得转移概率,它每一步的状态转移都会进行归一化,从而导致问题的产生。CRF认清了问题的根源,只要不要在每一步状态转移进行归一化,而在全局进行归一化即可:
p ( s ⃗ ∣ x ⃗ ) = e x p ( w ⃗ T Φ ( s ⃗ , x ⃗ ) ) ∑ s ′ ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ′ ⃗ , x ⃗ ) ) p(\vec{s}|\vec{x}) = \frac{exp(\vec{w}^T\Phi(\vec{s},\vec{x}))}{\sum_{\vec{s'} \in S^n}exp(\vec{w}^T\Phi(\vec{s'},\vec{x}))} p(s x )=s Snexp(w TΦ(s ,x ))exp(w TΦ(s ,x ))
CRF相对于MEMM做了几个改动,首先在特征函数上面做了变动:
Φ ( s ⃗ , x ⃗ ) → R d \Phi(\vec{s},\vec{x}) \rightarrow R^d Φ(s ,x )Rd
它将输入序列 x ⃗ \vec{x} x 和输出标注 s ⃗ \vec{s} s 映射为一个d维实数向量,而MEMM的特征函数拥有的信息只是输入序列 x ⃗ \vec{x} x 和当前状态以及上一个状态,也就是说CRF的特征函数掌握信息量更多,从而表达能力更强。第二个的改进是它不再每一次状态转移进行归一化,而是在全局进行归一化,这样完美解决Label Bias问题。
有得必有失,注意到模型的分母需要罗列所有的状态序列,对于序列长度为 n n n的输入序列,状态序列的个数为 ∣ S ∣ n |S|^n Sn,对于这种指数增长问题,在实际应用中一般都是intractable的,只能付诸于近似求解,比如我们之前提过的Variational Bayes或者Gibbs Sampling等等。不过有一种特殊结构的CRF,精确快速求解的方式是存在的,因此在早期得以广泛应用。
##Linear Chain CRF
此处揭晓我们的主角——线性链CRF。熟悉概率图模型的同学可以一睹它的容貌:
这里写图片描述
对于这样的无向图,通过定义特征函数 Φ \Phi Φ,可以将原来intractable的问题变为tractable。我们来看看到底是如何定义的:
Φ ( s ⃗ , x ⃗ ) = ∑ i ϕ ( s i − 1 , s i , x ⃗ ) \Phi(\vec{s},\vec{x}) = \sum_i \phi(s_{i-1},s_i,\vec{x}) Φ(s ,x )=iϕ(si1,si,x )
对于第 k k k维的特征函数值则记录为:
Φ k ( s ⃗ , x ⃗ ) = ∑ i ϕ k ( s i − 1 , s i , x ⃗ ) \Phi_k(\vec{s},\vec{x}) = \sum_i \phi_k(s_{i-1},s_i,\vec{x}) Φk(s ,x )=iϕk(si1,si,x )
通过这样巧妙的定义:全局特征等于局部特征的和,一切阻碍都迎刃而解!
###参数估计
接下来我们介绍对于Linear Chain CRF如何进行参数参数估计的。假设我们有训练集 x 1 ⃗ , x 2 ⃗ , . . . , x N ⃗ \vec{x^1},\vec{x^2},...,\vec{x^N} x1 ,x2 ,...,xN ,对应的标注集合 s 1 ⃗ , s 2 ⃗ , . . . , s N ⃗ \vec{s^1},\vec{s^2},...,\vec{s^N} s1 ,s2 ,...,sN ,那么其对应的对数似然函数为:
L = ∑ i N l o g   p ( s i ⃗ ∣ x i ⃗ ) = ∑ i N l o g   e x p ( w ⃗ T Φ ( s i ⃗ , x i ⃗ ) ) ∑ s ′ ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ′ ⃗ , x i ⃗ ) ) = ∑ i N l o g   e x p ( ∑ k w k Φ k ( s i ⃗ , x i ⃗ ) ) ∑ s ′ ⃗ ∈ S n e x p ( ∑ k w k Φ k ( s ′ ⃗ , x i ⃗ ) ) L = \sum_i^N log\ p(\vec{s^i}|\vec{x^i}) \\=\sum_i^N log\ \frac{exp(\vec{w}^T\Phi(\vec{s^i},\vec{x^i}))}{\sum_{\vec{s'} \in S^n}exp(\vec{w}^T\Phi(\vec{s'},\vec{x^i}))} \\=\sum_i^N log\ \frac{exp(\sum_k w_k\Phi_k(\vec{s^i},\vec{x^i}))}{\sum_{\vec{s'} \in S^n}exp(\sum_k w_k\Phi_k(\vec{s'},\vec{x^i}))} L=iNlog p(si xi )=iNlog s Snexp(w TΦ(s ,xi ))exp(w TΦ(si ,xi ))=iNlog s Snexp(kwkΦk(s ,xi ))exp(kwkΦk(si ,xi ))
w j w_j wj进行求导可得:
∂ L ∂ w j = ∑ i N Φ j ( s i ⃗ , x i ⃗ ) − ∑ i N ∑ s ′ ∈ S n e x p ( ∑ k w k Φ k ( s ′ ⃗ , x i ⃗ ) ) Φ j ( s i ⃗ , x i ⃗ ) ∑ s ′ ⃗ ∈ S n e x p ( ∑ k w k Φ k ( s ′ ⃗ , x i ⃗ ) ) = ∑ i N Φ j ( s i ⃗ , x i ⃗ ) − ∑ i N ∑ s ′ ⃗ ∈ S n p ( s ′ ⃗ ∣ x i ) Φ j ( s i ⃗ , x i ⃗ ) \frac{\partial L}{\partial w_j}=\sum_i^N\Phi_j(\vec{s^i},\vec{x^i})-\sum_i^N \frac{ \sum_{s' \in S^n}exp(\sum_k w_k\Phi_k(\vec{s'},\vec{x^i}))\Phi_j(\vec{s^i},\vec{x^i})}{\sum_{\vec{s'} \in S^n}exp(\sum_k w_k\Phi_k(\vec{s'},\vec{x^i}))} \\=\sum_i^N\Phi_j(\vec{s^i},\vec{x^i})-\sum_i^N \sum_{\vec{s'} \in S^n} p(\vec{s'}|x^i)\Phi_j(\vec{s^i},\vec{x^i}) wjL=iNΦj(si ,xi )iNs Snexp(kwkΦk(s ,xi ))sSnexp(kwkΦk(s ,xi ))Φj(si ,xi )=iNΦj(si ,xi )iNs Snp(s xi)Φj(si ,xi )
问题出现在上面减号的右半部分,我们单独讨论(为了记号方便,我们省去上标 i i i):
∑ s ⃗ ∈ S n p ( s ⃗ ∣ x ) Φ j ( s ⃗ , x ⃗ ) = ∑ s ⃗ ∈ S n p ( s ⃗ ∣ x ) ∑ k ϕ j ( s k − 1 , s k , x ⃗ ) = ∑ k ∑ s ⃗ ∈ S n p ( s ⃗ ∣ x ) ϕ j ( s k − 1 , s k , x ⃗ ) = ∑ k ∑ a ∈ S , b ∈ S ϕ j ( s k − 1 = a , s k = b , x ⃗ ) ∑ s ⃗ ∈ S n , s k = b , s k − 1 = a p ( s ⃗ ∣ x ⃗ ) \sum_{\vec{s} \in S^n} p(\vec{s}|x)\Phi_j(\vec{s},\vec{x}) \\=\sum_{\vec{s} \in S^n} p(\vec{s}|x)\sum_k \phi_j(s_{k-1},s_k, \vec{x}) \\=\sum_k \sum_{\vec{s} \in S^n} p(\vec{s}|x)\phi_j(s_{k-1},s_k, \vec{x}) \\=\sum_k \sum_{a \in S,b\in S} \phi_j(s_{k-1}=a,s_k=b, \vec{x}) \sum_{\vec{s} \in S^n, s_k=b,s_{k-1}=a} p(\vec{s}|\vec{x}) 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 a,b a,b我们是否能快速求解
∑ s ⃗ ∈ S n , s k = b , s k − 1 = a p ( s 1 , s 2 , . . . , s i − 1 , s i , . . . , s n ∣ x ⃗ ) = ∑ s ⃗ ∈ S n , s k = b , s k − 1 = a p ( s 1 , s 2 , . . . , s k − 1 , s k , . . . , s n ∣ x ⃗ ) = p ( s k − 1 = a , s k = b ∣ x ⃗ ) \sum_{\vec{s} \in S^n, s_k=b,s_{k-1}=a} p(s_1,s_2,...,s_{i-1},s_{i},...,s_n|\vec{x}) \\=\sum_{\vec{s} \in S^n, s_k=b,s_{k-1}=a} p(s_1,s_2,...,s_{k-1},s_{k},...,s_n|\vec{x})\\=p(s_{k-1}=a,s_k=b|\vec{x}) s Sn,sk=b,sk1=ap(s1,s2,...,si1,si,...,snx )=s Sn,sk=b,sk1=ap(s1,s2,...,sk1,sk,...,snx )=p(sk1=a,sk=bx )

Forward-Backward 算法

首先对于如下概率图模型:
这里写图片描述
根据定义,我们可得:
p ( s ⃗ ∣ x ⃗ ) = ψ ( s ⃗ , x ⃗ ) ψ ( x ⃗ ) = e x p ( w ⃗ T Φ ( s ⃗ , x ⃗ ) ) ∑ s ′ ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ′ ⃗ , x ⃗ ) ) p(\vec{s}|\vec{x}) = \frac{\psi(\vec{s},\vec{x})}{\psi(\vec{x})}=\frac{exp(\vec{w}^T\Phi(\vec{s},\vec{x}))}{\sum_{\vec{s'} \in S^n}exp(\vec{w}^T\Phi(\vec{s'},\vec{x}))} p(s x )=ψ(x )ψ(s ,x )=s Snexp(w TΦ(s ,x ))exp(w TΦ(s ,x ))
因此有:
ψ ( x ⃗ ) = ∑ s ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ⃗ , x ⃗ ) ) = ∑ s ⃗ ∈ S n e x p ( ∑ k w k ∑ j ϕ k ( s j − 1 , s j , x ⃗ ) ) = ∑ s ⃗ ∈ S n e x p ( ∑ j ∑ k w k ϕ k ( s j − 1 , s j , x ⃗ ) ) = ∑ s ⃗ ∈ S n ∏ j e x p ( ∑ k w k ϕ k ( s j − 1 , s j , x ⃗ ) ) \psi(\vec{x}) = \sum_{\vec{s} \in S^n}exp(\vec{w}^T\Phi(\vec{s},\vec{x})) \\=\sum_{\vec{s} \in S^n}exp(\sum_k w_k \sum_j\phi_k(s_{j-1}, s_j,\vec{x})) \\=\sum_{\vec{s} \in S^n}exp(\sum_j\sum_k w_k \phi_k(s_{j-1}, s_j,\vec{x})) \\=\sum_{\vec{s} \in S^n}\prod_j exp(\sum_k w_k \phi_k(s_{j-1}, s_j,\vec{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 ))
对于熟悉概率图模型的同学,如果我们定义:
ψ ( s j − 1 , s j ) = e x p ( ∑ k w k ϕ k ( s j − 1 , s j , x ⃗ ) ) \psi(s_{j-1},s_j) = exp(\sum_k w_k \phi_k(s_{j-1}, s_j,\vec{x})) ψ(sj1,sj)=exp(kwkϕk(sj1,sj,x ))
那么 ψ ( s j − 1 , s j ) \psi(s_{j-1},s_j) ψ(sj1,sj)就是链式CRF图模型的一个因子, s j − 1 , s j s_{j-1},s_j sj1,sj是其最大clique。因此:
ψ ( x ⃗ ) = ∑ s 1 ∑ s 2 . . . ∑ s n ∏ j = 1 n + 1 ψ ( s j − 1 , s j ) = ∑ s 1 ∑ s 2 . . . ∑ s n ψ ( s 0 = ∗ , s 1 ) ψ ( s 1 , s 2 ) . . . ψ ( s n − 1 , s n ) ψ ( s n , s n + 1 = S T O P ) = [ ∑ s n ψ ( s n , S T O P ) [ ∑ s n − 1 ψ ( s n − 1 , s n ) . . . [ ∑ s 1 ψ ( s 1 , s 2 ) [ ψ ( ∗ , s 1 ) ] . . . ] \psi(\vec{x}) = \sum_{s_1}\sum_{s_2}...\sum_{s_n}\prod_{j=1}^{n+1} \psi(s_{j-1},s_j) \\=\sum_{s_1}\sum_{s_2}...\sum_{s_n} \psi(s_0=*,s_1) \psi(s_1,s_2) ...\psi(s_{n-1},s_n) \psi(s_{n},s_{n+1}=STOP) \\=\big [\sum_{s_n}\psi(s_{n},STOP)\big [\sum_{s_{n-1}} \psi(s_{n-1},s_{n}) ...\big [\sum_{s_1}\psi(s_{1},s_2) \big [\psi(*,s_1) \big ]...\big] ψ(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)]...]
如果定义
α ( s k ) = [ ∑ s k − 1 ψ ( s k − 1 , s k ) [ ∑ s k − 2 ψ ( s k − 2 , s k − 1 ) . . . [ ∑ s 1 ψ ( s 1 , s 2 ) ψ ( ∗ , s 1 ) ] . . . ] \alpha( s_k)=\big [\sum_{s_{k-1}}\psi(s_{k-1},s_{k})\big [\sum_{s_{k-2}}\psi(s_{k-2},s_{k-1})... \big [\sum_{s_1}\psi(s_{1},s_2)\psi(*,s_1) \big ]...\big] α(sk)=[sk1ψ(sk1,sk)[sk2ψ(sk2,sk1)...[s1ψ(s1,s2)ψ(,s1)]...]
则容易得到如下动态规划方程:
α ( s k ) = ∑ s k − 1 ψ ( s k − 1 , s k ) α ( s k − 1 ) \alpha(s_{k})=\sum_{s_{k-1}}\psi(s_{k-1},s_{k})\alpha(s_{k-1}) α(sk)=sk1ψ(sk1,sk)α(sk1)
因此有:
ψ ( x ⃗ ) = α ( s n + 1 ) = ∑ s n ψ ( s n , S T O P ) α ( s n ) \psi(\vec{x})=\alpha(s_{n+1})=\sum_{s_{n}}\psi(s_{n},STOP)\alpha(s_{n}) ψ(x )=α(sn+1)=snψ(sn,STOP)α(sn)
该动态规划方程便是forward阶段,其初始值定义为:
α ( s 1 ) = ψ ( ∗ , s 1 ) \alpha(s_1)=\psi(*,s_1) α(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)

类似的有:
ψ ( x ⃗ ) = ∑ s 1 ∑ s 2 . . . ∑ s n ∏ j = 1 n + 1 ψ ( s j − 1 , s j ) = ∑ s 1 ∑ s 2 . . . ∑ s n ψ ( ∗ , s 1 ) ψ ( s 1 , s 2 ) . . . ψ ( s n − 1 , s n ) ψ ( s n , S T O P ) = [ ∑ s 1 ψ ( ∗ , s 1 ) [ ∑ s 2 ψ ( s 1 , s 2 ) . . . [ ∑ s n − 1 ψ ( s n − 2 , s n − 1 ) [ ∑ s n ψ ( s n − 1 , s n ) ψ ( s n , S T O P ) ] . . . ] \psi(\vec{x}) = \sum_{s_1}\sum_{s_2}...\sum_{s_n}\prod_{j=1}^{n+1} \psi(s_{j-1},s_j) \\=\sum_{s_1}\sum_{s_2}...\sum_{s_n} \psi(*,s_1) \psi(s_1,s_2) ...\psi(s_{n-1},s_n) \psi(s_{n},STOP) \\=\big [\sum_{s_1}\psi(*,s_1)\big [\sum_{s_2} \psi(s_1,s_2) ...\big [\sum_{s_{n-1}}\psi(s_{n-2},s_{n-1}) \big [\sum_{s_n}\psi(s_{n-1},s_n)\psi(s_{n},STOP) \big ]...\big] ψ(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)]...]
如果定义
β ( s k ) = [ ∑ s k + 1 ψ ( s k , s k + 1 ) . . . [ ∑ s n − 1 ψ ( s n − 2 , s n − 1 ) [ ∑ s n ψ ( s n − 1 , s n ) ψ ( s n , S T O P ) ] . . . ] \beta( s_k)=\big [\sum_{s_{k+1}}\psi(s_{k},s_{k+1})...\big [\sum_{s_{n-1}}\psi(s_{n-2},s_{n-1}) \big [\sum_{s_n}\psi(s_{n-1},s_n)\psi(s_{n},STOP) \big ]...\big] β(sk)=[sk+1ψ(sk,sk+1)...[sn1ψ(sn2,sn1)[snψ(sn1,sn)ψ(sn,STOP)]...]
则容易得到如下动态规划方程:
β ( s k − 1 ) = ∑ s k ψ ( s k − 1 , s k ) β ( s k ) \beta(s_{k-1})=\sum_{s_{k}}\psi(s_{k-1},s_{k})\beta(s_k) β(sk1)=skψ(sk1,sk)β(sk)
因此有:
ψ ( x ⃗ ) = β ( s 0 ) = ∑ s 1 ψ ( ∗ , s 1 ) β ( s 1 ) \psi(\vec{x})=\beta(s_0)=\sum_{s_{1}}\psi(*,s_{1})\beta(s_1) ψ(x )=β(s0)=s1ψ(,s1)β(s1)
该动态规划方程便是backward阶段,其初始值定义为:
β ( s n ) = ψ ( s n , S T O P ) \beta(s_{n})=\psi(s_{n},STOP) β(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)

有上述的动态规划方程,我们可以很方便求解 α , β \alpha,\beta α,β所对应的各个值。
对于 α , β \alpha,\beta α,β,现在我们考察发现:
α ( s k ) β ( s k ) ψ ( x ⃗ ) = [ ∑ s k − 1 ψ ( s k − 1 , s k ) [ ∑ s k − 2 ψ ( s k − 2 , s k − 1 ) . . . [ ∑ s 1 ψ ( s 1 , s 2 ) ψ ( ∗ , s 1 ) ] . . . ] ∗ [ ∑ s k + 1 ψ ( s k , s k + 1 ) . . . [ ∑ s n − 1 ψ ( s n − 2 , s n − 1 ) [ ∑ s n ψ ( s n − 1 , s n ) ψ ( s n , S T O P ) ] . . . ] / ψ ( x ⃗ ) = ∑ s 1 ∑ s 2 . . . ∑ s k − 1 ∑ s k + 1 . . . ∑ s n ∏ j ψ ( s j − 1 , s j , x ⃗ ) ψ ( x ⃗ ) = p ( s k ∣ x ⃗ ) \frac{\alpha(s_k)\beta(s_k)}{\psi(\vec{x})} \\=\big [\sum_{s_{k-1}}\psi(s_{k-1},s_{k})\big [\sum_{s_{k-2}}\psi(s_{k-2},s_{k-1})... \big [\sum_{s_1}\psi(s_{1},s_2)\psi(*,s_1) \big ]...\big]\\*\big [\sum_{s_{k+1}}\psi(s_{k},s_{k+1})...\big [\sum_{s_{n-1}}\psi(s_{n-2},s_{n-1}) \big [\sum_{s_n}\psi(s_{n-1},s_n)\psi(s_{n},STOP) \big ]...\big]/\psi(\vec{x}) \\=\frac{\sum_{s_1}\sum_{s_2}...\sum_{s_{k-1}}\sum_{s_{k+1}}...\sum_{s_n}\prod_j \psi(s_{j-1},s_j,\vec{x})}{\psi(\vec{x})} \\=p(s_k|\vec{x}) ψ(x )α(sk)β(sk)=[sk1ψ(sk1,sk)[sk2ψ(sk2,sk1)...[s1ψ(s1,s2)ψ(,s1)]...][sk+1ψ(sk,sk+1)...[sn1ψ(sn2,sn1)[snψ(sn1,sn)ψ(sn,STOP)]...]/ψ(x )=ψ(x )s1s2...sk1sk+1...snjψ(sj1,sj,x )=p(skx )
也既是:
p ( s k ∣ x ⃗ ) = α ( s k ) β ( s k ) ψ ( x ⃗ ) p(s_k|\vec{x})=\frac{\alpha(s_k)\beta(s_k)}{\psi(\vec{x})} p(skx )=ψ(x )α(sk)β(sk)
同理可得:
p ( s k − 1 , s k ∣ x ⃗ ) = α ( s k − 1 ) ψ ( s k − 1 , s k ) β ( s k ) ψ ( x ⃗ ) p(s_{k-1},s_k|\vec{x})=\frac{\alpha(s_{k-1})\psi(s_{k-1},s_{k})\beta(s_k)}{\psi(\vec{x})} p(sk1,skx )=ψ(x )α(sk1)ψ(sk1,sk)β(sk)
由于能高效求出 α , β \alpha,\beta α,β,边缘概率 p ( s k − 1 , s k ∣ x ⃗ ) p(s_{k-1},s_k|\vec{x}) p(sk1,skx )也可高效求出,那么我们可以精确高效地求出梯度!
只要能快速求解梯度,接下来我们就可以利用SGD或者L-BFGS对CRF进行快速参数估计。

序列推断(Inference)

现在模型参数估计已经知道如何求解了,接下来就是对于一个新的输入序列 x ⃗ \vec{x} x ,如何推测最优的标注序列:
arg ⁡ max ⁡ s ⃗ ∈ S n p ( s ⃗ ∣ x ⃗ ) \arg\max_{\vec{s}\in S^n} p(\vec{s}|\vec{x}) args Snmaxp(s x )
首先考虑:
arg ⁡ max ⁡ s ⃗ ∈ S n   p ( s ⃗ ∣ x ⃗ ) = arg ⁡ max ⁡ s ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ⃗ , x ⃗ ) ) ∑ s ′ ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ′ ⃗ , x ⃗ ) ) = arg ⁡ max ⁡ s ⃗ ∈ S n e x p ( w ⃗ T Φ ( s ⃗ , x ⃗ ) ) = arg ⁡ max ⁡ s ⃗ ∈ S n w ⃗ T Φ ( s ⃗ , x ⃗ ) = arg ⁡ max ⁡ s ⃗ ∈ S n w ⃗ T ( ∑ i ϕ ( s i − 1 , s i , x ⃗ ) ) = arg ⁡ max ⁡ s ⃗ ∈ S n ∑ i w ⃗ T ϕ ( s i − 1 , s i , x ⃗ ) \arg\max_{\vec{s}\in S^n} \ p(\vec{s}|\vec{x}) \\=\arg\max_{\vec{s}\in S^n} \frac{exp(\vec{w}^T\Phi(\vec{s},\vec{x}))}{\sum_{\vec{s'} \in S^n}exp(\vec{w}^T\Phi(\vec{s'},\vec{x}))} \\=\arg\max_{\vec{s}\in S^n} exp(\vec{w}^T\Phi(\vec{s},\vec{x})) \\=\arg\max_{\vec{s}\in S^n} \vec{w}^T\Phi(\vec{s},\vec{x}) \\=\arg\max_{\vec{s}\in S^n} \vec{w}^T(\sum_i \phi(s_{i-1},s_i, \vec{x})) \\=\arg\max_{\vec{s}\in S^n} \sum_i\vec{w}^T\phi(s_{i-1},s_i,\vec{x}) args Snmax p(s x )=args Snmaxs Snexp(w TΦ(s ,x ))exp(w TΦ(s ,x ))=args Snmaxexp(w TΦ(s ,x ))=args Snmaxw TΦ(s ,x )=args Snmaxw T(iϕ(si1,si,x ))=args Snmaxiw Tϕ(si1,si,x )

Viterbi算法

同样可以利用动态规划快速求解,我们首先定义一个动态规划表格 π ( n , s ) \pi(n,s) π(n,s),其含义是,以 s s s结尾长度为 n n n的最优序列,所谓的最优序列就是使得 ∑ i w ⃗ T ϕ ( s i − 1 , s i , x ⃗ ) \sum_i\vec{w}^T\phi(s_{i-1},s_i, \vec{x}) iw Tϕ(si1,si,x )取得最大值。则其递推方程如下:
π ( n , s ) = max ⁡ s ′ ∈ S { π ( n − 1 , s ′ ) + w ⃗ T ϕ ( s ′ , s , x ⃗ ) } \pi(n,s)=\max_{s'\in S}\{\pi(n-1,s')+\vec{w}^T\phi(s',s,\vec{x})\} π(n,s)=sSmax{π(n1,s)+w Tϕ(s,s,x )}
如果我们为每个训练数据加上人造初始状态 s 0 s_0 s0,那么该动态规划方程的初始解为:
π ( 1 , s 1 ) = w ⃗ T ϕ ( ∗ , s 1 , x ⃗ ) \pi(1,s_1)=\vec{w}^T\phi(*,s_1,\vec{x}) π(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) = best

maxVal = -Infinity
for s in S:
	val = pi(n, s) + w.dot(phi(s, STOP, x))
	if val > maxVal:
		bPtr(m+1,STOP) = s

因此我们可以非常迅速求解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》

  • 19
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值