本文主要介绍HMM和CRF两种模型。
一、HMM模型
我们以序列标注为例来引入HMM模型。
我们怎么产生一个句子,方法可以是先根据语法产生一个词性序列,然后由每个词性产生一个词(借助词典,这个词典是词性到词的映射,一个词性对应多个词)。如下示意图
这里我们就有了词序列和词性序列的pair
给一个词序列,那么产生该词序列的词性序列是什么呢?
上面的计算用到了贝叶斯条件概率公式。忽略分母
P(x)
P
(
x
)
,问题就转化为求联合概率P(x,y)上了,我们要找的词性序列y就是使得P(x,y)最大的那个y。
那么P(x,y)怎么算呢?
上式是建立在马尔可夫假设基础之上,即 1)
t
t
时刻的tag只收前一时刻 时刻的tag影响;2)
t
t
时刻的发射概率只受 时刻的tag影响。
上面的所有概率,比如
P(yi+1|yi)
P
(
y
i
+
1
|
y
i
)
,
P(xi|yi)
P
(
x
i
|
y
i
)
都是从训练数据中直接统计得到。
我们要找
ỹ
y
~
,使得
在计算的时候你可以穷举出所有可能的y,然后计算每个P(x|y),但是这样的y有可能非常的多,穷举的计算开销太大,这种方法失效,取而代之的是Viterbi Algorithm,该算法专门用来解决给定观测序列,求最有可能的隐藏序列的问题。
HMM存在的问题
HMM有“脑补问题“,HMM可能会给在training data中没见过的序列以很高的概率,参见下面的例子
我们假设transition probability和emission probability为
,
来做一个填空题
通过概率来算的话应该是V,但是在training data却有一个D的数据。这就是HMM的脑补现象。
HMM的脑补现象有时候是好事,比如你的训练数据很少。
HMM为什么会有这种脑补能力呢?是因为HMM的transition probability和emission probability是相互独立的。为了解决这个问题,你可以用更复杂的模型,使transition probability和emission probability是dependent的,但这些方法比较复杂,下面将要介绍的CRF,虽然transition probability和emission probability也是相互独立的,但却可以解决问题。
二、CRF
1.CRF引入
如果说HMM是作用在序列上的朴素贝叶斯,那么CRF就是逻辑回归
—— John Lafferty
CRF和逻辑回归是什么关系?
逻辑回归表达式如下,
下图是一个CRF中的概率问题
可见二者的形式较为接近。
2.CRF模型参数、训练
我们假设联合概率
P(x,y)
P
(
x
,
y
)
满足
P(x,y)∝exp(w⋅ϕ(x,y))
P
(
x
,
y
)
∝
e
x
p
(
w
⋅
ϕ
(
x
,
y
)
)
,
其中
ϕ(x,y)
ϕ
(
x
,
y
)
是一个feature vector,
w
w
是一个weight vector,是需要从训练数据中学习的参数。
咋一看,你可能会觉得CRF和HMM根本不一样,但其实二者很像
从这里我们可以知道,
ϕ(x,y)
ϕ
(
x
,
y
)
就是
Ns,t(x,y)
N
s
,
t
(
x
,
y
)
、
Ns,s′(x,y)
N
s
,
s
′
(
x
,
y
)
这些,而
w
w
其实就是、
logP(s′|s)
l
o
g
P
(
s
′
|
s
)
。
在CRF模型中,
w
w
是作为参数,在训练的过程中进行优化的,这一点与HMM不同,HMM的、
logP(s′|s)
l
o
g
P
(
s
′
|
s
)
是直接从训练数据中统计得到,不需要优化。
CRF是怎么训练的呢?(HMM是没有训练过程的)
从上面的CRF的训练目标中我们可以也可以从中看出其与HMM的区别。HMM模型,我们找到使得
P(y|x)
P
(
y
|
x
)
最大的y,我们只考虑
P(x,y)
P
(
x
,
y
)
,而忽略条件概率的分母
P(x)
P
(
x
)
;而在CRF中,我并不忽略
P(x)
P
(
x
)
,我们的优化目标除了使得
P(x,y)
P
(
x
,
y
)
很大之外还要使得
P(x)
P
(
x
)
越小越好。
有了优化目标我们可以使用SGD来进行优化。
那我们来计算
∂On(w)∂ws,t
∂
O
n
(
w
)
∂
w
s
,
t
On(w)=logP(ŷ n|xn)=logP(ŷ n,xn)−log∑y′P(y′,xn)
O
n
(
w
)
=
l
o
g
P
(
y
^
n
|
x
n
)
=
l
o
g
P
(
y
^
n
,
x
n
)
−
l
o
g
∑
y
′
P
(
y
′
,
x
n
)
,我们先计算
∂logP(ŷ n,xn)∂ws,t
∂
l
o
g
P
(
y
^
n
,
x
n
)
∂
w
s
,
t
,后半部分的计算同理可得。
∂logP(ŷ n,xn)∂ws,t=∂log(exp(w∗ϕ(xn,ŷ n)))∂ws,t=∂(w∗ϕ(xn,ŷ n))∂ws,t=∂(ws,t∗Ns,t(xn,ŷ n))∂ws,t=Ns,t(xn,ŷ n)
∂
l
o
g
P
(
y
^
n
,
x
n
)
∂
w
s
,
t
=
∂
l
o
g
(
e
x
p
(
w
∗
ϕ
(
x
n
,
y
^
n
)
)
)
∂
w
s
,
t
=
∂
(
w
∗
ϕ
(
x
n
,
y
^
n
)
)
∂
w
s
,
t
=
∂
(
w
s
,
t
∗
N
s
,
t
(
x
n
,
y
^
n
)
)
∂
w
s
,
t
=
N
s
,
t
(
x
n
,
y
^
n
)
后半部分的计算按照同样的原理算完之后得到
怎么理解上式?如果(s,t)在训练数据
(xn,ŷ n)
(
x
n
,
y
^
n
)
出现,则增加
ws,t
w
s
,
t
,否则减小
ws,t
w
s
,
t
。
对于后半部分的
∑y′P(y′|xn)Ns,t(xn,y′)
∑
y
′
P
(
y
′
|
x
n
)
N
s
,
t
(
x
n
,
y
′
)
,李宏毅老师说可以通过
Viterbi algorithm进行计算,暂时没理解是怎么算的。
所以参数的迭代过程如下
CRF的inference和HMM相同,也是用的Viterbi Algorithm
三、CRF的一般化:从log-linear model到MEMMs、CRFs
1.log-linear model
x∈X
x
∈
X
是输入数据(例如word),
y∈Y
y
∈
Y
是label(比如名词、动词、介词),我们用
p(y|x)
p
(
y
|
x
)
来表示条件概率。我们定义一个feature vector
ϕ⎯⎯⎯:X×Y→ℝd
ϕ
_
:
X
×
Y
→
R
d
,我们还定义一个参数向量
w⎯⎯⎯∈ℝd
w
_
∈
R
d
。基于这些定义,我们有log-linear model
这公式看着很陌生,其实如果
w⎯⎯⎯=[1,1]
w
_
=
[
1
,
1
]
,而
ϕ⎯⎯⎯(x,y)=[logP(y),logP(x|y)]T
ϕ
_
(
x
,
y
)
=
[
l
o
g
P
(
y
)
,
l
o
g
P
(
x
|
y
)
]
T
,就变成了HMM~~
而在log-linear模型中,
w⎯⎯⎯
w
_
待估算的参数,而
ϕ⎯⎯⎯(x,y)
ϕ
_
(
x
,
y
)
可以是任意的形式。
模型的目标函数是log-likelihood 函数,
而最优的参数
w⎯⎯⎯
w
_
满足
那怎么找到最优的
w⎯⎯⎯
w
_
呢?
先把
w⎯⎯⎯
w
_
初始化为0向量,然后执行梯度上升
其中的梯度计算
形式上是和第二部分的梯度计算结果高度相似的。
2.MEMMs
maximum-entropy Markov models,即最大熵马尔可夫模型,它是以log-linear模型为基础。
x1,x2,...,xm
x
1
,
x
2
,
.
.
.
,
x
m
是输入序列,
s1,s2,...,sm
s
1
,
s
2
,
.
.
.
,
s
m
是状态序列,
我们对条件分布
p(s1,s2,...,sm|x1,x2,...,xm)
p
(
s
1
,
s
2
,
.
.
.
,
s
m
|
x
1
,
x
2
,
.
.
.
,
x
m
)
建模,对该分布进行分解
上面的(1)式是没问题的,在naive-bayes就曾见过类似的分解。
做一个微小的验证,(1)式的右边=
p(sm|s1,...,sm−1,x1,...,xm)∗p(sm−1|s1,...,sm−2,x1,...,xm)∗...∗p(s2|s1,x1,...,xm)∗p(s1|x1,...,xm)=p(s1,s2,...,sm|x1,x2,...,xm)
p
(
s
m
|
s
1
,
.
.
.
,
s
m
−
1
,
x
1
,
.
.
.
,
x
m
)
∗
p
(
s
m
−
1
|
s
1
,
.
.
.
,
s
m
−
2
,
x
1
,
.
.
.
,
x
m
)
∗
.
.
.
∗
p
(
s
2
|
s
1
,
x
1
,
.
.
.
,
x
m
)
∗
p
(
s
1
|
x
1
,
.
.
.
,
x
m
)
=
p
(
s
1
,
s
2
,
.
.
.
,
s
m
|
x
1
,
x
2
,
.
.
.
,
x
m
)
(2)式是加入了independence assumption,就像HMM那样,第
i
i
个位置的state只和位置的state有关。
基于上面的假设,我们有在每个位置
i
i
上的条件概率
可以看到在位置处,分母中的feature vector
ϕ⎯⎯⎯(x1,...,xm,i,si−1,si)
ϕ
_
(
x
1
,
.
.
.
,
x
m
,
i
,
s
i
−
1
,
s
i
)
和输入序列
x1,x2,...,xm
x
1
,
x
2
,
.
.
.
,
x
m
、位置
i
i
、、
si
s
i
四个元素有关。
ϕ⎯⎯⎯
ϕ
_
可以根据实际需要去定义,比如如果你认为
si−1
s
i
−
1
和
si
s
i
不会都为动词,那么你可以给
ϕ⎯⎯⎯(x1,...,xm,i,si−1,si)
ϕ
_
(
x
1
,
.
.
.
,
x
m
,
i
,
s
i
−
1
,
s
i
)
赋予一个很小的值,例如-10000。
MEMMs的decoding
与HMM类似,我们定义前向变量
π[j,s]
π
[
j
,
s
]
,它表示时刻
j
j
到达状态的最大概率
也就是
π[j,s] π [ j , s ] 的递推式为
所以如果把 p(s|s′,x1,...,xm) p ( s | s ′ , x 1 , . . . , x m )
终止处的判断也类似与HMM
3.CRFs
与MEMMs一样,我们对条件概率
p(s1...sm|x1...xm)=p(s⎯⎯|x⎯⎯)
p
(
s
1
.
.
.
s
m
|
x
1
.
.
.
x
m
)
=
p
(
s
_
|
x
_
)
建模
我们也定义feature vector
Φ⎯⎯⎯(x⎯⎯,s⎯⎯)∈ℝd
Φ
_
(
x
_
,
s
_
)
∈
R
d
,然后我们就有关于条件概率的计算
p(s⎯⎯|x⎯⎯;w⎯⎯⎯)=exp(w⎯⎯⎯⋅Φ⎯⎯⎯(x⎯⎯,s⎯⎯))∑s⎯⎯′exp(w⎯⎯⎯⋅Φ⎯⎯⎯(x⎯⎯,s⎯⎯′))
p
(
s
_
|
x
_
;
w
_
)
=
e
x
p
(
w
_
⋅
Φ
_
(
x
_
,
s
_
)
)
∑
s
_
′
e
x
p
(
w
_
⋅
Φ
_
(
x
_
,
s
_
′
)
)
这里的
Φ⎯⎯⎯
Φ
_
称为global feature vector(对比下下面的local feature vector),因为它扫描了整个序列
x⎯⎯
x
_
、
s⎯⎯
s
_
。那么怎么定义
Φ⎯⎯⎯
Φ
_
呢?
Φ⎯⎯⎯(x⎯⎯,s⎯⎯)=∑mj=1ϕ⎯⎯⎯(x⎯⎯,j,sj−1,sj)
Φ
_
(
x
_
,
s
_
)
=
∑
j
=
1
m
ϕ
_
(
x
_
,
j
,
s
j
−
1
,
s
j
)
这里的
ϕ⎯⎯⎯
ϕ
_
只是feature vector的一维,共有
d
d
维,
for ,第
k
k
个feature vector的定义为
这里的
Φk
Φ
k
称为local feature vector。
CRFs的decoding
我们的目标是找到最优的序列
s⎯⎯
s
_
,使得
继续推导
所以我们的目标就转换为寻找
s⎯⎯
s
_
,使得
成分
w⎯⎯⎯⋅ϕ⎯⎯⎯(x⎯⎯,j,sj−1,sj)
w
_
⋅
ϕ
_
(
x
_
,
j
,
s
j
−
1
,
s
j
)
可以为一种transition score,如果
sj−1
s
j
−
1
到
sj
s
j
的转换是合理的,相应地
w⎯⎯⎯⋅ϕ⎯⎯⎯(x⎯⎯,j,sj−1,sj)
w
_
⋅
ϕ
_
(
x
_
,
j
,
s
j
−
1
,
s
j
)
值会比较大,反之
w⎯⎯⎯⋅ϕ⎯⎯⎯(x⎯⎯,j,sj−1,sj)
w
_
⋅
ϕ
_
(
x
_
,
j
,
s
j
−
1
,
s
j
)
值会比较小。
与HMM、MEMMs类似,我们用viterb算法进行CRFs的decoding。
初始化
π[1,s]=w⎯⎯⎯⋅ϕ⎯⎯⎯(x⎯⎯,1,s0,s)
π
[
1
,
s
]
=
w
_
⋅
ϕ
_
(
x
_
,
1
,
s
0
,
s
)
,递推方法为
终止处
CRFs的参数估计
带正则的目标函数
我们要找到能够最大化目标函数的参数向量
w
w
用梯度上升方法进行优化,梯度的计算为
右边第一项很好算,第二项难算,用到动态规划。
四、总结
HMM是生成模型,而MEMMs和CRFs是判别模型
五、概率图模型的应用
1.jieba分词
原理是HMM
2.CRF++
CRF++是CRF算法实现效果最好的工具,他可以用来做序列标注、实体识别、分词等任务。
CRF++的训练数据是如下
这个数据有三列,第一列是词语,第二列是词性(不是必须的),第三列是标注,也是我们要预测的标签。
CRF++最重要的一块内容就是特征模版,特征模版中包含了用户自己定义的若干特征,特征主要包含两大类,即Unigram和Bigram。
如下是一组Unigram的例子
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U07:%x[-1,0]/%x[1,0]
U08:%x[0,1]
U09:%x[-1,1]/%x[0,1]
上面每一个元素称为一个特征模版?每一个特征模版都要去扫描整个句子,在句子的每一个位置,该特征模版都生成一个特征函数集合。
举例来说,我们假设有这样一个模版U10:%x[0,1]这个特征模版,它代表的是0行,1列的元素。这里的0行是相对概念(就是特征模版所扫描到的当前位置),1列是绝对位置,就是指的第2列。这个特征模版的含有是根据词语的词性去预测词语的标签。
我们假设当前输入的训练数据(一个句子)为
当我们扫描到句子的第一行时,我们生成如下一批特征函数
这些函数共有多少个?记第三列的标签共有个,该模版关注的输入数据(也就是第二列)去重后数据共有
N
N
个,那么该特征模版在第一行会产生个数值(0或1),
所以这个特征模版在整个句子上生成一个“特征矩阵“(里面的数字是我随便填的~)
上面只是一个特征模版的例子,那么你可以定义其他模版,比如你除了用第二列的词性预测标注外,你还需要第一列,即词汇本身,所以你还可以设计这样一个特征模版
UXX:%x[0,0],它会利用数据的第一列去生成特征。
再比如你可以设计特征模版UXX:%x[-1,1],它会关注上一个词的词性。
大部分情况下Unigram已经够了,而且生成的特征函数已经够多了。简单介绍一下Bigram,比如你建了一个B01:%x[0,1],它是要考虑当前行的标枪以及上一行的标签,生成如下特征函数
。
参考资料:
Log-Linear Models, MEMMs, and CRFs
Log-linear models and conditional random fields
conditional random fields:probability models for segmenting and labeling sequence data