回顾 Art. 14 算子全景 的概念地图:
我们从”离散状态 + 可观测”向右移动一格,进入**“离散状态 + 隐藏”**的领域。核心变化:状态看不到了,只能通过噪声观测去推断。
上一篇 中,马尔可夫链的一切都摆在明面上——我们直接看到系统处在哪个状态,转移矩阵 P P P 乘一次就是执行一步,P n P^n P n 告诉我们 n n n 步后的分布。但现实中,真正的系统状态往往是隐藏的。一个医生看不到病人体内的疾病进展(隐状态),只能通过症状和化验指标(观测)来推断;一段语音信号的底层音素序列(隐状态)不直接可见,我们只观测到声学特征。
这就是隐马尔可夫模型 (Hidden Markov Model, HMM)的设定:系统仍然按马尔可夫链在离散状态间跳转,但我们看不到状态本身 ——只能看到每个状态随机”发射”出的一个观测符号。从观测序列倒推隐状态序列,本质上是一个矩阵-向量乘法链 。
从天气到观测:给马尔可夫链加一层”面纱”
直觉构造
沿用 Art. 15 马尔可夫链 的天气模型,但做一个关键修改:假设你被关在屋子里,看不到外面的天气 。你唯一能观察到的是一个朋友每天做了什么活动——散步、购物、或者打扫卫生。你知道朋友的活动跟天气有关(晴天更可能散步,雨天更可能打扫),但你无法直接看到天气。
现在有两层随机过程:
隐层 :天气状态按马尔可夫链转移(晴天 → 雨天的概率,雨天 → 晴天的概率……)
观测层 :每天的天气状态”发射”出一个你能看到的活动(晴天发射散步的概率、发射购物的概率……)
你的任务:从观测到的活动序列(散步、购物、打扫、打扫、散步……)推断背后最可能的天气序列。
与马尔可夫链的区别
马尔可夫链(Art. 15) HMM(本文) 状态 直接可观测 隐藏 观测 就是状态本身 由隐状态随机生成 核心矩阵 转移矩阵 P P P (一个) 转移矩阵 A A A + 发射矩阵 B B B (两个) 核心问题 稳态在哪?多快收敛? 隐状态是什么?参数怎么学?
严格定义:HMM 的五元组 λ = ( N , M , A , B , π ) \lambda = (N, M, A, B, \boldsymbol{\pi}) λ = ( N , M , A , B , π )
一个 HMM 由以下五个要素完全确定(Rabiner, 1989):
1. 隐状态集合
S = { s 1 , s 2 , … , s N } \mathcal{S} = \{s_1, s_2, \ldots, s_N\} S = { s 1 , s 2 , … , s N }
N N N 个离散的隐状态。在天气模型中,N = 2 N = 2 N = 2 :S = { Sunny , Rainy } \mathcal{S} = \{\text{Sunny}, \text{Rainy}\} S = { Sunny , Rainy } 。
2. 观测符号集合
V = { v 1 , v 2 , … , v M } \mathcal{V} = \{v_1, v_2, \ldots, v_M\} V = { v 1 , v 2 , … , v M }
M M M 个可能的观测符号。在天气模型中,M = 3 M = 3 M = 3 :V = { Walk , Shop , Clean } \mathcal{V} = \{\text{Walk}, \text{Shop}, \text{Clean}\} V = { Walk , Shop , Clean } 。
3. 转移矩阵 A A A
A ∈ R N × N , A i j = Pr ( X t + 1 = s j ∣ X t = s i ) A \in \mathbb{R}^{N \times N}, \quad A_{ij} = \Pr(X_{t+1} = s_j \mid X_t = s_i) A ∈ R N × N , A ij = Pr ( X t + 1 = s j ∣ X t = s i )
这就是 Art. 15 马尔可夫链 中的行随机矩阵——每行元素非负,行和为 1。A i j A_{ij} A ij 是从隐状态 s i s_i s i 转移到隐状态 s j s_j s j 的概率。
符号说明 :在 Art. 15 马尔可夫链 中我们用 P P P 表示转移矩阵。HMM 文献中习惯用 A A A 表示隐状态转移矩阵(以区分于其他矩阵)。两者是同一个概念:行随机矩阵,乘一次 = 隐状态执行一步转移。
天气模型的转移矩阵:
A = [ 0.7 0.3 0.4 0.6 ] A = \begin{bmatrix} 0.7 & 0.3 \\ 0.4 & 0.6 \end{bmatrix} A = [ 0.7 0.4 0.3 0.6 ]
第一行:晴天 → 晴天 0.7,晴天 → 雨天 0.3。第二行:雨天 → 晴天 0.4,雨天 → 雨天 0.6。
4. 发射矩阵 B B B (emission matrix)
B ∈ R N × M , B i k = Pr ( O t = v k ∣ X t = s i ) B \in \mathbb{R}^{N \times M}, \quad B_{ik} = \Pr(O_t = v_k \mid X_t = s_i) B ∈ R N × M , B ik = Pr ( O t = v k ∣ X t = s i )
B i k B_{ik} B ik 是隐状态 s i s_i s i 发射观测符号 v k v_k v k 的概率。同样是行随机的:每行元素非负,行和为 1。这是 HMM 相对于马尔可夫链的核心新增。
天气模型的发射矩阵:
B = [ 0.6 0.3 0.1 0.1 0.4 0.5 ] B = \begin{bmatrix} 0.6 & 0.3 & 0.1 \\ 0.1 & 0.4 & 0.5 \end{bmatrix} B = [ 0.6 0.1 0.3 0.4 0.1 0.5 ]
第一行(晴天发射):散步 0.6,购物 0.3,打扫 0.1。第二行(雨天发射):散步 0.1,购物 0.4,打扫 0.5。
5. 初始分布 π \boldsymbol{\pi} π
π ∈ R N , π i = Pr ( X 0 = s i ) \boldsymbol{\pi} \in \mathbb{R}^N, \quad \pi_i = \Pr(X_0 = s_i) π ∈ R N , π i = Pr ( X 0 = s i )
t = 0 t = 0 t = 0 时刻各隐状态的概率分布。天气模型中,π = ( 0.6 , 0.4 ) \boldsymbol{\pi} = (0.6, 0.4) π = ( 0.6 , 0.4 ) 。
生成过程
一个 HMM 按以下过程生成长度为 T T T 的观测序列 O = ( o 0 , o 1 , … , o T − 1 ) O = (o_0, o_1, \ldots, o_{T-1}) O = ( o 0 , o 1 , … , o T − 1 ) :
按 π \boldsymbol{\pi} π 采样初始隐状态 X 0 X_0 X 0
按 B X 0 , ⋅ B_{X_0, \cdot} B X 0 , ⋅ 发射观测 o 0 o_0 o 0
对 t = 1 , 2 , … , T − 1 t = 1, 2, \ldots, T-1 t = 1 , 2 , … , T − 1 :
按 A X t − 1 , ⋅ A_{X_{t-1}, \cdot} A X t − 1 , ⋅ 采样下一个隐状态 X t X_t X t
按 B X t , ⋅ B_{X_t, \cdot} B X t , ⋅ 发射观测 o t o_t o t
关键假设:
隐层马尔可夫性 :Pr ( X t ∣ X t − 1 , X t − 2 , … ) = Pr ( X t ∣ X t − 1 ) \Pr(X_t \mid X_{t-1}, X_{t-2}, \ldots) = \Pr(X_t \mid X_{t-1}) Pr ( X t ∣ X t − 1 , X t − 2 , … ) = Pr ( X t ∣ X t − 1 )
观测独立性 :Pr ( o t ∣ X 0 , … , X T , o 0 , … ) = Pr ( o t ∣ X t ) \Pr(o_t \mid X_0, \ldots, X_T, o_0, \ldots) = \Pr(o_t \mid X_t) Pr ( o t ∣ X 0 , … , X T , o 0 , … ) = Pr ( o t ∣ X t ) ——当前观测只依赖当前隐状态
下图展示了 HMM 的生成结构:上层(红色虚线框)是不可见的隐状态序列,按转移矩阵 A A A 逐步跳转;下层是可观测的观测序列,由发射矩阵 B B B 从隐状态随机生成。
HMM 生成模型:隐状态 + 观测层
隐状态按转移矩阵 A 跳转(水平箭头),每个隐状态按发射矩阵 B 发出观测(垂直箭头)
隐层 观测层 π X₀ o₀ B A X₁ o₁ X₂ o₂ X₃ o₃ 不可见 时间 t →
HMM 的三个基本问题
Rabiner (1989) 将 HMM 的核心应用归纳为三个基本问题:
问题 名称 输入 输出 算法 问题 1 评估 (Evaluation)模型 λ \lambda λ ,观测序列 O O O Pr ( O ∣ λ ) \Pr(O \mid \lambda) Pr ( O ∣ λ ) Forward(前向算法) 问题 2 解码 (Decoding)模型 λ \lambda λ ,观测序列 O O O 最优隐状态序列 X ∗ X^* X ∗ Viterbi 算法 问题 3 学习 (Learning)观测序列 O O O 最优参数 λ ∗ = ( A , B , π ) \lambda^* = (A, B, \boldsymbol{\pi}) λ ∗ = ( A , B , π ) Baum-Welch(EM)
逐项理解:
评估 :给定模型和观测,这个观测序列出现的概率有多大?用于模型选择 ——比较多个候选模型,选概率最大的。
解码 :给定模型和观测,最可能的隐状态序列是什么?用于推断 ——从观测倒推隐状态。
学习 :只有观测数据,没有标注的隐状态——怎么学到模型参数?用于训练 ——无监督地从数据中学习。
HMM 的三个基本问题 (Rabiner, 1989) 共同核心:矩阵-向量乘法链 问题 1:评估 Forward Σ 输入: 模型 λ + 观测 O 输出: P(O|λ) 问题 2:解码 Viterbi max 输入: 模型 λ + 观测 O 输出: X* = argmax 问题 3:学习 Baum-Welch EM 输入: 观测 O 输出: λ* = (A,B,π) Forward 用 Σ (求和),Viterbi 用 max (取最大),Baum-Welch 两者结合 (EM)
这三个问题的算法有一个共同的数学核心:矩阵-向量乘法链 。
问题 1:Forward 算法——矩阵乘法链
朴素方法:枚举所有路径
给定模型 λ \lambda λ 和观测序列 O = ( o 0 , o 1 , … , o T − 1 ) O = (o_0, o_1, \ldots, o_{T-1}) O = ( o 0 , o 1 , … , o T − 1 ) ,我们要计算:
Pr ( O ∣ λ ) = ∑ 所有隐状态序列 X Pr ( O , X ∣ λ ) \Pr(O \mid \lambda) = \sum_{\text{所有隐状态序列 } X} \Pr(O, X \mid \lambda) Pr ( O ∣ λ ) = ∑ 所有隐状态序列 X Pr ( O , X ∣ λ )
对于每个具体的隐状态序列 X = ( x 0 , x 1 , … , x T − 1 ) X = (x_0, x_1, \ldots, x_{T-1}) X = ( x 0 , x 1 , … , x T − 1 ) :
Pr ( O , X ∣ λ ) = π x 0 ⋅ b x 0 ( o 0 ) ⋅ ∏ t = 1 T − 1 [ a x t − 1 , x t ⋅ b x t ( o t ) ] \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] Pr ( O , X ∣ λ ) = π x 0 ⋅ b x 0 ( o 0 ) ⋅ ∏ t = 1 T − 1 [ a x t − 1 , x t ⋅ b x t ( o t ) ]
逐项理解:
π x 0 \pi_{x_0} π x 0 :初始隐状态为 x 0 x_0 x 0 的概率
b x 0 ( o 0 ) = B x 0 , o 0 b_{x_0}(o_0) = B_{x_0, o_0} b x 0 ( o 0 ) = B x 0 , o 0 :隐状态 x 0 x_0 x 0 发射观测 o 0 o_0 o 0 的概率
a x t − 1 , x t = A x t − 1 , x t a_{x_{t-1}, x_t} = A_{x_{t-1}, x_t} a x t − 1 , x t = A x t − 1 , x t :从 x t − 1 x_{t-1} x t − 1 转移到 x t x_t x t 的概率
b x t ( o t ) b_{x_t}(o_t) b x t ( o t ) :隐状态 x t x_t x t 发射观测 o t o_t o t 的概率
总共有 N T N^T N T 条可能的隐状态路径(每个时间步 N N N 种选择,共 T T T 步)。暴力枚举的复杂度是 O ( N T ) O(N^T) O ( N T ) ——指数级,对 T > 20 T > 20 T > 20 就完全不可行。
Forward 算法:动态规划 + 矩阵乘法
关键观察:Pr ( O ∣ λ ) \Pr(O \mid \lambda) Pr ( O ∣ λ ) 的计算可以利用马尔可夫性质递推,避免指数级枚举。
定义前向变量 (forward variable):
α t ( i ) = Pr ( o 0 , o 1 , … , o t , X t = s i ∣ λ ) \alpha_t(i) = \Pr(o_0, o_1, \ldots, o_t, X_t = s_i \mid \lambda) α t ( i ) = Pr ( o 0 , o 1 , … , o t , X t = s i ∣ λ )
即”观测到前 t + 1 t+1 t + 1 个符号,且时刻 t t t 处在隐状态 s i s_i s i “的联合概率。
初始化 (t = 0 t = 0 t = 0 ):
α 0 ( i ) = π i ⋅ b i ( o 0 ) , i = 1 , … , N \alpha_0(i) = \pi_i \cdot b_i(o_0), \quad i = 1, \ldots, N α 0 ( i ) = π i ⋅ b i ( o 0 ) , i = 1 , … , N
即初始概率乘以发射概率。
递推 (t = 1 , … , T − 1 t = 1, \ldots, T-1 t = 1 , … , T − 1 ):
α t ( j ) = [ ∑ i = 1 N α t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \alpha_t(j) = \left[\sum_{i=1}^{N} \alpha_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t) α t ( j ) = [ ∑ i = 1 N α t − 1 ( i ) ⋅ a ij ] ⋅ b j ( o t )
逐项理解这个递推式:
α t − 1 ( i ) \alpha_{t-1}(i) α t − 1 ( i ) :上一步处在状态 s i s_i s i 的前向概率
a i j a_{ij} a ij :从 s i s_i s i 转移到 s j s_j s j 的概率
∑ i α t − 1 ( i ) ⋅ a i j \sum_i \alpha_{t-1}(i) \cdot a_{ij} ∑ i α t − 1 ( i ) ⋅ a ij :从所有可能的前一状态 转移到 s j s_j s j 的概率加权和
乘以 b j ( o t ) b_j(o_t) b j ( o t ) :再乘以在状态 s j s_j s j 发射观测 o t o_t o t 的概率
终止 :
Pr ( O ∣ λ ) = ∑ i = 1 N α T − 1 ( i ) \Pr(O \mid \lambda) = \sum_{i=1}^{N} \alpha_{T-1}(i) Pr ( O ∣ λ ) = ∑ i = 1 N α T − 1 ( i )
矩阵形式:Forward 算法 = 矩阵-向量乘法链
把 α t \alpha_t α t 写成行向量 α t = [ α t ( 1 ) , α t ( 2 ) , … , α t ( N ) ] \boldsymbol{\alpha}_t = [\alpha_t(1), \alpha_t(2), \ldots, \alpha_t(N)] α t = [ α t ( 1 ) , α t ( 2 ) , … , α t ( N )] 。递推式变成:
α t = ( α t − 1 ⋅ A ) ⊙ b ( o t ) \boldsymbol{\alpha}_t = (\boldsymbol{\alpha}_{t-1} \cdot A) \odot \mathbf{b}(o_t) α t = ( α t − 1 ⋅ A ) ⊙ b ( o t )
其中 ⊙ \odot ⊙ 是逐元素乘法(Hadamard 积),b ( o t ) = [ B 1 , o t , B 2 , o t , … , B N , o t ] \mathbf{b}(o_t) = [B_{1, o_t}, B_{2, o_t}, \ldots, B_{N, o_t}] b ( o t ) = [ B 1 , o t , B 2 , o t , … , B N , o t ] 是各状态发射当前观测符号的概率向量。
更紧凑地,定义对角发射矩阵 :
D t = diag ( B 1 , o t , B 2 , o t , … , B N , o t ) D_t = \text{diag}(B_{1, o_t}, B_{2, o_t}, \ldots, B_{N, o_t}) D t = diag ( B 1 , o t , B 2 , o t , … , B N , o t )
则递推式变为纯矩阵乘法:
α t T = D t ⋅ A T ⋅ α t − 1 T \boldsymbol{\alpha}_t^T = D_t \cdot A^T \cdot \boldsymbol{\alpha}_{t-1}^T α t T = D t ⋅ A T ⋅ α t − 1 T
或者写成从左到右的形式:
α T T = D T − 1 A T D T − 2 A T ⋯ D 1 A T D 0 π 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 α T T = D T − 1 A T D T − 2 A T ⋯ D 1 A T D 0 π T
核心洞察 :Forward 算法就是一条矩阵-向量乘法链 。每一步做两件事:(1) 左乘转移矩阵 A T A^T A T ——隐状态的概率传播,和 Art. 15 马尔可夫链 中 π t + 1 = π t P \boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P π t + 1 = π t P 完全一样;(2) 逐元素乘以发射概率 D t D_t D t ——用观测证据”修正”概率。这个”传播 + 修正”的交替结构,正是 HMM 相对于普通马尔可夫链的核心新增。
下图把 Forward 算法的一步拆解为两个阶段——先”传播”(乘转移矩阵),再”修正”(乘发射概率)。这个结构在 Kalman 滤波(Art. 17)中会以”预测 + 更新”的形式再次出现。
Forward 算法的一步:"传播 + 修正"
先乘转移矩阵 A(概率传播),再逐元素乘发射概率 b(oₜ)(观测修正)
α꜀₋₁ 上一步的前向概率 × A ①传播 α' = α꜀₋₁·A 传播后的概率 ⊙ b(oₜ) ②修正 αₜ 更新后的前向概率 对比:马尔可夫链只有步骤①(πₜ = πₜ₋₁·P),HMM 新增步骤② 这个"传播 + 修正"模式也是 Kalman 滤波(Art. 17)的核心结构
复杂度 :每步递推是 O ( N 2 ) O(N^2) O ( N 2 ) (矩阵-向量乘法),共 T T T 步,总复杂度 O ( N 2 T ) O(N^2 T) O ( N 2 T ) ——从指数级 O ( N T ) O(N^T) O ( N T ) 降到了多项式级。对于 N = 2 , T = 100 N = 2, T = 100 N = 2 , T = 100 ,这是从 2 100 ≈ 10 30 2^{100} \approx 10^{30} 2 100 ≈ 1 0 30 降到 2 2 × 100 = 400 2^2 \times 100 = 400 2 2 × 100 = 400 。
Backward 算法
对称地,定义后向变量 :
β t ( i ) = Pr ( o t + 1 , o t + 2 , … , o T − 1 ∣ X t = s i , λ ) \beta_t(i) = \Pr(o_{t+1}, o_{t+2}, \ldots, o_{T-1} \mid X_t = s_i, \lambda) β t ( i ) = Pr ( o t + 1 , o t + 2 , … , o T − 1 ∣ X t = s i , λ )
即”给定时刻 t t t 在状态 s i s_i s i ,未来观测序列出现的概率”。
初始化 (t = T − 1 t = T-1 t = T − 1 ):β T − 1 ( i ) = 1 \beta_{T-1}(i) = 1 β T − 1 ( i ) = 1 ,对所有 i i i 。
递推 (t = T − 2 , … , 0 t = T-2, \ldots, 0 t = T − 2 , … , 0 ):
β 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} \cdot b_j(o_{t+1}) \cdot \beta_{t+1}(j) β t ( i ) = ∑ j = 1 N a ij ⋅ b j ( o t + 1 ) ⋅ β t + 1 ( j )
Forward 从前往后”推”概率,Backward 从后往前”拉”概率。两者结合给出任意时刻的后验概率 :
γ t ( i ) = Pr ( X t = s i ∣ O , λ ) = α t ( i ) ⋅ β t ( i ) ∑ j = 1 N α 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)} γ t ( i ) = Pr ( X t = s i ∣ O , λ ) = ∑ j = 1 N α t ( j ) ⋅ β t ( j ) α t ( i ) ⋅ β t ( i )
这个后验概率在 Baum-Welch 学习算法中至关重要。
数值例子:2 隐状态 × 3 观测符号的 Forward 算法
让我们用天气模型手算 Forward 算法。
模型参数 :
隐状态:S = { S , R } \mathcal{S} = \{S, R\} S = { S , R } (Sunny, Rainy),N = 2 N = 2 N = 2
观测符号:V = { W , S h , C } \mathcal{V} = \{W, Sh, C\} V = { W , S h , C } (Walk, Shop, Clean),M = 3 M = 3 M = 3
A = [ 0.7 0.3 0.4 0.6 ] A = \begin{bmatrix}0.7 & 0.3\\0.4 & 0.6\end{bmatrix} A = [ 0.7 0.4 0.3 0.6 ] ,B = [ 0.6 0.3 0.1 0.1 0.4 0.5 ] B = \begin{bmatrix}0.6 & 0.3 & 0.1\\0.1 & 0.4 & 0.5\end{bmatrix} B = [ 0.6 0.1 0.3 0.4 0.1 0.5 ] ,π = ( 0.6 , 0.4 ) \boldsymbol{\pi} = (0.6, 0.4) π = ( 0.6 , 0.4 )
观测序列 :O = ( Walk , Shop , Clean ) O = (\text{Walk}, \text{Shop}, \text{Clean}) O = ( Walk , Shop , Clean ) ,即 ( o 0 , o 1 , o 2 ) = ( W , S h , C ) (o_0, o_1, o_2) = (W, Sh, C) ( o 0 , o 1 , o 2 ) = ( W , S h , C ) 。
t = 0 t = 0 t = 0 :初始化
α 0 ( S ) = π S ⋅ b S ( W ) = 0.6 × 0.6 = 0.36 \alpha_0(S) = \pi_S \cdot b_S(W) = 0.6 \times 0.6 = 0.36 α 0 ( S ) = π S ⋅ b S ( W ) = 0.6 × 0.6 = 0.36
α 0 ( R ) = π R ⋅ b R ( W ) = 0.4 × 0.1 = 0.04 \alpha_0(R) = \pi_R \cdot b_R(W) = 0.4 \times 0.1 = 0.04 α 0 ( R ) = π R ⋅ b R ( W ) = 0.4 × 0.1 = 0.04
α 0 = ( 0.36 , 0.04 ) \boldsymbol{\alpha}_0 = (0.36, 0.04) α 0 = ( 0.36 , 0.04 ) 。
直觉:看到”散步”后,晴天的概率远大于雨天——因为晴天散步的发射概率(0.6)远高于雨天散步(0.1)。
t = 1 t = 1 t = 1 :观测到 Shop
α 1 ( S ) = [ α 0 ( S ) ⋅ a S S + α 0 ( R ) ⋅ a R S ] ⋅ b S ( S h ) \alpha_1(S) = [\alpha_0(S) \cdot a_{SS} + \alpha_0(R) \cdot a_{RS}] \cdot b_S(Sh) α 1 ( S ) = [ α 0 ( S ) ⋅ a S S + α 0 ( R ) ⋅ a R S ] ⋅ b S ( S h )
= [ 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 = [ 0.36 × 0.7 + 0.04 × 0.4 ] × 0.3 = [ 0.252 + 0.016 ] × 0.3 = 0.268 × 0.3 = 0.0804
α 1 ( R ) = [ α 0 ( S ) ⋅ a S R + α 0 ( R ) ⋅ a R R ] ⋅ b R ( S h ) \alpha_1(R) = [\alpha_0(S) \cdot a_{SR} + \alpha_0(R) \cdot a_{RR}] \cdot b_R(Sh) α 1 ( R ) = [ α 0 ( S ) ⋅ a S R + α 0 ( R ) ⋅ a R R ] ⋅ b R ( S h )
= [ 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 = [ 0.36 × 0.3 + 0.04 × 0.6 ] × 0.4 = [ 0.108 + 0.024 ] × 0.4 = 0.132 × 0.4 = 0.0528
α 1 = ( 0.0804 , 0.0528 ) \boldsymbol{\alpha}_1 = (0.0804, 0.0528) α 1 = ( 0.0804 , 0.0528 ) 。
用矩阵形式验证 :
α 0 ⋅ A = ( 0.36 , 0.04 ) [ 0.7 0.3 0.4 0.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) α 0 ⋅ A = ( 0.36 , 0.04 ) [ 0.7 0.4 0.3 0.6 ] = ( 0.36 × 0.7 + 0.04 × 0.4 , 0.36 × 0.3 + 0.04 × 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 ✓ α 1 = ( 0.268 , 0.132 ) ⊙ ( 0.3 , 0.4 ) = ( 0.0804 , 0.0528 ) ✓
第一步乘以 A A A (概率传播),第二步逐元素乘以发射概率(用观测修正)。
t = 2 t = 2 t = 2 :观测到 Clean
α 1 ⋅ A = ( 0.0804 , 0.0528 ) [ 0.7 0.3 0.4 0.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) α 1 ⋅ A = ( 0.0804 , 0.0528 ) [ 0.7 0.4 0.3 0.6 ] = ( 0.0804 × 0.7 + 0.0528 × 0.4 , 0.0804 × 0.3 + 0.0528 × 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) = ( 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) α 2 = ( 0.07740 , 0.05580 ) ⊙ ( 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 Pr ( O ∣ λ ) = α 2 ( S ) + α 2 ( R ) = 0.00774 + 0.02790 = 0.03564
后验概率 (归一化后的 α \alpha α ):
t t t 观测 α ^ t ( S ) \hat{\alpha}_t(S) α ^ t ( S ) α ^ t ( R ) \hat{\alpha}_t(R) α ^ t ( R ) 更可能的隐状态 0 Walk 0.900 0.100 Sunny 1 Shop 0.604 0.396 Sunny 2 Clean 0.217 0.783 Rainy
可以看到:看到”散步”后强烈倾向晴天;看到”购物”后仍然偏向晴天但不那么确定;看到”打扫”后转向雨天——每一步观测都在更新我们对隐状态的信念 。
关键对比 :在普通马尔可夫链(Art. 15)中,π t + 1 = π t P \boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P π t + 1 = π t P 只有”传播”步骤。在 HMM 中,多了一个”用观测修正”的步骤。这个”传播 + 修正”模式是所有贝叶斯滤波方法(HMM、Kalman、粒子滤波)的共同结构。
问题 2:Viterbi 算法——最优路径的动态规划
问题定义
给定模型 λ \lambda λ 和观测序列 O O O ,找到最可能的隐状态序列:
X ∗ = arg max X Pr ( X ∣ O , λ ) X^* = \arg\max_X \Pr(X \mid O, \lambda) X ∗ = arg max X Pr ( X ∣ O , λ )
等价于:
X ∗ = arg max X Pr ( O , X ∣ λ ) X^* = \arg\max_X \Pr(O, X \mid \lambda) X ∗ = arg max X Pr ( O , X ∣ λ )
Viterbi 算法
Viterbi (1967) 算法与 Forward 算法结构几乎相同,唯一区别是把求和换成取最大值 。
定义:
δ t ( j ) = max x 0 , … , x t − 1 Pr ( o 0 , … , o t , X 0 = x 0 , … , X t − 1 = x t − 1 , X t = s j ∣ λ ) \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) δ t ( j ) = max x 0 , … , x t − 1 Pr ( o 0 , … , o t , X 0 = x 0 , … , X t − 1 = x t − 1 , X t = s j ∣ λ )
即”到时刻 t t t 为止、以状态 s j s_j s j 结尾的最优路径的概率”。
初始化 (t = 0 t = 0 t = 0 ):
δ 0 ( i ) = π i ⋅ b i ( o 0 ) \delta_0(i) = \pi_i \cdot b_i(o_0) δ 0 ( i ) = π i ⋅ b i ( o 0 )
递推 (t = 1 , … , T − 1 t = 1, \ldots, T-1 t = 1 , … , T − 1 ):
δ t ( j ) = max 1 ≤ i ≤ N [ δ t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \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 ) = max 1 ≤ i ≤ N [ δ t − 1 ( i ) ⋅ a ij ] ⋅ b j ( o t )
ψ t ( j ) = arg max 1 ≤ i ≤ N [ δ t − 1 ( i ) ⋅ a i j ] \psi_t(j) = \arg\max_{1 \leq i \leq N} \left[\delta_{t-1}(i) \cdot a_{ij}\right] ψ t ( j ) = arg max 1 ≤ i ≤ N [ δ t − 1 ( i ) ⋅ a ij ]
ψ t ( j ) \psi_t(j) ψ t ( j ) 记录了到达 ( t , j ) (t, j) ( t , j ) 的最优前驱状态——用于回溯(backtracking)。
终止 :
x T − 1 ∗ = arg max 1 ≤ i ≤ N δ T − 1 ( i ) x^*_{T-1} = \arg\max_{1 \leq i \leq N} \delta_{T-1}(i) x T − 1 ∗ = arg max 1 ≤ i ≤ N δ T − 1 ( i )
回溯 (t = T − 2 , … , 0 t = T-2, \ldots, 0 t = T − 2 , … , 0 ):
x t ∗ = ψ t + 1 ( x t + 1 ∗ ) x^*_t = \psi_{t+1}(x^*_{t+1}) x t ∗ = ψ t + 1 ( x t + 1 ∗ )
Forward vs. Viterbi :
Forward:α t ( j ) = [ ∑ i α t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \alpha_t(j) = \left[\sum_i \alpha_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t) α t ( j ) = [ ∑ i α t − 1 ( i ) ⋅ a ij ] ⋅ b j ( o t ) ——求和 ,得到边际概率
Viterbi:δ t ( j ) = [ max i δ t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \delta_t(j) = \left[\max_i \delta_{t-1}(i) \cdot a_{ij}\right] \cdot b_j(o_t) δ t ( j ) = [ max i δ t − 1 ( i ) ⋅ a ij ] ⋅ b j ( o t ) ——取最大 ,得到最优路径
结构完全一致,只是聚合操作不同。在对数域中,Viterbi 等价于最短路径 问题。
Viterbi 解码:网格图上的最优路径 Sunny Rainy t=0 Walk t=1 Shop t=2 Clean S 0.3600 R 0.0400 S 0.0804 R 0.0528 S 0.0077 R 0.0279 X* = (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 , S h , C ) O = (W, Sh, C) O = ( W , S h , C ) ,在对数域中计算:
t = 0 t = 0 t = 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 ( 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 δ 0 ( R ) = ln ( 0.4 ) + ln ( 0.1 ) = − 0.916 + ( − 2.303 ) = − 3.219
t = 1 t = 1 t = 1 (观测 Shop):
对 j = S j = S j = S :
从 S S S :δ 0 ( S ) + ln ( a S S ) = − 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 δ 0 ( S ) + ln ( a S S ) = − 1.022 + ln ( 0.7 ) = − 1.022 + ( − 0.357 ) = − 1.379
从 R R R :δ 0 ( R ) + ln ( a R S ) = − 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 δ 0 ( R ) + ln ( a R S ) = − 3.219 + ln ( 0.4 ) = − 3.219 + ( − 0.916 ) = − 4.135
max = − 1.379 \max = -1.379 max = − 1.379 (来自 S S S ),ψ 1 ( S ) = S \psi_1(S) = S ψ 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 δ 1 ( S ) = − 1.379 + ln ( 0.3 ) = − 1.379 + ( − 1.204 ) = − 2.583
对 j = R j = R j = R :
从 S S S :− 1.022 + ln ( 0.3 ) = − 1.022 + ( − 1.204 ) = − 2.226 -1.022 + \ln(0.3) = -1.022 + (-1.204) = -2.226 − 1.022 + ln ( 0.3 ) = − 1.022 + ( − 1.204 ) = − 2.226
从 R R R :− 3.219 + ln ( 0.6 ) = − 3.219 + ( − 0.511 ) = − 3.730 -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 max = − 2.226 (来自 S S S ),ψ 1 ( R ) = S \psi_1(R) = S ψ 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 δ 1 ( R ) = − 2.226 + ln ( 0.4 ) = − 2.226 + ( − 0.916 ) = − 3.142
t = 2 t = 2 t = 2 (观测 Clean):
对 j = S j = S j = S :
从 S S S :− 2.583 + ln ( 0.7 ) = − 2.940 -2.583 + \ln(0.7) = -2.940 − 2.583 + ln ( 0.7 ) = − 2.940
从 R R R :− 3.142 + ln ( 0.4 ) = − 4.058 -3.142 + \ln(0.4) = -4.058 − 3.142 + ln ( 0.4 ) = − 4.058
max = − 2.940 \max = -2.940 max = − 2.940 (来自 S S S ),ψ 2 ( S ) = S \psi_2(S) = S ψ 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 δ 2 ( S ) = − 2.940 + ln ( 0.1 ) = − 2.940 + ( − 2.303 ) = − 5.243
对 j = R j = R j = R :
从 S S S :− 2.583 + ln ( 0.3 ) = − 3.787 -2.583 + \ln(0.3) = -3.787 − 2.583 + ln ( 0.3 ) = − 3.787
从 R R R :− 3.142 + ln ( 0.6 ) = − 3.653 -3.142 + \ln(0.6) = -3.653 − 3.142 + ln ( 0.6 ) = − 3.653
max = − 3.653 \max = -3.653 max = − 3.653 (来自 R R R ),ψ 2 ( R ) = R \psi_2(R) = R ψ 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 ) = − 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 δ 2 ( R ) = − 4.346 > δ 2 ( S ) = − 5.243 ,所以 x 2 ∗ = R x^*_2 = R x 2 ∗ = R 。
回溯 :x 1 ∗ = ψ 2 ( R ) = R x^*_1 = \psi_2(R) = R x 1 ∗ = ψ 2 ( R ) = R ,x 0 ∗ = ψ 1 ( R ) = S x^*_0 = \psi_1(R) = S x 0 ∗ = ψ 1 ( R ) = S 。
最优路径 :X ∗ = ( S , R , R ) X^* = (S, R, R) X ∗ = ( S , R , R ) ——晴天、雨天、雨天。
直觉:第一天看到散步所以倾向晴天;第二天看到购物、第三天看到打扫,雨天的发射概率更高,加上雨天的自转移概率(0.6)也不低,所以后两天都判断为雨天。
可视化:HMM 推断
下面的交互组件展示了 Forward 算法和 Viterbi 解码的完整过程。你可以修改观测序列,观察前向概率和最优路径如何变化。
HMM 推断可视化:Forward 算法 & Viterbi 解码
观测序列: 散步 购物 打扫 散步 购物 打扫 散步 购物 打扫 散步 购物 打扫 散步 购物 打扫 + -
Forward 算法(前向概率) Viterbi 解码(最优路径)
t = 0 t = 1 t = 2 t = 3 t = 4 散步 购物 打扫 打扫 散步 晴天 雨天 0.90 0.10 0.60 0.40 0.22 0.78 0.15 0.85 0.83 0.17 后验概率: 晴 晴 雨 雨 晴 节点中的数值是归一化后的前向概率 α̂ₜ(i) = P(Xₜ=i | o₁,...,oₜ)。圆圈越深表示概率越高。悬停观测符号可高亮对应的时间步。点击观测下拉框可修改观测序列。
探索建议 :
全散步序列 :设置观测为 (Walk, Walk, Walk, Walk),观察所有时间步的后验概率都强烈倾向晴天
全打扫序列 :设置观测为 (Clean, Clean, Clean, Clean),观察后验概率快速转向雨天
交替序列 :尝试 (Walk, Clean, Walk, Clean),观察 Forward 后验概率和 Viterbi 路径的差异——Forward 给出每个时间步独立的边际最优,Viterbi 给出全局联合最优,两者可能不同
切换模式 :对比同一观测序列在 Forward 和 Viterbi 模式下的结果差异
问题 3:Baum-Welch 算法——用 EM 学习参数
问题定义
如果我们不知道 A , B , π A, B, \boldsymbol{\pi} A , B , π 的值,只有观测序列 O O O ,如何学到最优参数?
λ ∗ = arg max λ Pr ( O ∣ λ ) \lambda^* = \arg\max_\lambda \Pr(O \mid \lambda) λ ∗ = arg max λ Pr ( O ∣ λ )
这是一个最大似然估计(MLE)问题,但直接优化很困难——因为隐状态序列未知,似然函数是 N T N^T N T 条路径的混合。
Baum-Welch = EM 算法在 HMM 中的特殊化 Forward-Backward 计算 α_t, β_t E 步 后验 γ_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})} λ ( old ) 运行 Forward-Backward 算法,计算隐状态的后验概率:
γ t ( i ) = Pr ( X t = s i ∣ O , λ ( old ) ) = α t ( i ) ⋅ β t ( i ) ∑ j = 1 N α 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 ) = Pr ( X t = s i ∣ O , λ ( old ) ) = ∑ j = 1 N α t ( j ) ⋅ β t ( j ) α t ( i ) ⋅ β t ( i )
ξ t ( i , j ) = Pr ( X t = s i , X t + 1 = s j ∣ O , λ ( old ) ) = α t ( i ) ⋅ a i j ⋅ b j ( o t + 1 ) ⋅ β t + 1 ( j ) ∑ i ′ ∑ j ′ α t ( i ′ ) ⋅ a i ′ j ′ ⋅ b j ′ ( o t + 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 ) = Pr ( X t = s i , X t + 1 = s j ∣ O , λ ( old ) ) = ∑ i ′ ∑ j ′ α t ( i ′ ) ⋅ a i ′ j ′ ⋅ b j ′ ( o t + 1 ) ⋅ β t + 1 ( j ′ ) α t ( i ) ⋅ a ij ⋅ b j ( o t + 1 ) ⋅ β t + 1 ( j )
逐项理解 ξ t ( i , j ) \xi_t(i, j) ξ t ( i , j ) :
α t ( i ) \alpha_t(i) α t ( i ) :从左边”推”到 ( t , i ) (t, i) ( t , i ) 的概率
a i j a_{ij} a ij :从 s i s_i s i 转移到 s j s_j s j 的概率
b j ( o t + 1 ) b_j(o_{t+1}) b j ( o t + 1 ) :在 s j s_j s j 发射下一个观测的概率
β t + 1 ( j ) \beta_{t+1}(j) β t + 1 ( j ) :从右边”拉”回 ( t + 1 , j ) (t+1, j) ( t + 1 , j ) 的概率
分母:归一化项
M 步 (Maximization):用后验统计量重新估计参数:
π ^ i = γ 0 ( i ) \hat{\pi}_i = \gamma_0(i) π ^ i = γ 0 ( i )
a ^ i j = ∑ t = 0 T − 2 ξ t ( i , j ) ∑ t = 0 T − 2 γ t ( i ) \hat{a}_{ij} = \frac{\sum_{t=0}^{T-2} \xi_t(i, j)}{\sum_{t=0}^{T-2} \gamma_t(i)} a ^ ij = ∑ t = 0 T − 2 γ t ( i ) ∑ t = 0 T − 2 ξ t ( i , j )
b ^ i ( k ) = ∑ t = 0 T − 1 γ t ( i ) ⋅ 1 [ o t = v k ] ∑ t = 0 T − 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)} b ^ i ( k ) = ∑ t = 0 T − 1 γ t ( i ) ∑ t = 0 T − 1 γ t ( i ) ⋅ 1 [ o t = v k ]
逐项理解更新公式:
π ^ i \hat{\pi}_i π ^ i :初始状态概率 = 时刻 0 处于状态 i i i 的后验概率
a ^ i j \hat{a}_{ij} a ^ ij :转移概率 = “从 i i i 转移到 j j j 的期望次数”除以”离开 i i i 的期望总次数”
b ^ i ( k ) \hat{b}_i(k) b ^ i ( k ) :发射概率 = “在状态 i i i 时观测到 v k v_k v k 的期望次数”除以”处于状态 i i i 的期望总次数”
每次迭代都保证 Pr ( O ∣ λ ) \Pr(O \mid \lambda) Pr ( O ∣ λ ) 不减(EM 的基本性质),收敛到局部最优。
矩阵视角
Baum-Welch 的本质是:用 Forward-Backward 的矩阵乘法链计算出”软标签”(γ t \gamma_t γ t 和 ξ t \xi_t ξ t ),然后用这些软标签加权更新参数矩阵 A A A 和 B B B 。 每次 M 步更新出的 A A A 和 B B B 仍然是行随机矩阵(非负、行和为 1),保持了概率的合法性。
矩阵乘法链的统一视角
三个问题的算法本质上共享同一个计算原语:
算法 计算模式 聚合操作 方向 Forward α t = ( α t − 1 A ) ⊙ b ( o t ) \boldsymbol{\alpha}_t = (\boldsymbol{\alpha}_{t-1} A) \odot \mathbf{b}(o_t) α t = ( α t − 1 A ) ⊙ b ( o t ) ∑ \sum ∑ (求和)→ Backward β t T = A ⋅ D t + 1 ⋅ β t + 1 T \boldsymbol{\beta}_t^T = A \cdot D_{t+1} \cdot \boldsymbol{\beta}_{t+1}^T β t T = A ⋅ D t + 1 ⋅ β t + 1 T ∑ \sum ∑ (求和)← Viterbi δ t ( j ) = max i [ δ t − 1 ( i ) ⋅ a i j ] ⋅ b j ( o t ) \delta_t(j) = \max_i [\delta_{t-1}(i) \cdot a_{ij}] \cdot b_j(o_t) δ t ( j ) = max i [ δ t − 1 ( i ) ⋅ a ij ] ⋅ b j ( o t ) max \max max (取最大)→
三种算法共享同一个计算原语 每一步 = 乘转移矩阵 A(传播) + 乘发射矩阵 D_t(修正) Forward → Σ α_t = (α_{t-1}·A) ⊙ b(o_t) → 边际概率 Backward ← Σ β_t = A·D_{t+1}·β_{t+1} → 后验概率 γ_t Viterbi → max δ_t(j) = max_i[δ_{t-1}·a_ij]·b_j → 最优路径 X* 全部 O(N²T)——矩阵-向量乘法链把 O(N^T) 的指数枚举压缩为多项式递推
这个结构与 Art. 15 马尔可夫链 中的 π t + 1 = π t P \boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P π t + 1 = π t P 完全平行——唯一的新增是发射概率带来的逐元素修正。从矩阵运算的角度看:
HMM 的一步 = 乘以转移矩阵 ⏟ 概率传播(与 Art. 15 相同) + 乘以对角发射矩阵 ⏟ 观测修正(HMM 新增) \text{HMM 的一步} = \underbrace{\text{乘以转移矩阵}}_{\text{概率传播(与 Art. 15 相同)}} + \underbrace{\text{乘以对角发射矩阵}}_{\text{观测修正(HMM 新增)}} HMM 的一步 = 概率传播(与 Art. 15 相同) 乘以转移矩阵 + 观测修正( HMM 新增) 乘以对角发射矩阵
这就是为什么 HMM 的算法复杂度是 O ( N 2 T ) O(N^2 T) O ( N 2 T ) 而非 O ( N T ) O(N^T) 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 的意义不仅在于具体应用,更在于它建立的框架 :
隐变量模型 的原型——后续的 LDA(主题模型)、VAE(变分自编码器)都是隐变量模型
EM 算法 的经典实例——Baum-Welch 是 EM 在序列模型中的标准应用
动态规划 + 概率推断 的结合——Viterbi 算法的思想延伸到 CRF、结构化 SVM 等
“传播 + 修正”范式 ——Forward-Backward 的结构在 Kalman 滤波、信念传播等中反复出现
HMM 的局限
尽管 HMM 影响深远,它有几个根本的局限:
马尔可夫假设太强 :一阶 HMM 假设当前状态只依赖前一个状态——无法建模长程依赖
离散观测的限制 :经典 HMM 假设离散的观测符号集合。虽然可以扩展到连续观测(高斯 HMM),但灵活性有限
隐状态数量固定 :N N N 必须预先指定,对模型选择不友好
表达能力有限 :发射概率是独立的——给定隐状态,当前观测与前后观测无关。这在语音和文本中是不现实的
这些局限催生了后续的改进:条件随机场(CRF)放松了独立性假设,深度学习(RNN/Transformer)用神经网络替代了转移和发射矩阵,获得了更强的表达能力。
总结与展望
本文从马尔可夫链的”可观测”世界进入”隐藏”世界,核心收获是:
HMM = 马尔可夫链 + 发射层 :隐状态按马尔可夫链转移(转移矩阵 A A A ),每个隐状态随机发射观测(发射矩阵 B B B )
三个基本问题 :评估(Forward)、解码(Viterbi)、学习(Baum-Welch)
Forward 算法 = 矩阵-向量乘法链 :每步”乘以转移矩阵 A A A (传播)+ 乘以对角发射矩阵 D t D_t D t (修正)“,复杂度从 O ( N T ) O(N^T) O ( N T ) 降到 O ( N 2 T ) O(N^2 T) O ( N 2 T )
Viterbi = Forward 把 ∑ \sum ∑ 换成 max \max max ,加回溯得到最优路径
Baum-Welch = EM :Forward-Backward 计算软标签,M 步更新参数矩阵
统一线索:HMM 的算法本质上是带观测修正的矩阵-向量乘法链——与 Art. 15 中 π t + 1 = π t P \boldsymbol{\pi}_{t+1} = \boldsymbol{\pi}_t P π t + 1 = π t P 的结构一脉相承,只是多了发射矩阵的逐元素修正。
下一篇 ,我们继续在概念地图上移动——这次是从上到下 :从离散状态空间到连续状态空间。如果隐状态不是 { s 1 , … , s N } \{s_1, \ldots, s_N\} { s 1 , … , s N } 这样的离散类别,而是一个连续向量 x t ∈ R d \mathbf{x}_t \in \mathbb{R}^d x t ∈ R d 呢?离散求和 ∑ i \sum_i ∑ i 变成连续积分 ∫ \int ∫ ,转移矩阵 A A A 变成状态转移方程 x t + 1 = A x t + w t \mathbf{x}_{t+1} = A\mathbf{x}_t + \mathbf{w}_t x t + 1 = A x t + w t ,Forward 算法的”传播 + 修正”变成 Kalman 滤波的”预测 + 更新”——同一个框架在连续世界中的自然延伸。