隐马尔可夫模型——求解估计问题

本文聚焦隐马尔可夫模型相关算法的数学概念,介绍了其五元组或三元组表示。阐述了隐马尔可夫模型可求解的三个基本问题,重点讲解了求解估计问题的前向算法和后向算法,利用动态规划降低计算复杂度,时间复杂度均为O(N2T),还提及可结合两种算法计算观察序列概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

隐马尔可夫模型

本文主要关注隐马尔可夫模型相关算法的数学概念,如果还不理解什么是隐马尔可夫模型可以参考博客一文搞懂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=O1O2OT 可以由以下过程产生:

(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 &lt; T t&lt;T t<T,重复执行步骤(3)和(4),否则结束算法

三个基本问题

隐马尔可夫模型可以用于求解三个基本问题:

  1. 估计问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速地计算给定模型 μ \mu μ 的情况下,观察序列 O O O 的概率,即 P ( O ∣ μ ) P\left (O |\mu \right ) P(Oμ)
  2. 序列问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2OT 和模型 μ = ( A , B , π ) \mu = \left ( A,B,\pi \right ) μ=(A,B,π) ,如何快速有效地选择在一定意义下「最优」的状态序列 Q = q 1 q 2 … q t Q = q_1q_2…q_t Q=q1q2qt ,使得该状态序列「最好地解释」观察序列?
  3. 训练问题或参数估计问题:给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2OT ,如何根据最大似然估计来求模型的参数值?即如何调节模型 μ = ( 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=O1O2OT 和模型 μ = ( 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=q1q2qT

(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) &amp;= \prod_{t=1}^{T-1}P\left(O_t|q_t,q_{t+1},\mu \right) \\ &amp;= 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(OQ,μ)=t=1T1P(Otqt,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μ)=πq1aq1q2aq2q3aqT1qT(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(OQ,μ)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)&amp;=\sum_{Q}P\left(O,Q|\mu\right)\\ &amp;=\sum_{Q}P\left(O|Q,\mu\right)P\left(Q|\mu\right)\\ &amp;=\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μ)=QP(O,Qμ)=QP(OQ,μ)P(Qμ)=Qπq1bq1(O1)t=1T1aqtqt+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 O1O2Ot ,并且位于状态 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(O1O2Ot,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=O1O2Ot 的概率之和:
(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)&amp;=\sum_{s_i}P\left(O_1O_2\cdot\cdot \cdot O_T,q_t=s_i|\mu\right) \\ &amp;=\sum_{i=1}^{N}\alpha_T(i) \tag{1-6} \end{aligned} P(Oμ)=siP(O1O2OT,qt=siμ)=i=1Nα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=1Nα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} O1O2Ot+1 的过程可以分为两个步骤:

(1)从初始时间开始到时间 t t t 时,MHH 到达状态 i i i ,并输出观察序列 O 1 O 2 … O 1 O_1O_2…O_{1} O1O2O1

(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),1iN

(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=1Nαt(i)aij)bj(Ot+1),1tT1
(3)求和:
P ( O ∣ μ ) = ∑ t = 1 N α T ( i ) P(O|\mu)=\sum_{t=1}^N\alpha_T(i) P(Oμ)=t=1Nα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 t1 时所有 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=O1O2OT 和模型 μ = ( 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+2OT 的概率:
(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+2OTqt=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+2OT 的过程可以分为一下两个步骤:

(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+2OT

第一步中输出 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+2OT 的概率就说后向变量 β 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=1Naijbj(Ot+1)βt+1(j)(1-9)
根据后向变量的归纳关系,按 T , T − 1 , … , 2 , 1 T, T-1, … , 2, 1 T,T1,,2,1 的顺序依次计算 β T ( x ) , β T − 1 ( x ) , … , β 1 x \beta_T(x), \beta_{T-1}(x), … , \beta_1{x} βT(x),βT1(x),,β1x x x x 为 HMM 的状态变量),就可以得到整个观察序列 O = O 1 O 2 … O T O= O_1O_2…O_{T} O=O1O2OT 的概率。可使用如下算法表示:

算法 1-2 后向算法

(1)初始化: β T ( i ) = 1 , 1 ≤ i ≤ N \beta_T(i)=1, 1\leq i\leq N βT(i)=1,1iN

(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=1Naijbj(Ot+1)βt+1(j),T1t1;1iN(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=1Nπ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) &amp;= P(O_1 \cdot\cdot\cdot O_T,q_t = s_i|\mu)\\ &amp;=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)\\ &amp;=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)\\ &amp;= \alpha_t(i)\beta_t(i) \tag{1-11} \end{aligned} P(O,qt=siμ)=P(O1OT,qt=siμ)=P(O1Ot,qt=siμ)×P(Ot+1OTO1Ot,qt=siμ)=P(O1Ot,qt=siμ)×P(Ot+1OTqt=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=1Nαt(i)βt(i),1tT(1-12)

参考资料

宗成庆. 统计自然语言处理(第2版). 统计自然语言处理. 2008.

知识共享许可协议
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。欢迎转载,演绎,但是必须保留本文的链接,不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值