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

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

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

更新于 2026-04-23

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

状态可观测状态隐藏
离散状态马尔可夫链(Art. 15 马尔可夫链HMM ← 你在这里
连续状态线性动力系统(Art. 17 连续系统与 KalmanKalman 滤波(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 = 2S={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 = 3V={Walk,Shop,Clean}\mathcal{V} = \{\text{Walk}, \text{Shop}, \text{Clean}\}

3. 转移矩阵 AA

ARN×N,Aij=Pr(Xt+1=sjXt=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)

BRN×M,Bik=Pr(Ot=vkXt=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,,oT1)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,,T1t = 1, 2, \ldots, T-1
    • AXt1,A_{X_{t-1}, \cdot} 采样下一个隐状态 XtX_t
    • BXt,B_{X_t, \cdot} 发射观测 oto_t

关键假设:

  • 隐层马尔可夫性Pr(XtXt1,Xt2,)=Pr(XtXt1)\Pr(X_t \mid X_{t-1}, X_{t-2}, \ldots) = \Pr(X_t \mid X_{t-1})
  • 观测独立性Pr(otX0,,XT,o0,)=Pr(otXt)\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最优隐状态序列 XX^*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,,oT1)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,,xT1)X = (x_0, x_1, \ldots, x_{T-1})

Pr(O,Xλ)=πx0bx0(o0)t=1T1[axt1,xtbxt(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 的概率
  • axt1,xt=Axt1,xta_{x_{t-1}, x_t} = A_{x_{t-1}, x_t}:从 xt1x_{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)=πibi(o0),i=1,,N\alpha_0(i) = \pi_i \cdot b_i(o_0), \quad i = 1, \ldots, N

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

递推t=1,,T1t = 1, \ldots, T-1):

αt(j)=[i=1Nαt1(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)

逐项理解这个递推式:

  • αt1(i)\alpha_{t-1}(i):上一步处在状态 sis_i 的前向概率
  • aija_{ij}:从 sis_i 转移到 sjs_j 的概率
  • iαt1(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αT1(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=(αt1A)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=DtATαt1T\boldsymbol{\alpha}_t^T = D_t \cdot A^T \cdot \boldsymbol{\alpha}_{t-1}^T

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

αTT=DT1ATDT2ATD1ATD0π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,这是从 210010302^{100} \approx 10^{30} 降到 22×100=4002^2 \times 100 = 400

Backward 算法

对称地,定义后向变量

βt(i)=Pr(ot+1,ot+2,,oT1Xt=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=T1t = T-1):βT1(i)=1\beta_{T-1}(i) = 1,对所有 ii

递推t=T2,,0t = T-2, \ldots, 0):

βt(i)=j=1Naijbj(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=siO,λ)=α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)=πSbS(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)=πRbR(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)

用矩阵形式验证

α0A=(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

α1A=(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=argmaxXPr(XO,λ)X^* = \arg\max_X \Pr(X \mid O, \lambda)

等价于:

X=argmaxXPr(O,Xλ)X^* = \arg\max_X \Pr(O, X \mid \lambda)

Viterbi 算法

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

定义:

δt(j)=maxx0,,xt1Pr(o0,,ot,X0=x0,,Xt1=xt1,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)=πibi(o0)\delta_0(i) = \pi_i \cdot b_i(o_0)

递推t=1,,T1t = 1, \ldots, T-1):

δt(j)=max1iN[δt1(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)=argmax1iN[δt1(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)。

终止

xT1=argmax1iNδT1(i)x^*_{T-1} = \arg\max_{1 \leq i \leq N} \delta_{T-1}(i)

回溯t=T2,,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αt1(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)=[maxiδt1(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

  • SS1.022+ln(0.3)=1.022+(1.204)=2.226-1.022 + \ln(0.3) = -1.022 + (-1.204) = -2.226
  • RR3.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

  • SS2.583+ln(0.7)=2.940-2.583 + \ln(0.7) = -2.940
  • RR3.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

  • SS2.583+ln(0.3)=3.787-2.583 + \ln(0.3) = -3.787
  • RR3.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) = Rx0=ψ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,如何学到最优参数?

λ=argmaxλ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=siO,λ(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=sjO,λ(old))=αt(i)aijbj(ot+1)βt+1(j)ijαt(i)aijbj(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=0T2ξt(i,j)t=0T2γ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=0T1γt(i)1[ot=vk]t=0T1γ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),然后用这些软标签加权更新参数矩阵 AABB 每次 M 步更新出的 AABB 仍然是行随机矩阵(非负、行和为 1),保持了概率的合法性。

矩阵乘法链的统一视角

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

算法计算模式聚合操作方向
Forwardαt=(αt1A)b(ot)\boldsymbol{\alpha}_t = (\boldsymbol{\alpha}_{t-1} A) \odot \mathbf{b}(o_t)\sum(求和)
BackwardβtT=ADt+1βt+1T\boldsymbol{\beta}_t^T = A \cdot D_{t+1} \cdot \boldsymbol{\beta}_{t+1}^T\sum(求和)
Viterbiδt(j)=maxi[δt1(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\} 这样的离散类别,而是一个连续向量 xtRd\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 滤波的”预测 + 更新”——同一个框架在连续世界中的自然延伸。