本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

隐马尔可夫模型:当状态看不见

隐马尔可夫模型:当状态看不见

更新于 2026-04-23

回顾 Art. 14 算子全景的概念地图:

状态可观测状态隐藏
离散状态马尔可夫链(Art. 15 马尔可夫链)HMM ← 你在这里
连续状态线性动力系统(Art. 17 连续系统与 Kalman)Kalman 滤波(Art. 17 连续系统与 Kalman)

我们从”离散状态 + 可观测”向右移动一格,进入**“离散状态 + 隐藏”**的领域。核心变化:状态看不到了,只能通过噪声观测去推断。

上一篇中,马尔可夫链的一切都摆在明面上——我们直接看到系统处在哪个状态,转移矩阵 PP 乘一次就是执行一步,PnP^n 告诉我们 nn 步后的分布。但现实中,真正的系统状态往往是隐藏的。一个医生看不到病人体内的疾病进展(隐状态),只能通过症状和化验指标(观测)来推断;一段语音信号的底层音素序列(隐状态)不直接可见,我们只观测到声学特征。

这就是隐马尔可夫模型(Hidden Markov Model, HMM)的设定:系统仍然按马尔可夫链在离散状态间跳转,但我们看不到状态本身——只能看到每个状态随机”发射”出的一个观测符号。从观测序列倒推隐状态序列,本质上是一个矩阵-向量乘法链。

从天气到观测:给马尔可夫链加一层”面纱”

直觉构造

沿用 Art. 15 马尔可夫链 的天气模型,但做一个关键修改:假设你被关在屋子里,看不到外面的天气。你唯一能观察到的是一个朋友每天做了什么活动——散步、购物、或者打扫卫生。你知道朋友的活动跟天气有关(晴天更可能散步,雨天更可能打扫),但你无法直接看到天气。

现在有两层随机过程:

  1. 隐层:天气状态按马尔可夫链转移(晴天 → 雨天的概率,雨天 → 晴天的概率……)
  2. 观测层:每天的天气状态”发射”出一个你能看到的活动(晴天发射散步的概率、发射购物的概率……)

你的任务:从观测到的活动序列(散步、购物、打扫、打扫、散步……)推断背后最可能的天气序列。

与马尔可夫链的区别

马尔可夫链(Art. 15)HMM(本文)
状态直接可观测隐藏
观测就是状态本身由隐状态随机生成
核心矩阵转移矩阵 PP(一个)转移矩阵 AA + 发射矩阵 BB(两个)
核心问题稳态在哪?多快收敛?隐状态是什么?参数怎么学?

严格定义:HMM 的五元组 λ=(N,M,A,B,π)\lambda = (N, M, A, B, \boldsymbol{\pi})

一个 HMM 由以下五个要素完全确定(Rabiner, 1989):

1. 隐状态集合

S={s1,s2,…,sN}\mathcal{S} = \{s_1, s_2, \ldots, s_N\}

NN 个离散的隐状态。在天气模型中,N=2N = 2:S={Sunny,Rainy}\mathcal{S} = \{\text{Sunny}, \text{Rainy}\}。

2. 观测符号集合

V={v1,v2,…,vM}\mathcal{V} = \{v_1, v_2, \ldots, v_M\}

MM 个可能的观测符号。在天气模型中,M=3M = 3:V={Walk,Shop,Clean}\mathcal{V} = \{\text{Walk}, \text{Shop}, \text{Clean}\}。

3. 转移矩阵 AA

A∈RN×N,Aij=Pr⁡(Xt+1=sj∣Xt=si)A \in \mathbb{R}^{N \times N}, \quad A_{ij} = \Pr(X_{t+1} = s_j \mid X_t = s_i)

这就是 Art. 15 马尔可夫链 中的行随机矩阵——每行元素非负,行和为 1。AijA_{ij} 是从隐状态 sis_i 转移到隐状态 sjs_j 的概率。

符号说明:在 Art. 15 马尔可夫链 中我们用 PP 表示转移矩阵。HMM 文献中习惯用 AA 表示隐状态转移矩阵(以区分于其他矩阵)。两者是同一个概念:行随机矩阵,乘一次 = 隐状态执行一步转移。

天气模型的转移矩阵:

A=[0.70.30.40.6]A = \begin{bmatrix} 0.7 & 0.3 \\ 0.4 & 0.6 \end{bmatrix}

第一行:晴天 → 晴天 0.7,晴天 → 雨天 0.3。第二行:雨天 → 晴天 0.4,雨天 → 雨天 0.6。

4. 发射矩阵 BB(emission matrix)

B∈RN×M,Bik=Pr⁡(Ot=vk∣Xt=si)B \in \mathbb{R}^{N \times M}, \quad B_{ik} = \Pr(O_t = v_k \mid X_t = s_i)

BikB_{ik} 是隐状态 sis_i 发射观测符号 vkv_k 的概率。同样是行随机的:每行元素非负,行和为 1。这是 HMM 相对于马尔可夫链的核心新增。

天气模型的发射矩阵:

B=[0.60.30.10.10.40.5]B = \begin{bmatrix} 0.6 & 0.3 & 0.1 \\ 0.1 & 0.4 & 0.5 \end{bmatrix}

第一行(晴天发射):散步 0.6,购物 0.3,打扫 0.1。第二行(雨天发射):散步 0.1,购物 0.4,打扫 0.5。

5. 初始分布 π\boldsymbol{\pi}

π∈RN,πi=Pr⁡(X0=si)\boldsymbol{\pi} \in \mathbb{R}^N, \quad \pi_i = \Pr(X_0 = s_i)

t=0t = 0 时刻各隐状态的概率分布。天气模型中,π=(0.6,0.4)\boldsymbol{\pi} = (0.6, 0.4)。

生成过程

一个 HMM 按以下过程生成长度为 TT 的观测序列 O=(o0,o1,…,oT−1)O = (o_0, o_1, \ldots, o_{T-1}):

  1. 按 π\boldsymbol{\pi} 采样初始隐状态 X0X_0
  2. 按 BX0,⋅B_{X_0, \cdot} 发射观测 o0o_0
  3. 对 t=1,2,…,T−1t = 1, 2, \ldots, T-1:
    • 按 AXt−1,⋅A_{X_{t-1}, \cdot} 采样下一个隐状态 XtX_t
    • 按 BXt,⋅B_{X_t, \cdot} 发射观测 oto_t

关键假设:

  • 隐层马尔可夫性:Pr⁡(Xt∣Xt−1,Xt−2,…)=Pr⁡(Xt∣Xt−1)\Pr(X_t \mid X_{t-1}, X_{t-2}, \ldots) = \Pr(X_t \mid X_{t-1})
  • 观测独立性:Pr⁡(ot∣X0,…,XT,o0,…)=Pr⁡(ot∣Xt)\Pr(o_t \mid X_0, \ldots, X_T, o_0, \ldots) = \Pr(o_t \mid X_t)——当前观测只依赖当前隐状态

下图展示了 HMM 的生成结构:上层(红色虚线框)是不可见的隐状态序列,按转移矩阵 AA 逐步跳转;下层是可观测的观测序列,由发射矩阵 BB 从隐状态随机生成。

HMM 生成模型:隐状态 + 观测层
隐状态按转移矩阵 A 跳转(水平箭头),每个隐状态按发射矩阵 B 发出观测(垂直箭头)
隐层观测层πX₀o₀BAX₁o₁X₂o₂X₃o₃不可见时间 t →

HMM 的三个基本问题

Rabiner (1989) 将 HMM 的核心应用归纳为三个基本问题:

问题名称输入输出算法
问题 1评估(Evaluation)模型 λ\lambda,观测序列 OOPr⁡(O∣λ)\Pr(O \mid \lambda)Forward(前向算法)
问题 2解码(Decoding)模型 λ\lambda,观测序列 OO最优隐状态序列 X∗X^*Viterbi 算法
问题 3学习(Learning)观测序列 OO最优参数 λ∗=(A,B,π)\lambda^* = (A, B, \boldsymbol{\pi})Baum-Welch(EM)

逐项理解:

  • 评估:给定模型和观测,这个观测序列出现的概率有多大?用于模型选择——比较多个候选模型,选概率最大的。
  • 解码:给定模型和观测,最可能的隐状态序列是什么?用于推断——从观测倒推隐状态。
  • 学习:只有观测数据,没有标注的隐状态——怎么学到模型参数?用于训练——无监督地从数据中学习。
HMM 的三个基本问题 (Rabiner, 1989)共同核心:矩阵-向量乘法链问题 1:评估ForwardΣ输入: 模型 λ + 观测 O输出: P(O|λ)问题 2:解码Viterbimax输入: 模型 λ + 观测 O输出: X* = argmax问题 3:学习Baum-WelchEM输入: 观测 O输出: λ* = (A,B,π)Forward 用 Σ (求和),Viterbi 用 max (取最大),Baum-Welch 两者结合 (EM)

这三个问题的算法有一个共同的数学核心:矩阵-向量乘法链。

问题 1:Forward 算法——矩阵乘法链

朴素方法:枚举所有路径

给定模型 λ\lambda 和观测序列 O=(o0,o1,…,oT−1)O = (o_0, o_1, \ldots, o_{T-1}),我们要计算:

Pr⁡(O∣λ)=∑所有隐状态序列 XPr⁡(O,X∣λ)\Pr(O \mid \lambda) = \sum_{\text{所有隐状态序列 } X} \Pr(O, X \mid \lambda)

对于每个具体的隐状态序列 X=(x0,x1,…,xT−1)X = (x_0, x_1, \ldots, x_{T-1}):

Pr⁡(O,X∣λ)=πx0⋅bx0(o0)⋅∏t=1T−1[axt−1,xt⋅bxt(ot)]\Pr(O, X \mid \lambda) = \pi_{x_0} \cdot b_{x_0}(o_0) \cdot \prod_{t=1}^{T-1} \left[ a_{x_{t-1}, x_t} \cdot b_{x_t}(o_t) \right]

逐项理解:

  • πx0\pi_{x_0}:初始隐状态为 x0x_0 的概率
  • bx0(o0)=Bx0,o0b_{x_0}(o_0) = B_{x_0, o_0}:隐状态 x0x_0 发射观测 o0o_0 的概率
  • axt−1,xt=Axt−1,xta_{x_{t-1}, x_t} = A_{x_{t-1}, x_t}:从 xt−1x_{t-1} 转移到 xtx_t 的概率
  • bxt(ot)b_{x_t}(o_t):隐状态 xtx_t 发射观测 oto_t 的概率

总共有 NTN^T 条可能的隐状态路径(每个时间步 NN 种选择,共 TT 步)。暴力枚举的复杂度是 O(NT)O(N^T)——指数级,对 T>20T > 20 就完全不可行。

Forward 算法:动态规划 + 矩阵乘法

关键观察:Pr⁡(O∣λ)\Pr(O \mid \lambda) 的计算可以利用马尔可夫性质递推,避免指数级枚举。

定义前向变量(forward variable):

αt(i)=Pr⁡(o0,o1,…,ot,Xt=si∣λ)\alpha_t(i) = \Pr(o_0, o_1, \ldots, o_t, X_t = s_i \mid \lambda)

即”观测到前 t+1t+1 个符号,且时刻 tt 处在隐状态 sis_i“的联合概率。

初始化(t=0t = 0):

α0(i)=πi⋅bi(o0),i=1,…,N\alpha_0(i) = \pi_i \cdot b_i(o_0), \quad i = 1, \ldots, N

即初始概率乘以发射概率。

递推(t=1,…,T−1t = 1, \ldots, T-1):

αt(j)=[∑i=1Nαt−1(i)⋅aij]⋅bj(ot)\alpha_t(j) = \left[\sum_{i=1}^{N} \alpha_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t)

逐项理解这个递推式:

  • αt−1(i)\alpha_{t-1}(i):上一步处在状态 sis_i 的前向概率
  • aija_{ij}:从 sis_i 转移到 sjs_j 的概率
  • ∑iαt−1(i)⋅aij\sum_i \alpha_{t-1}(i) \cdot a_{ij}:从所有可能的前一状态转移到 sjs_j 的概率加权和
  • 乘以 bj(ot)b_j(o_t):再乘以在状态 sjs_j 发射观测 oto_t 的概率

终止:

Pr⁡(O∣λ)=∑i=1NαT−1(i)\Pr(O \mid \lambda) = \sum_{i=1}^{N} \alpha_{T-1}(i)

矩阵形式:Forward 算法 = 矩阵-向量乘法链

把 αt\alpha_t 写成行向量 αt=[αt(1),αt(2),…,αt(N)]\boldsymbol{\alpha}_t = [\alpha_t(1), \alpha_t(2), \ldots, \alpha_t(N)]。递推式变成:

αt=(αt−1⋅A)⊙b(ot)\boldsymbol{\alpha}_t = (\boldsymbol{\alpha}_{t-1} \cdot A) \odot \mathbf{b}(o_t)

其中 ⊙\odot 是逐元素乘法(Hadamard 积),b(ot)=[B1,ot,B2,ot,…,BN,ot]\mathbf{b}(o_t) = [B_{1, o_t}, B_{2, o_t}, \ldots, B_{N, o_t}] 是各状态发射当前观测符号的概率向量。

更紧凑地,定义对角发射矩阵:

Dt=diag(B1,ot,B2,ot,…,BN,ot)D_t = \text{diag}(B_{1, o_t}, B_{2, o_t}, \ldots, B_{N, o_t})

则递推式变为纯矩阵乘法:

αtT=Dt⋅AT⋅αt−1T\boldsymbol{\alpha}_t^T = D_t \cdot A^T \cdot \boldsymbol{\alpha}_{t-1}^T

或者写成从左到右的形式:

αTT=DT−1ATDT−2AT⋯D1ATD0πT\boldsymbol{\alpha}_T^T = D_{T-1} A^T D_{T-2} A^T \cdots D_1 A^T D_0 \boldsymbol{\pi}^T

核心洞察:Forward 算法就是一条矩阵-向量乘法链。每一步做两件事:(1) 左乘转移矩阵 ATA^T——隐状态的概率传播,和 Art. 15 马尔可夫链 中 πt+1=πtP\boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P 完全一样;(2) 逐元素乘以发射概率 DtD_t——用观测证据”修正”概率。这个”传播 + 修正”的交替结构,正是 HMM 相对于普通马尔可夫链的核心新增。

下图把 Forward 算法的一步拆解为两个阶段——先”传播”(乘转移矩阵),再”修正”(乘发射概率)。这个结构在 Kalman 滤波(Art. 17)中会以”预测 + 更新”的形式再次出现。

Forward 算法的一步:"传播 + 修正"
先乘转移矩阵 A(概率传播),再逐元素乘发射概率 b(oₜ)(观测修正)
α꜀₋₁上一步的前向概率× A①传播α' = α꜀₋₁·A传播后的概率⊙ b(oₜ)②修正αₜ更新后的前向概率对比:马尔可夫链只有步骤①(πₜ = πₜ₋₁·P),HMM 新增步骤②这个"传播 + 修正"模式也是 Kalman 滤波(Art. 17)的核心结构

复杂度:每步递推是 O(N2)O(N^2)(矩阵-向量乘法),共 TT 步,总复杂度 O(N2T)O(N^2 T)——从指数级 O(NT)O(N^T) 降到了多项式级。对于 N=2,T=100N = 2, T = 100,这是从 2100≈10302^{100} \approx 10^{30} 降到 22×100=4002^2 \times 100 = 400。

Backward 算法

对称地,定义后向变量:

βt(i)=Pr⁡(ot+1,ot+2,…,oT−1∣Xt=si,λ)\beta_t(i) = \Pr(o_{t+1}, o_{t+2}, \ldots, o_{T-1} \mid X_t = s_i, \lambda)

即”给定时刻 tt 在状态 sis_i,未来观测序列出现的概率”。

初始化(t=T−1t = T-1):βT−1(i)=1\beta_{T-1}(i) = 1,对所有 ii。

递推(t=T−2,…,0t = T-2, \ldots, 0):

βt(i)=∑j=1Naij⋅bj(ot+1)⋅βt+1(j)\beta_t(i) = \sum_{j=1}^{N} a_{ij} \cdot b_j(o_{t+1}) \cdot \beta_{t+1}(j)

Forward 从前往后”推”概率,Backward 从后往前”拉”概率。两者结合给出任意时刻的后验概率:

γt(i)=Pr⁡(Xt=si∣O,λ)=αt(i)⋅βt(i)∑j=1Nαt(j)⋅βt(j)\gamma_t(i) = \Pr(X_t = s_i \mid O, \lambda) = \frac{\alpha_t(i) \cdot \beta_t(i)}{\sum_{j=1}^{N} \alpha_t(j) \cdot \beta_t(j)}

这个后验概率在 Baum-Welch 学习算法中至关重要。

数值例子:2 隐状态 × 3 观测符号的 Forward 算法

让我们用天气模型手算 Forward 算法。

模型参数:

  • 隐状态:S={S,R}\mathcal{S} = \{S, R\}(Sunny, Rainy),N=2N = 2
  • 观测符号:V={W,Sh,C}\mathcal{V} = \{W, Sh, C\}(Walk, Shop, Clean),M=3M = 3
  • A=[0.70.30.40.6]A = \begin{bmatrix}0.7 & 0.3\\0.4 & 0.6\end{bmatrix},B=[0.60.30.10.10.40.5]B = \begin{bmatrix}0.6 & 0.3 & 0.1\\0.1 & 0.4 & 0.5\end{bmatrix},π=(0.6,0.4)\boldsymbol{\pi} = (0.6, 0.4)

观测序列:O=(Walk,Shop,Clean)O = (\text{Walk}, \text{Shop}, \text{Clean}),即 (o0,o1,o2)=(W,Sh,C)(o_0, o_1, o_2) = (W, Sh, C)。

t=0t = 0:初始化

α0(S)=πS⋅bS(W)=0.6×0.6=0.36\alpha_0(S) = \pi_S \cdot b_S(W) = 0.6 \times 0.6 = 0.36 α0(R)=πR⋅bR(W)=0.4×0.1=0.04\alpha_0(R) = \pi_R \cdot b_R(W) = 0.4 \times 0.1 = 0.04

α0=(0.36,0.04)\boldsymbol{\alpha}_0 = (0.36, 0.04)。

直觉:看到”散步”后,晴天的概率远大于雨天——因为晴天散步的发射概率(0.6)远高于雨天散步(0.1)。

t=1t = 1:观测到 Shop

α1(S)=[α0(S)⋅aSS+α0(R)⋅aRS]⋅bS(Sh)\alpha_1(S) = [\alpha_0(S) \cdot a_{SS} + \alpha_0(R) \cdot a_{RS}] \cdot b_S(Sh) =[0.36×0.7+0.04×0.4]×0.3=[0.252+0.016]×0.3=0.268×0.3=0.0804= [0.36 \times 0.7 + 0.04 \times 0.4] \times 0.3 = [0.252 + 0.016] \times 0.3 = 0.268 \times 0.3 = 0.0804

α1(R)=[α0(S)⋅aSR+α0(R)⋅aRR]⋅bR(Sh)\alpha_1(R) = [\alpha_0(S) \cdot a_{SR} + \alpha_0(R) \cdot a_{RR}] \cdot b_R(Sh) =[0.36×0.3+0.04×0.6]×0.4=[0.108+0.024]×0.4=0.132×0.4=0.0528= [0.36 \times 0.3 + 0.04 \times 0.6] \times 0.4 = [0.108 + 0.024] \times 0.4 = 0.132 \times 0.4 = 0.0528

α1=(0.0804,0.0528)\boldsymbol{\alpha}_1 = (0.0804, 0.0528)。

用矩阵形式验证:

α0⋅A=(0.36,0.04)[0.70.30.40.6]=(0.36×0.7+0.04×0.4,  0.36×0.3+0.04×0.6)=(0.268,0.132)\boldsymbol{\alpha}_0 \cdot A = (0.36, 0.04) \begin{bmatrix}0.7 & 0.3\\0.4 & 0.6\end{bmatrix} = (0.36 \times 0.7 + 0.04 \times 0.4,\; 0.36 \times 0.3 + 0.04 \times 0.6) = (0.268, 0.132)

α1=(0.268,0.132)⊙(0.3,0.4)=(0.0804,0.0528)✓\boldsymbol{\alpha}_1 = (0.268, 0.132) \odot (0.3, 0.4) = (0.0804, 0.0528) \quad ✓

第一步乘以 AA(概率传播),第二步逐元素乘以发射概率(用观测修正)。

t=2t = 2:观测到 Clean

α1⋅A=(0.0804,0.0528)[0.70.30.40.6]=(0.0804×0.7+0.0528×0.4,  0.0804×0.3+0.0528×0.6)\boldsymbol{\alpha}_1 \cdot A = (0.0804, 0.0528) \begin{bmatrix}0.7 & 0.3\\0.4 & 0.6\end{bmatrix} = (0.0804 \times 0.7 + 0.0528 \times 0.4,\; 0.0804 \times 0.3 + 0.0528 \times 0.6) =(0.05628+0.02112,  0.02412+0.03168)=(0.07740,0.05580)= (0.05628 + 0.02112,\; 0.02412 + 0.03168) = (0.07740, 0.05580)

α2=(0.07740,0.05580)⊙(0.1,0.5)=(0.00774,0.02790)\boldsymbol{\alpha}_2 = (0.07740, 0.05580) \odot (0.1, 0.5) = (0.00774, 0.02790)

结果

Pr⁡(O∣λ)=α2(S)+α2(R)=0.00774+0.02790=0.03564\Pr(O \mid \lambda) = \alpha_2(S) + \alpha_2(R) = 0.00774 + 0.02790 = 0.03564

后验概率(归一化后的 α\alpha):

tt观测α^t(S)\hat{\alpha}_t(S)α^t(R)\hat{\alpha}_t(R)更可能的隐状态
0Walk0.9000.100Sunny
1Shop0.6040.396Sunny
2Clean0.2170.783Rainy

可以看到:看到”散步”后强烈倾向晴天;看到”购物”后仍然偏向晴天但不那么确定;看到”打扫”后转向雨天——每一步观测都在更新我们对隐状态的信念。

关键对比:在普通马尔可夫链(Art. 15)中,πt+1=πtP\boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P 只有”传播”步骤。在 HMM 中,多了一个”用观测修正”的步骤。这个”传播 + 修正”模式是所有贝叶斯滤波方法(HMM、Kalman、粒子滤波)的共同结构。

问题 2:Viterbi 算法——最优路径的动态规划

问题定义

给定模型 λ\lambda 和观测序列 OO,找到最可能的隐状态序列:

X∗=arg⁡max⁡XPr⁡(X∣O,λ)X^* = \arg\max_X \Pr(X \mid O, \lambda)

等价于:

X∗=arg⁡max⁡XPr⁡(O,X∣λ)X^* = \arg\max_X \Pr(O, X \mid \lambda)

Viterbi 算法

Viterbi (1967) 算法与 Forward 算法结构几乎相同,唯一区别是把求和换成取最大值。

定义:

δt(j)=max⁡x0,…,xt−1Pr⁡(o0,…,ot,X0=x0,…,Xt−1=xt−1,Xt=sj∣λ)\delta_t(j) = \max_{x_0, \ldots, x_{t-1}} \Pr(o_0, \ldots, o_t, X_0 = x_0, \ldots, X_{t-1} = x_{t-1}, X_t = s_j \mid \lambda)

即”到时刻 tt 为止、以状态 sjs_j 结尾的最优路径的概率”。

初始化(t=0t = 0):

δ0(i)=πi⋅bi(o0)\delta_0(i) = \pi_i \cdot b_i(o_0)

递推(t=1,…,T−1t = 1, \ldots, T-1):

δt(j)=max⁡1≤i≤N[δt−1(i)⋅aij]⋅bj(ot)\delta_t(j) = \max_{1 \leq i \leq N} \left[\delta_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t)

ψt(j)=arg⁡max⁡1≤i≤N[δt−1(i)⋅aij]\psi_t(j) = \arg\max_{1 \leq i \leq N} \left[\delta_{t-1}(i) \cdot a_{ij}\right]

ψt(j)\psi_t(j) 记录了到达 (t,j)(t, j) 的最优前驱状态——用于回溯(backtracking)。

终止:

xT−1∗=arg⁡max⁡1≤i≤NδT−1(i)x^*_{T-1} = \arg\max_{1 \leq i \leq N} \delta_{T-1}(i)

回溯(t=T−2,…,0t = T-2, \ldots, 0):

xt∗=ψt+1(xt+1∗)x^*_t = \psi_{t+1}(x^*_{t+1})

Forward vs. Viterbi:

  • Forward:αt(j)=[∑iαt−1(i)⋅aij]⋅bj(ot)\alpha_t(j) = \left[\sum_i \alpha_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t)——求和,得到边际概率
  • Viterbi:δt(j)=[max⁡iδt−1(i)⋅aij]⋅bj(ot)\delta_t(j) = \left[\max_i \delta_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t)——取最大,得到最优路径

结构完全一致,只是聚合操作不同。在对数域中,Viterbi 等价于最短路径问题。

Viterbi 解码:网格图上的最优路径SunnyRainyt=0Walkt=1Shopt=2CleanS0.3600R0.0400S0.0804R0.0528S0.0077R0.0279X* = (S, S, R)Forward: α_t(j) = [Σ_i α_{t-1}(i)·a_ij]·b_j(o_t) vs Viterbi: δ_t(j) = [max_i δ_{t-1}(i)·a_ij]·b_j(o_t)结构相同,只是把 Σ 换成 max + 回溯 (backtracking)

数值例子(续)

对同一个模型和观测序列 O=(W,Sh,C)O = (W, Sh, C),在对数域中计算:

t=0t = 0: δ0(S)=ln⁡(0.6)+ln⁡(0.6)=−0.511+(−0.511)=−1.022\delta_0(S) = \ln(0.6) + \ln(0.6) = -0.511 + (-0.511) = -1.022 δ0(R)=ln⁡(0.4)+ln⁡(0.1)=−0.916+(−2.303)=−3.219\delta_0(R) = \ln(0.4) + \ln(0.1) = -0.916 + (-2.303) = -3.219

t=1t = 1(观测 Shop):

对 j=Sj = S:

  • 从 SS:δ0(S)+ln⁡(aSS)=−1.022+ln⁡(0.7)=−1.022+(−0.357)=−1.379\delta_0(S) + \ln(a_{SS}) = -1.022 + \ln(0.7) = -1.022 + (-0.357) = -1.379
  • 从 RR:δ0(R)+ln⁡(aRS)=−3.219+ln⁡(0.4)=−3.219+(−0.916)=−4.135\delta_0(R) + \ln(a_{RS}) = -3.219 + \ln(0.4) = -3.219 + (-0.916) = -4.135
  • max⁡=−1.379\max = -1.379(来自 SS),ψ1(S)=S\psi_1(S) = S

δ1(S)=−1.379+ln⁡(0.3)=−1.379+(−1.204)=−2.583\delta_1(S) = -1.379 + \ln(0.3) = -1.379 + (-1.204) = -2.583

对 j=Rj = R:

  • 从 SS:−1.022+ln⁡(0.3)=−1.022+(−1.204)=−2.226-1.022 + \ln(0.3) = -1.022 + (-1.204) = -2.226
  • 从 RR:−3.219+ln⁡(0.6)=−3.219+(−0.511)=−3.730-3.219 + \ln(0.6) = -3.219 + (-0.511) = -3.730
  • max⁡=−2.226\max = -2.226(来自 SS),ψ1(R)=S\psi_1(R) = S

δ1(R)=−2.226+ln⁡(0.4)=−2.226+(−0.916)=−3.142\delta_1(R) = -2.226 + \ln(0.4) = -2.226 + (-0.916) = -3.142

t=2t = 2(观测 Clean):

对 j=Sj = S:

  • 从 SS:−2.583+ln⁡(0.7)=−2.940-2.583 + \ln(0.7) = -2.940
  • 从 RR:−3.142+ln⁡(0.4)=−4.058-3.142 + \ln(0.4) = -4.058
  • max⁡=−2.940\max = -2.940(来自 SS),ψ2(S)=S\psi_2(S) = S

δ2(S)=−2.940+ln⁡(0.1)=−2.940+(−2.303)=−5.243\delta_2(S) = -2.940 + \ln(0.1) = -2.940 + (-2.303) = -5.243

对 j=Rj = R:

  • 从 SS:−2.583+ln⁡(0.3)=−3.787-2.583 + \ln(0.3) = -3.787
  • 从 RR:−3.142+ln⁡(0.6)=−3.653-3.142 + \ln(0.6) = -3.653
  • max⁡=−3.653\max = -3.653(来自 RR),ψ2(R)=R\psi_2(R) = R

δ2(R)=−3.653+ln⁡(0.5)=−3.653+(−0.693)=−4.346\delta_2(R) = -3.653 + \ln(0.5) = -3.653 + (-0.693) = -4.346

终止:δ2(R)=−4.346>δ2(S)=−5.243\delta_2(R) = -4.346 > \delta_2(S) = -5.243,所以 x2∗=Rx^*_2 = R。

回溯:x1∗=ψ2(R)=Rx^*_1 = \psi_2(R) = R,x0∗=ψ1(R)=Sx^*_0 = \psi_1(R) = S。

最优路径:X∗=(S,R,R)X^* = (S, R, R)——晴天、雨天、雨天。

直觉:第一天看到散步所以倾向晴天;第二天看到购物、第三天看到打扫,雨天的发射概率更高,加上雨天的自转移概率(0.6)也不低,所以后两天都判断为雨天。

可视化:HMM 推断

下面的交互组件展示了 Forward 算法和 Viterbi 解码的完整过程。你可以修改观测序列,观察前向概率和最优路径如何变化。

HMM 推断可视化:Forward 算法 & Viterbi 解码
转移矩阵 A
SR
S0.70.3
R0.40.6
发射矩阵 B
WShC
S0.60.30.1
R0.10.40.5
初始分布 π
S: 0.6
R: 0.4
观测序列:
t = 0t = 1t = 2t = 3t = 4散步购物打扫打扫散步晴天雨天0.900.100.600.400.220.780.150.850.830.17后验概率:晴晴雨雨晴
节点中的数值是归一化后的前向概率 α̂ₜ(i) = P(Xₜ=i | o₁,...,oₜ)。圆圈越深表示概率越高。悬停观测符号可高亮对应的时间步。点击观测下拉框可修改观测序列。

探索建议:

  1. 全散步序列:设置观测为 (Walk, Walk, Walk, Walk),观察所有时间步的后验概率都强烈倾向晴天
  2. 全打扫序列:设置观测为 (Clean, Clean, Clean, Clean),观察后验概率快速转向雨天
  3. 交替序列:尝试 (Walk, Clean, Walk, Clean),观察 Forward 后验概率和 Viterbi 路径的差异——Forward 给出每个时间步独立的边际最优,Viterbi 给出全局联合最优,两者可能不同
  4. 切换模式:对比同一观测序列在 Forward 和 Viterbi 模式下的结果差异

问题 3:Baum-Welch 算法——用 EM 学习参数

问题定义

如果我们不知道 A,B,πA, B, \boldsymbol{\pi} 的值,只有观测序列 OO,如何学到最优参数?

λ∗=arg⁡max⁡λPr⁡(O∣λ)\lambda^* = \arg\max_\lambda \Pr(O \mid \lambda)

这是一个最大似然估计(MLE)问题,但直接优化很困难——因为隐状态序列未知,似然函数是 NTN^T 条路径的混合。

Baum-Welch = EM 算法在 HMM 中的特殊化Forward-Backward计算 α_t, β_tE 步后验 γ_t(i), ξ_t(i,j)M 步更新 A, B, π迭代直到P(O|λ) 收敛每次迭代保证 P(O|λ) 不减(EM 基本性质),收敛到局部最优

EM 算法在 HMM 中的实例

Baum-Welch 算法(Baum et al., 1970)是 EM 算法(Expectation-Maximization)在 HMM 中的特殊化。交替执行两步:

E 步(Expectation):用当前参数 λ(old)\lambda^{(\text{old})} 运行 Forward-Backward 算法,计算隐状态的后验概率:

γt(i)=Pr⁡(Xt=si∣O,λ(old))=αt(i)⋅βt(i)∑j=1Nαt(j)⋅βt(j)\gamma_t(i) = \Pr(X_t = s_i \mid O, \lambda^{(\text{old})}) = \frac{\alpha_t(i) \cdot \beta_t(i)}{\sum_{j=1}^{N} \alpha_t(j) \cdot \beta_t(j)}

ξt(i,j)=Pr⁡(Xt=si,Xt+1=sj∣O,λ(old))=αt(i)⋅aij⋅bj(ot+1)⋅βt+1(j)∑i′∑j′αt(i′)⋅ai′j′⋅bj′(ot+1)⋅βt+1(j′)\xi_t(i, j) = \Pr(X_t = s_i, X_{t+1} = s_j \mid O, \lambda^{(\text{old})}) = \frac{\alpha_t(i) \cdot a_{ij} \cdot b_j(o_{t+1}) \cdot \beta_{t+1}(j)}{\sum_{i'}\sum_{j'} \alpha_t(i') \cdot a_{i'j'} \cdot b_{j'}(o_{t+1}) \cdot \beta_{t+1}(j')}

逐项理解 ξt(i,j)\xi_t(i, j):

  • αt(i)\alpha_t(i):从左边”推”到 (t,i)(t, i) 的概率
  • aija_{ij}:从 sis_i 转移到 sjs_j 的概率
  • bj(ot+1)b_j(o_{t+1}):在 sjs_j 发射下一个观测的概率
  • βt+1(j)\beta_{t+1}(j):从右边”拉”回 (t+1,j)(t+1, j) 的概率
  • 分母:归一化项

M 步(Maximization):用后验统计量重新估计参数:

π^i=γ0(i)\hat{\pi}_i = \gamma_0(i)

a^ij=∑t=0T−2ξt(i,j)∑t=0T−2γt(i)\hat{a}_{ij} = \frac{\sum_{t=0}^{T-2} \xi_t(i, j)}{\sum_{t=0}^{T-2} \gamma_t(i)}

b^i(k)=∑t=0T−1γt(i)⋅1[ot=vk]∑t=0T−1γt(i)\hat{b}_i(k) = \frac{\sum_{t=0}^{T-1} \gamma_t(i) \cdot \mathbb{1}[o_t = v_k]}{\sum_{t=0}^{T-1} \gamma_t(i)}

逐项理解更新公式:

  • π^i\hat{\pi}_i:初始状态概率 = 时刻 0 处于状态 ii 的后验概率
  • a^ij\hat{a}_{ij}:转移概率 = “从 ii 转移到 jj 的期望次数”除以”离开 ii 的期望总次数”
  • b^i(k)\hat{b}_i(k):发射概率 = “在状态 ii 时观测到 vkv_k 的期望次数”除以”处于状态 ii 的期望总次数”

每次迭代都保证 Pr⁡(O∣λ)\Pr(O \mid \lambda) 不减(EM 的基本性质),收敛到局部最优。

矩阵视角

Baum-Welch 的本质是:用 Forward-Backward 的矩阵乘法链计算出”软标签”(γt\gamma_t 和 ξt\xi_t),然后用这些软标签加权更新参数矩阵 AA 和 BB。 每次 M 步更新出的 AA 和 BB 仍然是行随机矩阵(非负、行和为 1),保持了概率的合法性。

矩阵乘法链的统一视角

三个问题的算法本质上共享同一个计算原语:

算法计算模式聚合操作方向
Forwardαt=(αt−1A)⊙b(ot)\boldsymbol{\alpha}_t = (\boldsymbol{\alpha}_{t-1} A) \odot \mathbf{b}(o_t)∑\sum(求和)→
BackwardβtT=A⋅Dt+1⋅βt+1T\boldsymbol{\beta}_t^T = A \cdot D_{t+1} \cdot \boldsymbol{\beta}_{t+1}^T∑\sum(求和)←
Viterbiδt(j)=max⁡i[δt−1(i)⋅aij]⋅bj(ot)\delta_t(j) = \max_i [\delta_{t-1}(i) \cdot a_{ij}] \cdot b_j(o_t)max⁡\max(取最大)→
三种算法共享同一个计算原语每一步 = 乘转移矩阵 A(传播) + 乘发射矩阵 D_t(修正)Forward →Σα_t = (α_{t-1}·A) ⊙ b(o_t)→ 边际概率Backward ←Σβ_t = A·D_{t+1}·β_{t+1}→ 后验概率 γ_tViterbi →maxδ_t(j) = max_i[δ_{t-1}·a_ij]·b_j→ 最优路径 X*全部 O(N²T)——矩阵-向量乘法链把 O(N^T) 的指数枚举压缩为多项式递推

这个结构与 Art. 15 马尔可夫链 中的 πt+1=πtP\boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P 完全平行——唯一的新增是发射概率带来的逐元素修正。从矩阵运算的角度看:

HMM 的一步=乘以转移矩阵⏟概率传播(与 Art. 15 相同)+乘以对角发射矩阵⏟观测修正(HMM 新增)\text{HMM 的一步} = \underbrace{\text{乘以转移矩阵}}_{\text{概率传播(与 Art. 15 相同)}} + \underbrace{\text{乘以对角发射矩阵}}_{\text{观测修正(HMM 新增)}}

这就是为什么 HMM 的算法复杂度是 O(N2T)O(N^2 T) 而非 O(NT)O(N^T)——矩阵-向量乘法的链式结构把指数级枚举压缩为多项式级递推。

HMM 在 ML 历史中的地位

语音识别(1970s–2010s)

HMM 是现代语音识别的基石。在深度学习兴起之前,几乎所有商用语音识别系统都基于 HMM 或 HMM 的变体(Rabiner, 1989)。

核心思想:语音信号被切分成短帧(约 10ms),每帧提取声学特征向量(如 MFCC)。一个词对应一个 HMM,隐状态是音素(phoneme),观测是声学特征。识别过程就是 Viterbi 解码——给定声学特征序列,找到最可能的词序列。

生物序列分析

在计算生物学中,HMM 广泛用于基因预测、蛋白质家族识别、序列比对等(Durbin et al., 1998)。例如,蛋白质结构域的 profile HMM 使用数百个隐状态来描述蛋白质家族的保守模式。

自然语言处理

在深度学习之前,HMM 是词性标注(Part-of-Speech Tagging)的标准方法。隐状态是词性(名词、动词、形容词……),观测是词语本身。Viterbi 解码找出最可能的词性序列。

历史意义

HMM 的意义不仅在于具体应用,更在于它建立的框架:

  1. 隐变量模型的原型——后续的 LDA(主题模型)、VAE(变分自编码器)都是隐变量模型
  2. EM 算法的经典实例——Baum-Welch 是 EM 在序列模型中的标准应用
  3. 动态规划 + 概率推断的结合——Viterbi 算法的思想延伸到 CRF、结构化 SVM 等
  4. “传播 + 修正”范式——Forward-Backward 的结构在 Kalman 滤波、信念传播等中反复出现

HMM 的局限

尽管 HMM 影响深远,它有几个根本的局限:

  1. 马尔可夫假设太强:一阶 HMM 假设当前状态只依赖前一个状态——无法建模长程依赖
  2. 离散观测的限制:经典 HMM 假设离散的观测符号集合。虽然可以扩展到连续观测(高斯 HMM),但灵活性有限
  3. 隐状态数量固定:NN 必须预先指定,对模型选择不友好
  4. 表达能力有限:发射概率是独立的——给定隐状态,当前观测与前后观测无关。这在语音和文本中是不现实的

这些局限催生了后续的改进:条件随机场(CRF)放松了独立性假设,深度学习(RNN/Transformer)用神经网络替代了转移和发射矩阵,获得了更强的表达能力。

总结与展望

本文从马尔可夫链的”可观测”世界进入”隐藏”世界,核心收获是:

  • HMM = 马尔可夫链 + 发射层:隐状态按马尔可夫链转移(转移矩阵 AA),每个隐状态随机发射观测(发射矩阵 BB)
  • 三个基本问题:评估(Forward)、解码(Viterbi)、学习(Baum-Welch)
  • Forward 算法 = 矩阵-向量乘法链:每步”乘以转移矩阵 AA(传播)+ 乘以对角发射矩阵 DtD_t(修正)“,复杂度从 O(NT)O(N^T) 降到 O(N2T)O(N^2 T)
  • Viterbi = Forward 把 ∑\sum 换成 max⁡\max,加回溯得到最优路径
  • Baum-Welch = EM:Forward-Backward 计算软标签,M 步更新参数矩阵

统一线索:HMM 的算法本质上是带观测修正的矩阵-向量乘法链——与 Art. 15 中 πt+1=πtP\boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P 的结构一脉相承,只是多了发射矩阵的逐元素修正。

下一篇,我们继续在概念地图上移动——这次是从上到下:从离散状态空间到连续状态空间。如果隐状态不是 {s1,…,sN}\{s_1, \ldots, s_N\} 这样的离散类别,而是一个连续向量 xt∈Rd\mathbf{x}_t \in \mathbb{R}^d 呢?离散求和 ∑i\sum_i 变成连续积分 ∫\int,转移矩阵 AA 变成状态转移方程 xt+1=Axt+wt\mathbf{x}_{t+1} = A\mathbf{x}_t + \mathbf{w}_t,Forward 算法的”传播 + 修正”变成 Kalman 滤波的”预测 + 更新”——同一个框架在连续世界中的自然延伸。