读者可以去我的github阅读一份可读性高的HMM用于NER识别的代码,欢迎点star,欢迎fork
一、HMM基本概念的介绍
以一个例子介绍HMM,可以避开抽象的定义:
例如:N个袋子,每个袋子中有M种不同颜色的球。一实验员根据某一概率分布选择一个袋子,然后根据袋子中不同颜色球的概率分布随机取出一个球,并报告该球的颜色。对局外人:可观察的过程是不同颜色球的序列,而袋子的序列是不可观察的。每只袋子对应HMM中的一个状态;球的颜色对应于HMM中状态的输出。
状态转移概率矩阵为
A
=
a
i
j
A = a_{ij}
A=aij,
a
i
j
a_{ij}
aij为实验员从一只袋子(状态
s
i
s_i
si) 转向另一只袋子(状态
S
j
S_j
Sj ) 取球的概率。
从状态
S
j
S_j
Sj 观察到某一特定符号
v
k
v_k
vk 的概率分布矩阵为:
B
=
b
j
(
k
)
B=b_j(k)
B=bj(k)
其中,
b
j
(
k
)
b_j(k)
bj(k)为实验员从第
j
j
j个袋子中取出第
k
k
k种颜色的球的概率。
为了方便,一般将HMM记为: μ = ( A , B , π ) \mu = (A,B,\pi) μ=(A,B,π)
HMM的三个问题:
- 在给定模型 μ = ( A , B , π ) \mu =(A, B, \pi) μ=(A,B,π) 和观察序列 O = O 1 , O 2 … O T O=O_1,O_2…O_T O=O1,O2…OT的情况下,怎样快速计算概率 p ( O ∣ μ ) p(O|\mu) p(O∣μ)?
- 在给定模型 μ = ( A , B , π ) \mu=(A, B,\pi) μ=(A,B,π)和观察序列 O = O 1 , O 2 … O T O=O_1,O_2…O_T O=O1,O2…OT的情况下,如何选择在一定意义下“最优”的状态序列 Q = q 1 , q 2 , . . . , q T Q = q_1, q_2,...,q_T Q=q1,q2,...,qT,使得该状态序列“最好地解释”观察序列?
- 给定一个观察序列 O = O 1 , O 2 , … , O T O=O_1,O_2,…,O_T O=O1,O2,…,OT ,如何根据最大似然估计来求模型的参数值?即如何调节模型的参数,使得 p ( O ∣ μ ) p(O|\mu) p(O∣μ)最大?
二、 HMM第一个问题的求解
p ( O ∣ μ ) p(O|\mu) p(O∣μ)可以由如下式计算
p ( O ∣ μ ) = ∑ Q p ( O , Q ∣ μ ) = ∑ Q p ( Q ∣ μ ) ∗ p ( O ∣ Q , μ ) p(O|\mu) = \sum_Q p(O,Q|\mu) = \sum_Qp(Q|\mu)*p(O|Q,\mu) p(O∣μ)=Q∑p(O,Q∣μ)=Q∑p(Q∣μ)∗p(O∣Q,μ)
其中
P ( Q ∣ μ ) = π q 1 ∗ a q 1 q 2 ∗ a q 2 q 3 ∗ . . . ∗ a q T − 1 q T P(Q|\mu) = \pi_{q_1}*a_{q_1q_2}*a_{q_2q_3}*...*a_{q_{T-1}q_T} P(Q∣μ)=πq1∗aq1q2∗aq2q3∗...∗aqT−1qT
p
(
O
∣
Q
,
μ
)
=
b
q
1
(
O
1
)
∗
b
q
2
(
O
2
)
∗
.
.
.
∗
b
q
T
(
O
T
)
p(O|Q,\mu) = b_{q_1}(O_1)*b_{q_2}(O_2)*...*b_{q_T}(O_T)
p(O∣Q,μ)=bq1(O1)∗bq2(O2)∗...∗bqT(OT)
相当于对所有Q的可能性的求和。
遍历计算复杂度太高,利用动态规划降低复杂度。
α
t
(
i
)
=
p
(
O
1
O
2
.
.
.
O
t
,
q
t
=
S
i
∣
μ
)
\alpha_t(i) = p(O_1O_2...O_t,q_t = S_i|\mu)
αt(i)=p(O1O2...Ot,qt=Si∣μ)
如果可以高效地计算
α
t
(
i
)
\alpha_t(i)
αt(i),就可以高效地求得
P
(
O
∣
μ
)
P(O|\mu)
P(O∣μ)
事实上有如下递推公式:
α
t
+
1
(
j
)
=
[
∑
i
=
1
N
α
t
(
i
)
a
i
j
]
∗
b
j
(
O
t
+
1
)
\alpha_{t+1}(j) = [\sum_{i=1}^N \alpha_t(i)a_{ij}]*b_j(O_{t+1})
αt+1(j)=[∑i=1Nαt(i)aij]∗bj(Ot+1)
三、 HMM第二个问题的求解
问题二的本质是如何发现最优状态序列去最好地解释观察序列
一种解释是:状态序列中每个状态都单独地具有概率,对于每个时刻t,寻找 q t q_t qt使得 γ t ( i ) = p ( q t = S i ∣ O , μ ) 最 大 \gamma_t(i) = p(q_t = S_i|O,\mu)最大 γt(i)=p(qt=Si∣O,μ)最大
另一种解释:在给定模型
μ
\mu
μ 和观察序列
O
O
O的条件下求概率最大的状态序列:
Q
~
=
a
r
g
m
a
x
p
(
Q
∣
O
,
μ
)
\tilde Q = arg max p(Q|O,\mu)
Q~=argmaxp(Q∣O,μ)
Viterbi算法:动态规划最优状态序列
定义:Viterbi 变量是在时间
δ
t
(
i
)
\delta_t(i)
δt(i)时,模型沿着某一条路径到达
S
i
S_i
Si,输出观察序列$O=O_1O_2 …O_t $的最大概率为:
δ
t
(
i
)
=
q
1
,
q
2
,
.
.
.
,
q
t
−
1
m
a
x
p
(
q
1
,
q
2
,
.
.
.
,
q
t
=
S
i
,
O
1
O
2
.
.
.
O
t
∣
μ
)
\delta_t(i) = \mathop{}_{q_1,q_2,...,q_{t-1}}^{max} p(q_1,q_2,...,q_t = S_i,O_1O_2...O_t|\mu)
δt(i)=q1,q2,...,qt−1maxp(q1,q2,...,qt=Si,O1O2...Ot∣μ)
递归算法: δ t + 1 ( i ) = j m a x [ δ t ( j ) ⋅ a j i ] ⋅ b i ( O t + 1 ) \delta_{t+1}(i) = \mathop{}_j^{max}[\delta_t(j)\cdot a_{ji}]\cdot b_i(O_{t+1}) δt+1(i)=jmax[δt(j)⋅aji]⋅bi(Ot+1)
解释一下这个式子:
模型沿着某一条路径到达
S
i
+
1
S_{i+1}
Si+1,输出观察序列
O
=
O
1
O
2
.
.
.
O
t
+
1
O = O_1O_2...O_{t+1}
O=O1O2...Ot+1的最大概率为在t时刻到达状态中选取使此式概率最大的j,因此最大概率之间构成递推关系,我们可以用Viterbi算法去求解。
四、HMM第三个问题的求解:
参数学习
给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT,如何根据最大似然估计来求模型的参数值?或者说如何调节模型 μ \mu μ的参数,使得 p ( O ∣ μ ) p(O|\mu) p(O∣μ) 最大?即估计模型中的 π i , a i j , b j ( k ) \pi_i, a_{ij}, b_j(k) πi,aij,bj(k)使得观察序列O的概率$p(O|\mu) $最大。
即通过观察序列去重建模型中的参数
如果产生观察序列 O O O 的状态 Q = q 1 q 2 … q T Q = q_1q_2…q_T Q=q1q2…qT 已知(即存在大量标注的样本),可以用最大似然估计来计算 μ \mu μ的参数:
各估计如下:
p
~
i
=
δ
(
q
1
,
S
i
)
\tilde p_i = \delta(q_1,S_i)
p~i=δ(q1,Si)
a ~ i j = Q 中 从 状 态 q i 转 移 到 q j 的 次 数 Q 中 所 有 从 状 态 q i 转 移 到 另 一 状 态 ( 包 括 q j 自 身 ) 的 总 数 = ∑ t = 1 T − 1 δ ( q t , S i ) ∗ δ ( q t + 1 , S j ) ∑ t = 1 T − 1 δ ( q t , S i ) \tilde a_{ij} =\frac{Q中从状态q_i转移到q_j的次数}{Q中所有从状态q_i转移到另一状态(包括q_j自身)的总数} =\frac{\sum_{t=1}^{T-1} \delta(q_t,S_i)*\delta(q_{t+1},S_j)}{\sum_{t=1}^{T-1} \delta(q_t,S_i)} a~ij=Q中所有从状态qi转移到另一状态(包括qj自身)的总数Q中从状态qi转移到qj的次数=∑t=1T−1δ(qt,Si)∑t=1T−1δ(qt,Si)∗δ(qt+1,Sj)
类似的:
b
~
j
(
k
)
=
Q
中
从
状
态
q
j
输
出
符
号
Q
到
达
q
j
地
总
次
数
=
∑
t
=
1
T
−
1
δ
(
q
t
,
S
j
)
∗
δ
(
O
t
,
v
k
)
∑
t
=
1
T
δ
(
q
t
,
S
i
)
\tilde b_j(k) =\frac{Q中从状态q_j输出符号}{Q到达q_j地总次数} = \frac{\sum_{t=1}^{T-1} \delta(q_t,S_j)*\delta(O_{t},v_k)}{\sum_{t=1}^{T} \delta(q_t,S_i)}
b~j(k)=Q到达qj地总次数Q中从状态qj输出符号=∑t=1Tδ(qt,Si)∑t=1T−1δ(qt,Sj)∗δ(Ot,vk)
其中, V k V_k Vk是模型输出符号集中地第k个符号。