条件随机场(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,....,sn∣x1,x2,...,xn)=i=1∏np(si∣s1,s2,...,si−1,x1,x2,...,xn)=i=1∏np(si∣si−1,x1,x2,...,xn)=i=1∏n∑s′∈Sexp(wTf(s′,si−1,x))exp(wTf(si,si−1,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(si∣si−1,x1,x2,...,xn)=∑s′∈Sexp(wTf(s′,si−1,x))exp(wTf(si,si−1,x))
其中
f
(
s
i
,
s
i
−
1
,
x
⃗
)
f(s_i,s_{i-1},\vec{x})
f(si,si−1,x)是特征函数,作用是将当前状态和上一状态连同输入映射为一个数值向量:
f
(
s
i
,
s
i
−
1
,
x
⃗
)
→
R
d
f(s_i,s_{i-1},\vec{x}) \rightarrow R^d
f(si,si−1,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(s1∣s1,x)=∑s′∈s1,s2exp(wTf(s′,s1,x))exp(wTf(s1,s1,x))p(s2∣s1,x)=∑s′∈s1,s2exp(wTf(s′,s1,x))exp(wTf(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(s1∣s2,x)=∑s′∈s1,...,s5exp(wTf(s′,s2,x))exp(wTf(s1,s2,x))p(s2∣s2,x)=∑s′∈s1,...,s5exp(wTf(s′,s2,x))exp(wTf(s2,s2,x))...p(s5∣s2,x)=∑s′∈s1,...,s5exp(wTf(s′,s2,x))exp(wTf(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(rib∣x)=p(r∣∗,x)p(i∣r,x)p(b∣i,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(rob∣x)=p(r∣∗,x)p(o∣r,x)p(b∣o,x)
注意到
p
(
b
∣
i
,
x
)
=
p
(
b
∣
o
,
x
)
=
1
p(b|i,x)=p(b|o,x)=1
p(b∣i,x)=p(b∣o,x)=1,因为这些状态的转移都只有一条边,所以必然转移到下一个状态,那么只要训练数据中rob更加多,也就是
p
(
i
∣
r
,
x
)
<
p
(
o
∣
r
,
x
)
p(i|r,x)<p(o|r,x)
p(i∣r,x)<p(o∣r,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(wTΦ(s′,x))exp(wTΦ(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
∣S∣n,对于这种指数增长问题,在实际应用中一般都是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∑ϕ(si−1,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(si−1,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=i∑Nlog p(si∣xi)=i∑Nlog ∑s′∈Snexp(wTΦ(s′,xi))exp(wTΦ(si,xi))=i∑Nlog ∑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})
∂wj∂L=i∑NΦj(si,xi)−i∑N∑s′∈Snexp(∑kwkΦk(s′,xi))∑s′∈Snexp(∑kwkΦk(s′,xi))Φj(si,xi)=i∑NΦj(si,xi)−i∑Ns′∈Sn∑p(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∈Sn∑p(s∣x)Φj(s,x)=s∈Sn∑p(s∣x)k∑ϕj(sk−1,sk,x)=k∑s∈Sn∑p(s∣x)ϕj(sk−1,sk,x)=k∑a∈S,b∈S∑ϕj(sk−1=a,sk=b,x)s∈Sn,sk=b,sk−1=a∑p(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,sk−1=a∑p(s1,s2,...,si−1,si,...,sn∣x)=s∈Sn,sk=b,sk−1=a∑p(s1,s2,...,sk−1,sk,...,sn∣x)=p(sk−1=a,sk=b∣x)
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(wTΦ(s′,x))exp(wTΦ(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∈Sn∑exp(wTΦ(s,x))=s∈Sn∑exp(k∑wkj∑ϕk(sj−1,sj,x))=s∈Sn∑exp(j∑k∑wkϕk(sj−1,sj,x))=s∈Sn∑j∏exp(k∑wkϕk(sj−1,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}))
ψ(sj−1,sj)=exp(k∑wkϕk(sj−1,sj,x))
那么
ψ
(
s
j
−
1
,
s
j
)
\psi(s_{j-1},s_j)
ψ(sj−1,sj)就是链式CRF图模型的一个因子,
s
j
−
1
,
s
j
s_{j-1},s_j
sj−1,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)=s1∑s2∑...sn∑j=1∏n+1ψ(sj−1,sj)=s1∑s2∑...sn∑ψ(s0=∗,s1)ψ(s1,s2)...ψ(sn−1,sn)ψ(sn,sn+1=STOP)=[sn∑ψ(sn,STOP)[sn−1∑ψ(sn−1,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)=[sk−1∑ψ(sk−1,sk)[sk−2∑ψ(sk−2,sk−1)...[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)=sk−1∑ψ(sk−1,sk)α(sk−1)
因此有:
ψ
(
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)=s1∑s2∑...sn∑j=1∏n+1ψ(sj−1,sj)=s1∑s2∑...sn∑ψ(∗,s1)ψ(s1,s2)...ψ(sn−1,sn)ψ(sn,STOP)=[s1∑ψ(∗,s1)[s2∑ψ(s1,s2)...[sn−1∑ψ(sn−2,sn−1)[sn∑ψ(sn−1,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)...[sn−1∑ψ(sn−2,sn−1)[sn∑ψ(sn−1,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)
β(sk−1)=sk∑ψ(sk−1,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)=[sk−1∑ψ(sk−1,sk)[sk−2∑ψ(sk−2,sk−1)...[s1∑ψ(s1,s2)ψ(∗,s1)]...]∗[sk+1∑ψ(sk,sk+1)...[sn−1∑ψ(sn−2,sn−1)[sn∑ψ(sn−1,sn)ψ(sn,STOP)]...]/ψ(x)=ψ(x)∑s1∑s2...∑sk−1∑sk+1...∑sn∏jψ(sj−1,sj,x)=p(sk∣x)
也既是:
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(sk∣x)=ψ(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(sk−1,sk∣x)=ψ(x)α(sk−1)ψ(sk−1,sk)β(sk)
由于能高效求出
α
,
β
\alpha,\beta
α,β,边缘概率
p
(
s
k
−
1
,
s
k
∣
x
⃗
)
p(s_{k-1},s_k|\vec{x})
p(sk−1,sk∣x)也可高效求出,那么我们可以精确高效地求出梯度!
只要能快速求解梯度,接下来我们就可以利用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∈Snmax∑s′∈Snexp(wTΦ(s′,x))exp(wTΦ(s,x))=args∈Snmaxexp(wTΦ(s,x))=args∈SnmaxwTΦ(s,x)=args∈SnmaxwT(i∑ϕ(si−1,si,x))=args∈Snmaxi∑wTϕ(si−1,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})
∑iwTϕ(si−1,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)=s′∈Smax{π(n−1,s′)+wTϕ(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)=wTϕ(∗,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》