什么是条件随机场?
Random指的隐藏状态随机变量Y和观测状态随机变量X。
Conditional指条件概率,所以CRF是一个判别式模型 (discriminative model)。而生成式模型则计算联合概率分布。
关于生成模型和判别模型:
生成模型VS判别模型
机器学习面试之生成模型VS判别模型
前言
对于序列标注模型,输入一个文本序列,输出标注结果。在HMM和CRF模型中,输入的文本序列对应观测序列,标注结果对应隐藏状态,所以模型的目的是根据观测序列计算隐藏状态。
隐马尔科夫模型HMM (生成模型)
以词性标注任务为例,给定一个观测序列即输入文本X,计算输出词性序列Y
P
(
Y
∣
X
)
=
P
(
X
∣
Y
)
∗
P
(
Y
)
P
(
X
)
P
(
X
,
Y
)
=
P
(
X
∣
Y
)
P
(
Y
)
=
∏
i
=
1
n
p
(
x
i
∣
Y
)
∗
P
(
Y
)
=
∏
i
=
1
n
p
(
x
i
∣
y
i
)
∗
P
(
Y
)
=
p
(
y
1
)
∗
p
(
y
1
∣
x
1
)
∏
i
=
2
n
p
(
x
i
∣
y
i
)
∗
p
(
y
i
∣
y
i
−
1
)
P(Y|X)=\frac{P(X|Y)*P(Y)}{P(X)}\\ P(X,Y)=P(X|Y)P(Y)\\ =\prod_{i=1}^{n}p(x_i|Y)*P(Y)\\ =\prod_{i=1}^{n}p(x_i|y_i)*P(Y)\\ =p(y_1)*p(y_1|x_1)\prod_{i=2}^{n}p(x_i|y_i)*p(y_i|y_{i-1})
P(Y∣X)=P(X)P(X∣Y)∗P(Y)P(X,Y)=P(X∣Y)P(Y)=i=1∏np(xi∣Y)∗P(Y)=i=1∏np(xi∣yi)∗P(Y)=p(y1)∗p(y1∣x1)i=2∏np(xi∣yi)∗p(yi∣yi−1)
上述公式每一步对应一个假设
- 由输入词间的条件独立性得到 ∏ i = 1 n p ( x i ∣ Y ) \prod_{i=1}^{n}p(x_i|Y) ∏i=1np(xi∣Y)
- 当前观测结果只与当前隐层状态有关 ∏ i = 1 n p ( x i ∣ y i ) \prod_{i=1}^{n}p(x_i|y_i) ∏i=1np(xi∣yi), p ( x i ∣ y i ) p(x_i|y_i) p(xi∣yi)为发射概率(emission probabilities )。
- 马尔科夫假设,每一个隐层状态仅与上一个隐层状态有关 p ( y i ∣ y i − 1 ) p(y_i|y_{i-1}) p(yi∣yi−1), p ( y i ∣ y i − 1 ) p(y_i|y_{i-1}) p(yi∣yi−1)为转移概率(transition probabilities),例如介词后面跟一个名词,则转移概率高。
CRF
CRF使用feature function来更抽象的表达特征,使得它不再局限于HMM的两类特征。特征函数可以表示为
f
(
x
,
i
,
y
i
,
y
i
−
1
)
f(x, i, y_i, y_{i-1})
f(x,i,yi,yi−1),其中X表示输入序列,i表示当前位置,
y
i
y_i
yi表示当前状态,在linear-chain CRF中
y
i
−
1
y_{i-1}
yi−1表示前一个状态。
我们赋予每个特征函数一个权重
λ
j
\lambda_j
λj,给定一个输入序列,我们累加所有输入加权的特征值标注
y
y
y:
s
c
o
r
e
(
y
∣
x
)
=
∑
j
=
1
m
∑
i
=
1
n
λ
j
f
j
(
x
,
i
,
y
i
,
y
i
−
1
)
score(y|x)=\sum_{j=1}^{m}\sum_{i=1}^{n}\lambda_jf_j(x,i,y_i,y_{i-1})
score(y∣x)=∑j=1m∑i=1nλjfj(x,i,yi,yi−1)
最终可以得到一条输出
y
y
y的概率值(0~1)
p
(
y
∣
x
)
=
e
x
p
[
s
c
o
r
e
(
y
∣
x
)
]
∑
y
′
e
x
p
[
s
c
o
r
e
(
y
′
∣
x
)
]
=
e
x
p
[
∑
j
=
1
m
∑
i
=
1
n
λ
j
f
j
(
x
,
i
,
y
i
,
y
i
−
1
)
]
∑
y
′
e
x
p
[
∑
j
=
1
m
∑
i
=
1
n
λ
j
f
j
(
x
,
i
,
y
′
i
,
y
′
i
−
1
)
]
p(y|x)=\frac{exp[score(y|x)]}{\sum_{y'}exp[score(y'|x)]}=\frac{exp[\sum_{j=1}^{m}\sum_{i=1}^{n}\lambda_jf_j(x,i,y_i,y_{i-1})]}{\sum_{y'}exp[\sum_{j=1}^{m}\sum_{i=1}^{n}\lambda_jf_j(x,i,{y'}_i,{y'}_{i-1})]}
p(y∣x)=∑y′exp[score(y′∣x)]exp[score(y∣x)]=∑y′exp[∑j=1m∑i=1nλjfj(x,i,y′i,y′i−1)]exp[∑j=1m∑i=1nλjfj(x,i,yi,yi−1)]
特征函数举例
我们以英文单词的词性建模,这里举例的特征函数不仅仅局限于线性链CRF:
- 如果满足条件:当前英文单词以 ‘ly’ 结尾 && 特征函数标注
y
i
y_i
yi为副词
则记 f 1 ( x , i , y i , y i − 1 ) = 1 e l s e 0 f_1(x,i,y_i,y_{i-1})=1\ \ else \ 0 f1(x,i,yi,yi−1)=1 else 0,则控制该特征函数的权重 λ 1 \lambda_1 λ1倾向一个大的正值,因为以 ‘ly’ 结尾通常为副词。 - 如果满足条件:当前位置为1 && 输入的结尾是问好 && 特征函数标注
y
i
y_i
yi为动词
则记 f 2 ( x , i , y i , y i − 1 ) = 1 e l s e 0 f_2(x,i,y_i,y_{i-1})=1\ else\ 0 f2(x,i,yi,yi−1)=1 else 0,则控制该特征函数的权重 λ 2 \lambda_2 λ2倾向一个大的正值。例如 “Is this a sentence beginning with a verb?” - 如果满足条件:
y
i
−
1
y_{i-1}
yi−1为形容词 &&
y
i
y_i
yi为名词
则记 f 3 ( x , i , y i , y i − 1 ) = 1 e l s e 0 f_3(x,i,y_i,y_{i-1})=1\ \ else \ 0 f3(x,i,yi,yi−1)=1 else 0,则控制该特征函数的权重 λ 3 \lambda_3 λ3倾向一个大的正值,因为形容词后面通常跟名词。 - 如果满足条件:
y
i
−
1
y_{i-1}
yi−1为介词 &&
y
i
y_i
yi为介词
则记 f 4 ( x , i , y i , y i − 1 ) = 1 e l s e 0 f_4(x,i,y_i,y_{i-1})=1\ \ else \ 0 f4(x,i,yi,yi−1)=1 else 0,则控制该特征函数的权重 λ 4 \lambda_4 λ4为一个负值,因为介词通常后面不再跟介词。
假定输入为n,一条路径的score包含n个位置的多个特征函数的计算,要将每条路径输出一个概率,则需累加所有路径的exp[score],通过 e x p [ s c o r e ( y ) ] ∑ e x p [ s c o r e ( y ′ ) ] \frac{exp[score(y)]}{\sum exp[score(y')]} ∑exp[score(y′)]exp[score(y)]计算一个概率值(0~1)。
逻辑回归
CRF概率的形式 p ( l ∣ x ) = e x p [ ∑ j = 1 m ∑ i = 1 n λ j f j ( x , i , y i , y i − 1 ) ] ∑ y ′ e x p [ ∑ j = 1 m ∑ i = 1 n λ j f j ( x , i , y ′ i , y ′ i − 1 ) ] p(l|x)=\frac{exp[\sum_{j=1}^{m}\sum_{i=1}^{n}\lambda_jf_j(x,i,y_i,y_{i-1})]}{\sum_{y'}exp[\sum_{j=1}^{m}\sum_{i=1}^{n}\lambda_jf_j(x,i,{y'}_i,{y'}_{i-1})]} p(l∣x)=∑y′exp[∑j=1m∑i=1nλjfj(x,i,y′i,y′i−1)]exp[∑j=1m∑i=1nλjfj(x,i,yi,yi−1)]看起来很像逻辑回归,CRF实际上是基础的逻辑回归的序列化版本,逻辑回归是一个log-linear的分类模型,CRF是一个log-linear的序列模型。
HMM
根据前面对HMM的介绍,HMM模型可以定义为
p
(
y
1
)
∗
∏
i
p
(
x
i
∣
y
i
)
∗
p
(
y
i
∣
y
i
−
1
)
p(y_1)*\prod_{i}p(x_i|y_i)*p(y_i|y_{i-1})
p(y1)∗∏ip(xi∣yi)∗p(yi∣yi−1)
将上式取log得
log
p
(
y
,
x
)
=
log
p
(
l
1
)
+
∑
i
log
p
(
y
i
∣
y
i
−
1
)
+
∑
i
log
p
(
y
i
∣
x
i
)
\log{p(y,x)}=\log{p(l_1)}+\sum_i\log{p(y_i|y_{i-1})}+\sum_i\log{p(y_i|x_i)}
logp(y,x)=logp(l1)+∑ilogp(yi∣yi−1)+∑ilogp(yi∣xi),我们可以构建一个等效于HMM的CRF模型:
- 对于转移概率 p ( y i = b ∣ y i − 1 = a ) p(y_i=b|y_{i-1}=a) p(yi=b∣yi−1=a),当 y i = b , y i − 1 = a y_i=b,y_{i-1}=a yi=b,yi−1=a时我们定义一组CRF转移特征函数 f ( a , b ) ( x , i , y i , y i − 1 ) = 1 f_{(a,b)}(x,i,y_i,y_{i-1})=1 f(a,b)(x,i,yi,yi−1)=1,赋予特征函数的权重 λ ( a , b ) = log p ( y i = a ∣ y i − 1 = b ) \lambda_{(a,b)}=\log{p(y_i=a|y_{i-1}=b)} λ(a,b)=logp(yi=a∣yi−1=b)
- 对于发射概率 p ( x i = c ∣ y i = b ) p(x_i=c|y_i=b) p(xi=c∣yi=b),当 y i = b , x i = c y_i=b,x_i=c yi=b,xi=c时定义一组发射特征函数 g ( x , y ) ( x , i , y i , y i − 1 ) = 1 g_{(x,y)}(x,i,y_i,y_{i-1})=1 g(x,y)(x,i,yi,yi−1)=1,赋予特征函数的权重 λ ( c , b ) = log p ( x i = c ∣ y i = b ) \lambda_{(c,b)}=\log{p(x_i=c|y_i=b)} λ(c,b)=logp(xi=c∣yi=b)
这样,计算的score
p
(
y
∣
x
)
p(y|x)
p(y∣x)成比例关联于HMM的结果。
CRF优于HMM的原因是:
- CRF可以构建更多丰富的特征,HMM只能构建二元转移和发射特征,CRF可以使用全局的特征,例如上述CRF特征函数举例2。
- CRF特征函数的权重不受限制,HMM的概率需要满足一定的约束: 0 < = p ( x i ∣ y i ) < = 1 , ∑ x p ( x i = x ∣ y 1 ) = 1 0<=p(x_i|y_i)<=1,\ \sum_xp(x_i=x|y_1)=1 0<=p(xi∣yi)<=1, ∑xp(xi=x∣y1)=1
学习CRF的参数
采用梯度下降学习CRF的特征函数的权重。首先,随机初始化CRF模型的权重,采用梯度更新算法更新权重。
对于每一个样本
- 计算特征权重 λ i \lambda_i λi的梯度 ∂ ∂ w j log p ( y ∣ x ) = ∑ j = 1 m f i ( x , j , y j , y j − 1 ) − ∑ y ′ ∑ j = 1 m f i ( x , j , y j ′ , y j − 1 ′ ) \frac{\partial}{\partial{w_j}}\log{p(y|x)}=\sum_{j=1}^mf_i(x,j,y_j,y_{j-1})-\sum_{y'}\sum_{j=1}^{m}f_i(x,j,y'_j,y'_{j-1}) ∂wj∂logp(y∣x)=∑j=1mfi(x,j,yj,yj−1)−∑y′∑j=1mfi(x,j,yj′,yj−1′)
- 更新权重 λ i = λ i + α [ ∑ j = 1 m f i ( x , j , y j , y j − 1 ) − ∑ y ′ ∑ j = 1 m f i ( x , j , y j ′ , y j − 1 ′ ) ] \lambda_i=\lambda_i+\alpha[\sum_{j=1}^mf_i(x,j,y_j,y_{j-1})-\sum_{y'}\sum_{j=1}^{m}f_i(x,j,y'_j,y'_{j-1})] λi=λi+α[∑j=1mfi(x,j,yj,yj−1)−∑y′∑j=1mfi(x,j,yj′,yj−1′)]
CRF实现细节
CRF的计算难点在于分母归一化因子的计算(配分函数),这里推导一下计算的细节。
假定标签数为2,序列长度为3,计算归一化因子。在CRF模型中,只考虑了临近标签的联系,所有归一化因子包含的路径数应为
2
3
=
8
2^3=8
23=8条。我们按时刻t计算不同标签(记为k)的的归一化因子
Z
t
(
k
)
Z_t^{(k)}
Zt(k),
Z
t
=
Z
t
(
1
)
+
Z
t
(
2
)
+
.
.
.
+
Z
t
(
k
)
Z_t=Z_t^{(1)}+Z_t^{(2)}+...+Z_t^{(k)}
Zt=Zt(1)+Zt(2)+...+Zt(k),
Z
t
(
k
)
Z_t^{(k)}
Zt(k)分别是截止到当前时刻
t
t
t、以标签
1
,
2
,
.
.
.
k
1,2,...k
1,2,...k为终点的所有路径的得分指数和。接下来,我们具体计算一下:
记编码模型(RNN、CNN)对位置
t
t
t标签k的打分为
h
t
(
k
)
h_t^{(k)}
ht(k),标签
i
i
i到
j
j
j的转移概率
g
i
j
g_{ij}
gij
位置1:
初始 Z t ( k ) Z_t^{(k)} Zt(k)采用模型编码分 h t k h_t^{k} htk
位置2
Z 2 ( 1 ) = log ( e [ Z 1 ( 1 ) + g 11 ] + e [ Z 1 ( 2 ) + g 21 ] ) + h 2 ( 1 ) = log ( e [ Z 1 ( 1 ) + g 11 + h 2 ( 1 ) ] + e [ Z 1 ( 2 ) + g 21 + h 2 ( 1 ) ] ) Z 2 ( 2 ) = log ( e [ Z 1 ( 1 ) + g 12 ] + e [ Z 1 ( 2 ) + g 22 ] ) + h 2 ( 2 ) = log ( e [ Z 1 ( 1 ) + g 12 + h 2 ( 2 ) ] + e [ Z 1 ( 2 ) + g 22 + h 2 ( 2 ) ] ) Z_2^{(1)}=\log{(e^{[Z_1^{(1)}+g_{11}]} + e^{[Z_1^{(2)}+g_{21}]})}+h_2^{(1)}=\log{(e^{[Z_1^{(1)}+g_{11}+h_2^{(1)}]} + e^{[Z_1^{(2)}+g_{21}+h_2^{(1)}]})}\\ Z_2^{(2)}=\log{(e^{[Z_1^{(1)}+g_{12}]} + e^{[Z_1^{(2)}+g_{22}]})}+h_2^{(2)}=\log{(e^{[Z_1^{(1)}+g_{12}+h_2^{(2)}]} + e^{[Z_1^{(2)}+g_{22}+h_2^{(2)}]})} Z2(1)=log(e[Z1(1)+g11]+e[Z1(2)+g21])+h2(1)=log(e[Z1(1)+g11+h2(1)]+e[Z1(2)+g21+h2(1)])Z2(2)=log(e[Z1(1)+g12]+e[Z1(2)+g22])+h2(2)=log(e[Z1(1)+g12+h2(2)]+e[Z1(2)+g22+h2(2)])
位置3
Z
3
(
1
)
=
log
(
e
[
Z
2
(
1
)
+
g
11
+
h
3
(
1
)
]
+
e
[
Z
3
(
2
)
+
g
21
+
h
3
(
1
)
]
)
Z
3
(
2
)
=
log
(
e
[
Z
2
(
1
)
+
g
12
+
h
3
(
2
)
]
+
e
[
Z
3
(
2
)
+
g
22
+
h
3
(
2
)
]
)
Z_3^{(1)}=\log{(e^{[Z_2^{(1)}+g_{11}+h_3^{(1)}]} + e^{[Z_3^{(2)}+g_{21}+h_3^{(1)}]})}\\ Z_3^{(2)}=\log{(e^{[Z_2^{(1)}+g_{12}+h_3^{(2)}]} + e^{[Z_3^{(2)}+g_{22}+h_3^{(2)}]})}
Z3(1)=log(e[Z2(1)+g11+h3(1)]+e[Z3(2)+g21+h3(1)])Z3(2)=log(e[Z2(1)+g12+h3(2)]+e[Z3(2)+g22+h3(2)])
然后将
Z
2
(
1
)
,
Z
2
(
2
)
Z_2^{(1)}, Z_2^{(2)}
Z2(1),Z2(2)带入上式
Z
3
(
1
)
=
log
(
e
[
Z
1
(
1
)
+
g
11
+
h
2
(
1
)
+
g
11
+
h
3
(
1
)
]
+
e
[
Z
1
(
2
)
+
g
21
+
h
2
(
1
)
+
g
11
+
h
3
(
1
)
]
)
+
e
[
Z
1
(
1
)
+
g
12
+
h
2
(
2
)
+
g
21
+
h
3
(
1
)
]
)
+
e
[
Z
1
(
2
)
+
g
22
+
h
2
(
2
)
+
g
21
+
h
3
(
1
)
]
)
Z_3^{(1)}=\log{(e^{[Z_1^{(1)}+g_{11}+h_2^{(1)}+g_{11}+h_3^{(1)}]} + e^{[Z_1^{(2)}+g_{21}+h_2^{(1)}+g_{11}+h_3^{(1)}]})+ e^{[Z_1^{(1)}+g_{12}+h_2^{(2)}+g_{21}+h_3^{(1)}]})} + e^{[Z_1^{(2)}+g_{22}+h_2^{(2)}+g_{21}+h_3^{(1)}]})
Z3(1)=log(e[Z1(1)+g11+h2(1)+g11+h3(1)]+e[Z1(2)+g21+h2(1)+g11+h3(1)])+e[Z1(1)+g12+h2(2)+g21+h3(1)])+e[Z1(2)+g22+h2(2)+g21+h3(1)])
同理可以计算
Z
3
(
2
)
Z_3^{(2)}
Z3(2),这里就不重复写了。
总结
- 每一步实际通过 logsumexp \text{logsumexp} logsumexp 来累加到一个节点 Z t ( k ) Z_t^{(k)} Zt(k)的所有路径指数和。
- 编码模型分 h t ( k ) h_t^{(k)} ht(k)也可以提前指数相加进来。
CRF实现分词
分享一个CNN+CRF实现的中文分词的例子:CNN+CRF实现分词,采用的Bakeoff 2005语料,包含keras和torch两种实现方式。
简明条件随机场CRF介绍(附带纯Keras实现)
Advanced NLP: Conditional Random Fields
CRF主体参考 Introduction to Conditional Random Fields
知乎点赞排前2的回答 如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?