隐马尔可夫模型
本文主要关注隐马尔可夫模型相关算法的数学概念,如果还不理解什么是隐马尔可夫模型可以参考博客一文搞懂HMM(隐马尔可夫模型)
隐马尔可夫模型(HMM)可以记为一个五元组 μ = ( S , K , A , B , π ) \mu = \left(S, K, A, B, \pi \right ) μ=(S,K,A,B,π) ,其中:
S 为状态的集合 StatusSet
K 为输出符号的集合(观察值集合 ObservedSet)
π \pi π 为初始状态的概率分布 InitStatus
A 为转移概率矩阵 TransProbMatrix
B 为发射概率矩阵 EmitProbMatrix
有时为了简便也将其记为三元组 μ = ( A , B , π ) \mu = \left(A, B, \pi \right) μ=(A,B,π) 。
马尔可夫模型可以用来模拟潜在事件随机生成表面事件的情况,给定模型 μ = ( A , B , π ) \mu = \left(A, B, \pi \right) μ=(A,B,π),观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT 可以由以下过程产生:
(1)根据初始状态的概率分布 π i \pi_i πi 选择一个初始状态 q 1 = s i q_1 = s_i q1=si
(2)设 t = 1 t=1 t=1
(3)根据状态 s i s_i si 的输出概率分布 b i ( k ) b_i(k) bi(k) 输出 O t = V k O_t=V_k Ot=Vk
(4)根据状态转移概率分布 a i j a_{ij} aij,将当前时刻 t t t 的状态转移到新的状态 q t + 1 = s j q_{t+1}=s_j qt+1=sj
(5) t = t + 1 t=t+1 t=t+1,如果 t < T t<T t<T,重复执行步骤(3)和(4),否则结束算法
三个基本问题
隐马尔可夫模型可以用于求解三个基本问题:
- 估计问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速地计算给定模型 μ \mu μ 的情况下,观察序列 O O O 的概率,即 P ( O ∣ μ ) P\left (O |\mu \right ) P(O∣μ) ?
- 序列问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速有效地选择在一定意义下「最优」的状态序列 Q = q 1 q 2 … q t Q = q_1q_2…q_t Q=q1q2…qt ,使得该状态序列「最好地解释」观察序列?
- 训练问题或参数估计问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT ,如何根据最大似然估计来求模型的参数值?即如何调节模型 μ = ( A , B , π ) \mu = \left( A, B, \pi \right) μ=(A,B,π) 的参数,使得 P ( O ∣ μ ) P\left (O |\mu \right ) P(O∣μ) 最大?
求解估计问题
给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,要快速地计算给定模型 μ \mu μ 的情况下,观察序列 O O O 的概率,即 P ( O ∣ μ ) P\left (O |\mu \right ) P(O∣μ) 。这就是解码(decoding)问题。
对于任意状态序列 Q = q 1 q 2 … q T Q = q_1q_2…q_T Q=q1q2…qT 有
(1-1)
P
(
O
∣
Q
,
μ
)
=
∏
t
=
1
T
−
1
P
(
O
t
∣
q
t
,
q
t
+
1
,
μ
)
=
b
q
1
(
O
1
)
×
b
q
2
(
O
2
)
×
⋅
⋅
⋅
b
q
T
(
O
T
)
\begin{aligned} P\left(O|Q,\mu\right) &= \prod_{t=1}^{T-1}P\left(O_t|q_t,q_{t+1},\mu \right) \\ &= b_{q_{1}}\left(O_1\right)\times b_{q_{2}}\left(O_2\right)\times \cdot \cdot \cdot b_{q_{T}}\left(O_T\right)\ \tag{1-1} \end{aligned}
P(O∣Q,μ)=t=1∏T−1P(Ot∣qt,qt+1,μ)=bq1(O1)×bq2(O2)×⋅⋅⋅bqT(OT) (1-1)
其中,
b
q
t
(
O
t
)
b_{q_t}\left(O_t\right)
bqt(Ot) 表示在状态
q
t
q_t
qt 输出观察值
O
t
O_t
Ot 的概率
根据初始状态到结束状态转移的过程,有
(1-2)
P
(
Q
∣
μ
)
=
π
q
1
a
q
1
q
2
a
q
2
q
3
⋅
⋅
⋅
a
q
T
−
1
q
T
P\left(Q|\mu\right)=\pi_{q_1}a_{q_1q_2}a_{q_2q_3}\cdot \cdot \cdot a_{q_{T-1}q_{T}} \tag{1-2}
P(Q∣μ)=πq1aq1q2aq2q3⋅⋅⋅aqT−1qT(1-2)
其中,
π
\pi
π 表示初始状态概率,
a
a
a 表示状态转移概率
根据条件概率公式:
(1-3)
P
(
O
,
Q
∣
μ
)
=
P
(
O
∣
Q
,
μ
)
P
(
Q
∣
μ
)
P\left(O,Q|\mu \right) = P\left(O|Q,\mu\right)P\left(Q|\mu\right)\tag{1-3}
P(O,Q∣μ)=P(O∣Q,μ)P(Q∣μ)(1-3)
由全概率公式:
(1-4)
P
(
O
∣
μ
)
=
∑
Q
P
(
O
,
Q
∣
μ
)
=
∑
Q
P
(
O
∣
Q
,
μ
)
P
(
Q
∣
μ
)
=
∑
Q
π
q
1
b
q
1
(
O
1
)
∏
t
=
1
T
−
1
a
q
t
q
t
+
1
b
q
t
+
1
(
O
t
+
1
)
\begin{aligned} P\left(O|\mu\right)&=\sum_{Q}P\left(O,Q|\mu\right)\\ &=\sum_{Q}P\left(O|Q,\mu\right)P\left(Q|\mu\right)\\ &=\sum_{Q}\pi_{q_1}b_{q_{1}}\left(O_1\right)\prod_{t=1}^{T-1}a_{q_{t}q_{t+1}}b_{q_{t+1}}\left(O_{t+1}\right) \tag{1-4} \end{aligned}
P(O∣μ)=Q∑P(O,Q∣μ)=Q∑P(O∣Q,μ)P(Q∣μ)=Q∑πq1bq1(O1)t=1∏T−1aqtqt+1bqt+1(Ot+1)(1-4)
从上述的推导中可以看出,要想算出
P
(
O
∣
μ
)
P\left (O |\mu \right )
P(O∣μ) 必须穷举所有可能的状态序列
Q
Q
Q 。如果模型
μ
=
(
A
,
B
,
π
)
\mu = \left ( A,B,\pi \right )
μ=(A,B,π) 中有
N
N
N 个不同的状态,观察序列长度为
T
T
T ,那么就有
N
T
N^T
NT 个可能的状态序列,计算量出现了「指数爆炸」。
前向算法
为此,人们提出了前向算法,利用动态规划解决这一问题,将时间复杂度降至 O ( N 2 T ) O\left(N^2T\right) O(N2T) 。
为了实现前向算法,需要定义一个前向变量 α t ( i ) \alpha_t \left(i \right) αt(i)
定义1-1 前向变量
α
t
(
i
)
\alpha_t(i)
αt(i) 是在时间
t
t
t 时 ,HMM 输出了序列
O
1
O
2
…
O
t
O_1O_2…O_t
O1O2…Ot ,并且位于状态
s
i
s_i
si 的概率:
(1-5)
α
t
(
i
)
=
P
(
O
1
O
2
…
O
t
,
q
t
=
s
i
∣
μ
)
\alpha_t(i)=P\left(O_1O_2…O_t,q_t=s_i|\mu\right)\tag{1-5}
αt(i)=P(O1O2…Ot,qt=si∣μ)(1-5)
前向算法算法的主要思想是,如果可以快速计算前向变量
α
t
(
i
)
\alpha_t(i)
αt(i) ,那么就可以根据
α
t
(
i
)
\alpha_t(i)
αt(i) 计算出
P
(
O
∣
μ
)
P\left (O |\mu \right )
P(O∣μ),因为
P
(
O
∣
μ
)
P\left (O |\mu \right )
P(O∣μ) 是在时间
T
T
T 时所有状态
q
T
q_T
qT 下观察到序列
O
=
O
1
O
2
…
O
t
O = O_1O_2…O_t
O=O1O2…Ot 的概率之和:
(1-6)
P
(
O
∣
μ
)
=
∑
s
i
P
(
O
1
O
2
⋅
⋅
⋅
O
T
,
q
t
=
s
i
∣
μ
)
=
∑
i
=
1
N
α
T
(
i
)
\begin{aligned} P\left(O|\mu \right)&=\sum_{s_i}P\left(O_1O_2\cdot\cdot \cdot O_T,q_t=s_i|\mu\right) \\ &=\sum_{i=1}^{N}\alpha_T(i) \tag{1-6} \end{aligned}
P(O∣μ)=si∑P(O1O2⋅⋅⋅OT,qt=si∣μ)=i=1∑NαT(i)(1-6)
在前向算法中,采用动态规划的方法计算前向变量
α
t
(
i
)
\alpha_t(i)
αt(i),其思想基于如下观察:在时间
t
+
1
t+1
t+1 的前向变量可以根据在时间
t
t
t 时的前向变量
α
t
(
1
)
\alpha_t(1)
αt(1),
α
t
(
2
)
\alpha_t(2)
αt(2), … ,
α
t
(
N
)
\alpha_t(N)
αt(N) 的值来归纳计算:
(1-7)
α
t
+
1
(
j
)
=
(
∑
i
=
1
N
α
t
(
i
)
a
i
j
)
b
j
(
O
t
+
1
)
\alpha_{t+1}\left(j\right)=\left(\sum_{i=1}^{N}\alpha_t(i)a_{ij}\right)b_j\left(O_{t+1}\right) \tag{1-7}
αt+1(j)=(i=1∑Nαt(i)aij)bj(Ot+1)(1-7)
从初始时间到
t
+
1
t+1
t+1 时间,MHH 到达状态
j
j
j ,并输出观察序列
O
1
O
2
…
O
t
+
1
O_1O_2…O_{t+1}
O1O2…Ot+1 的过程可以分为两个步骤:
(1)从初始时间开始到时间 t t t 时,MHH 到达状态 i i i ,并输出观察序列 O 1 O 2 … O 1 O_1O_2…O_{1} O1O2…O1
(2)从状态 i i i 转移到状态 j j j,并在状态 j j j 输出 O t + 1 O_{t+1} Ot+1
这里 s i s_i si 可以是 HMM 的任意状态。根据前向变量的定义,完成第一步的概率就是 α t ( i ) \alpha_{t}(i) αt(i) ,而实现第二步的概率为 a i j × b j ( O t + 1 ) a_{ij}\times b_j(O_{t+1}) aij×bj(Ot+1) ,由于 HMM 可以从不同的状态 i i i 转移到状态 j j j ,因此可得式(1-7)。
根据式(1-7) 给出的归纳关系,可以按时间顺序依次计算 α 1 ( x ) \alpha_1(x) α1(x), α 2 ( x ) \alpha_2(x) α2(x), … , α T ( x ) \alpha_T(x) αT(x) , x x x 为 HMM 的状态变量。由此,得到如下前向算法:
(1)初始化: α 1 ( i ) = π i b i ( O 1 ) , 1 ≤ i ≤ N \alpha_1(i)=\pi_ib_i(O_1),1\leq i\leq N α1(i)=πibi(O1),1≤i≤N
(2)归纳计算:
α
t
+
1
(
j
)
=
(
∑
i
=
1
N
α
t
(
i
)
a
i
j
)
b
j
(
O
t
+
1
)
,
1
≤
t
≤
T
−
1
\alpha_{t+1}\left(j\right)=\left(\sum_{i=1}^{N}\alpha_t(i)a_{ij}\right)b_j\left(O_{t+1}\right) ,1\leq t\leq T-1
αt+1(j)=(i=1∑Nαt(i)aij)bj(Ot+1),1≤t≤T−1
(3)求和:
P
(
O
∣
μ
)
=
∑
t
=
1
N
α
T
(
i
)
P(O|\mu)=\sum_{t=1}^N\alpha_T(i)
P(O∣μ)=t=1∑NαT(i)
在初始化步骤中,
π
i
\pi_i
πi 是初始状态
s
i
s_i
si 的概率,
b
i
(
O
1
)
b_i(O_1)
bi(O1) 是在
s
i
s_i
si 状态输出
O
1
O_1
O1 的概率。一共有
N
N
N 个状态, 因此需要初始化
N
N
N 个前向变量
α
1
(
s
1
)
\alpha_1(s_1)
α1(s1),
α
1
(
s
2
)
\alpha_1(s_2)
α1(s2), … ,
α
1
(
s
N
)
\alpha_1(s_N)
α1(sN)。
由于每计算一个 α t ( i ) \alpha_t(i) αt(i) 必须考虑 t − 1 t-1 t−1 时所有 N N N 个状态转移到状态 s i s_i si 的可能性,其时间复杂度为 O ( N ) O(N) O(N) 。在每个单位时间 t t t 内有 N N N 个前向变量,时间复杂度为 N × O ( N ) = O ( N 2 ) N\times O(N) = O(N^2) N×O(N)=O(N2) 。在 t = 1 , 2 , … , T t=1,2,…,T t=1,2,…,T 的过程中要计算 T T T 次,因此总的时间复杂度为 T × O ( N 2 ) = O ( N 2 T ) T\times O(N^2) = O(N^2T) T×O(N2)=O(N2T)
后向算法
对于求解 HMM 中的第一个问题,即在给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速计算 P ( O ∣ μ ) P\left (O |\mu \right ) P(O∣μ) 的问题还可以采用另外一种实现方法,即后向算法。
对应于前向变量,可定义一个后向变量 β t ( i ) \beta_t(i) βt(i)
定义 1-2:后向变量
β
t
(
i
)
\beta_t(i)
βt(i) 是在给定了模型
μ
=
(
A
,
B
,
π
)
\mu = \left ( A,B,\pi \right )
μ=(A,B,π) ,并且在时间
t
t
t 状态为
s
i
s_i
si 的条件下,HMM 输出观察序列
O
t
+
1
O
t
+
2
…
O
T
O_{t+1}O_{t+2}…O_T
Ot+1Ot+2…OT 的概率:
(1-8)
β
t
(
i
)
=
p
(
O
t
+
1
O
t
+
2
…
O
T
∣
q
t
=
s
i
,
μ
)
,
\beta_t(i)=p\left(O_{t+1}O_{t+2}…O_T|q_t = s_i,\mu\right),\tag{1-8}
βt(i)=p(Ot+1Ot+2…OT∣qt=si,μ),(1-8)
与计算前向变量一样,可以用动态规划的算法计算后向变量。在时间
t
t
t 时,状态为
s
i
s_i
si 的条件下,HMM 输出观察序列
O
t
+
1
O
t
+
2
…
O
T
O_{t+1}O_{t+2}…O_T
Ot+1Ot+2…OT 的过程可以分为一下两个步骤:
(1)在时间 t t t 到时间 t + 1 t+1 t+1 ,HMM 由状态 s i s_i si 到状态 s j s_j sj ,并从 s j s_j sj 输出 O T + 1 O_{T+1} OT+1
(2)在时间 t + 1 t+1 t+1 的状态为 s j s_j sj 的条件下,HMM输出观察序列 O t + 2 … O T O_{t+2}…O_T Ot+2…OT
第一步中输出
O
t
+
1
O_{t+1}
Ot+1 的概率为:
a
i
j
×
b
j
(
O
t
1
)
a_{ij}\times b_j(O_{t_1})
aij×bj(Ot1) ;第二步中根据后向变量的定义,HMM输出观察序列为
O
t
+
2
…
O
T
O_{t+2}…O_T
Ot+2…OT 的概率就说后向变量
β
t
+
1
(
j
)
\beta_{t+1}(j)
βt+1(j) 。可得如下归纳关系:
(1-9)
β
t
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
(
O
t
+
1
)
β
t
+
1
(
j
)
\beta_t(i)= \sum_{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j)\tag{1-9}
βt(i)=j=1∑Naijbj(Ot+1)βt+1(j)(1-9)
根据后向变量的归纳关系,按
T
,
T
−
1
,
…
,
2
,
1
T, T-1, … , 2, 1
T,T−1,…,2,1 的顺序依次计算
β
T
(
x
)
,
β
T
−
1
(
x
)
,
…
,
β
1
x
\beta_T(x), \beta_{T-1}(x), … , \beta_1{x}
βT(x),βT−1(x),…,β1x (
x
x
x 为 HMM 的状态变量),就可以得到整个观察序列
O
=
O
1
O
2
…
O
T
O= O_1O_2…O_{T}
O=O1O2…OT 的概率。可使用如下算法表示:
算法 1-2 后向算法
(1)初始化: β T ( i ) = 1 , 1 ≤ i ≤ N \beta_T(i)=1, 1\leq i\leq N βT(i)=1,1≤i≤N
(2)归纳计算:
(1-10)
β
t
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
(
O
t
+
1
)
β
t
+
1
(
j
)
,
T
−
1
≥
t
≥
1
;
1
≤
i
≤
N
\beta_t(i)= \sum_{j=1}^{N}a_{ij}b_j(O_{t+1})\beta_{t+1}(j),T-1 \geq t\geq1;1\leq i\leq N \tag{1-10}
βt(i)=j=1∑Naijbj(Ot+1)βt+1(j),T−1≥t≥1;1≤i≤N(1-10)
(3)求和:
P
(
O
∣
μ
)
=
∑
i
=
1
N
π
i
b
i
(
O
1
)
β
1
(
i
)
P(O|\mu)=\sum_{i=1}^{N}\pi_ib_i(O_1)\beta_1(i)
P(O∣μ)=i=1∑Nπibi(O1)β1(i)
由前向算法可知,后向算法的时间复杂度也是
O
(
N
2
T
)
O(N^2T)
O(N2T)。
更一般地,可以采用前向算法和后向算法相结合的方法来计算观察序列的概率:
(1-11)
P
(
O
,
q
t
=
s
i
∣
μ
)
=
P
(
O
1
⋅
⋅
⋅
O
T
,
q
t
=
s
i
∣
μ
)
=
P
(
O
1
⋅
⋅
⋅
O
t
,
q
t
=
s
i
∣
μ
)
×
P
(
O
t
+
1
⋅
⋅
⋅
O
T
∣
O
1
⋅
⋅
⋅
O
t
,
q
t
=
s
i
∣
μ
)
=
P
(
O
1
⋅
⋅
⋅
O
t
,
q
t
=
s
i
∣
μ
)
×
P
(
O
t
+
1
⋅
⋅
⋅
O
T
∣
q
t
=
s
i
∣
μ
)
=
α
t
(
i
)
β
t
(
i
)
\begin{aligned} P(O,q_t=s_i|\mu) &= P(O_1 \cdot\cdot\cdot O_T,q_t = s_i|\mu)\\ &=P(O_1 \cdot\cdot\cdot O_t,q_t = s_i|\mu)\times P(O_{t+1} \cdot\cdot\cdot O_{T}|O_1 \cdot\cdot\cdot O_t,q_t = s_i|\mu)\\ &=P(O_1 \cdot\cdot\cdot O_t,q_t = s_i|\mu)\times P(O_{t+1} \cdot\cdot\cdot O_{T}|q_t = s_i|\mu)\\ &= \alpha_t(i)\beta_t(i) \tag{1-11} \end{aligned}
P(O,qt=si∣μ)=P(O1⋅⋅⋅OT,qt=si∣μ)=P(O1⋅⋅⋅Ot,qt=si∣μ)×P(Ot+1⋅⋅⋅OT∣O1⋅⋅⋅Ot,qt=si∣μ)=P(O1⋅⋅⋅Ot,qt=si∣μ)×P(Ot+1⋅⋅⋅OT∣qt=si∣μ)=αt(i)βt(i)(1-11)
因此
(1-12)
P
(
O
∣
μ
)
=
∑
i
=
1
N
α
t
(
i
)
β
t
(
i
)
,
1
≤
t
≤
T
P(O|\mu)=\sum_{i=1}^{N}\alpha_t(i)\beta_t(i) ,1\leq t\leq T\tag{1-12}
P(O∣μ)=i=1∑Nαt(i)βt(i),1≤t≤T(1-12)
参考资料
宗成庆. 统计自然语言处理(第2版). 统计自然语言处理. 2008.
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。欢迎转载,演绎,但是必须保留本文的链接,不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。