Hidden Markov Model (HMM)
隐马尔可夫模型(HMM)根据含噪观测推断隐藏状态序列。内容涵盖其参数、维特比算法和应用。
隐马尔可夫模型 (HMM) 是一种序列概率模型,其中系统会在无法直接观测的状态之间转换,而每个隐藏状态都会生成一个可以观测到的观测值。给定一组观测值(例如音频帧或 DNA 字母),HMM 会计算每种隐藏状态序列的可能性,例如音频背后的音素或字母背后的基因区域。“马尔可夫”指的是其核心假设:下一个状态只取决于当前状态。Leonard Baum 及其同事在 20 世纪 60 年代末发展了这套理论,HMM 随后在数十年间推动了语音识别的发展。HMM 完全由显式概率构成,至今仍是时间序列分析和生物信息学中的标准工具,也是统计 AI的经典范例。
HMM 的组成部分#
一个包含 N 个隐藏状态的 HMM 由三组概率定义:
- 初始概率 (π):从每个隐藏状态开始的概率。
- 转移概率 (A):一个 N × N 矩阵,其中条目
A[i, j]表示一步内从状态 i 转移到状态 j 的概率,这使隐藏状态构成一个马尔可夫链。 - 发射概率 (B):给定当前状态时每种观测值出现的概率。离散观测值使用表格;连续观测值(例如声学特征)则使用高斯混合等分布。
两个假设让模型保持易于处理:每个状态只取决于前一个状态,每个观测值只取决于当前状态。按时间展开后,模型就是一条由隐藏状态组成的链,每个状态都会发射一个观测值:
HMM 的三个经典问题#
Lawrence Rabiner 在广受引用的 1989 年教程中,将 HMM 的应用归纳为三个问题。每个问题都有一个动态规划解法,其计算成本随观测数量 T 按 N² × T 增长,而非随 Nᵀ 种可能的状态序列增长:
- 评估:给定模型下,某个观测序列出现的可能性有多大?前向算法会对所有隐藏路径求和,因此识别器可以据此选择最能解释一段话语的词语模型。
- 解码:哪种隐藏状态序列最能解释这些观测值?维特比算法由 Andrew Viterbi 于 1967 年发表,用于卷积码解码;它可以找出概率最高的单一路径,而前向后向算法则能给出每个时间步处于各状态的概率。
- 学习:哪些参数最适合一组观测序列?Baum-Welch 算法是期望最大化算法的一个实例,可根据未标注序列估计 π、A 和 B。如果状态序列已标注,只需统计转移和发射次数即可。
用几行 NumPy 代码就能实现维特比解码。在这个模型中,一个人的活动(走路或跑步)是隐藏状态,跟踪器会为每帧提供一条速度读数,而活动往往会持续多个帧:
import numpy as np
states = ["walk", "run"]
start = np.array([0.8, 0.2]) # 初始状态概率
trans = np.array([[0.9, 0.1], [0.1, 0.9]]) # 活动往往会持续多个帧
emit = np.array([[0.7, 0.25, 0.05], [0.1, 0.3, 0.6]]) # P(speed | state),对应慢速、中速、快速
obs = [0, 0, 2, 0, 0, 1, 2, 2, 1, 2] # 逐帧速度读数
# 维特比:到达每个状态的最高对数概率,以及回溯指针
logp = np.log(start) + np.log(emit[:, obs[0]])
back = []
for o in obs[1:]:
scores = logp[:, None] + np.log(trans) # 行:前一个状态;列:下一个状态
back.append(scores.argmax(axis=0))
logp = scores.max(axis=0) + np.log(emit[:, o])
# 从概率最高的最终状态开始,向后追溯最可能的状态序列
path = [int(logp.argmax())]
for pointers in reversed(back):
path.insert(0, int(pointers[path[0]]))
print("Speeds: ", " ".join(["slow", "medium", "fast"][o] for o in obs))
print("Decoded:", " ".join(states[s] for s in path))它会解码 walk walk walk walk walk run run run run run。第 3 帧的快速读数仍被判定为“走路”,因为切换到跑步后再切回来需要进行两次不太可能的状态转移;第 6 帧和第 9 帧的中速读数则会被判定为“跑步”,因为前后都有快速帧。忽略状态转移的逐帧分类器会将第 3 帧标记为跑步。
HMM 与相关模型的比较#
- 卡尔曼滤波器:对于具有线性动态特性和高斯噪声的连续状态,它会执行相同的预测与更新递归过程。HMM 的前向算法是它在离散状态下的对应方法。
- 贝叶斯网络:HMM 是最简单的动态贝叶斯网络,每个时间步包含一个隐藏变量和一个观测变量。
- 马尔可夫决策过程 (MDP):在状态可观测的马尔可夫链中加入动作和奖励,是强化学习背后的框架。
- 循环神经网络和Transformer:从大型数据集中学习长程非线性依赖关系,并已在大多数语音和语言任务中取代 HMM。HMM 所需数据少得多,而且其每个概率都可以直接读取。
- 状态空间模型 (SSM):Mamba 等深度学习层沿用了控制理论中的状态空间思想,并通过学习得到的确定性动态特性更新连续隐藏向量。
实际应用#
- 语音识别:从 20 世纪 80 年代到 2010 年代初,大多数识别器都使用带有高斯混合发射概率的小型 HMM 对每个音素建模。随后,深度神经网络在混合系统中接管了发射模型,之后端到端模型又完全取代了 HMM。
- 生物信息学:剖面 HMM 用于描述相关蛋白质或 DNA 序列家族。HMMER利用这类模型在序列数据库中搜索远缘相关序列,并为 Pfam 蛋白质家族数据库提供支持;基因预测工具也会用 HMM 将基因组片段标注为编码区或非编码区。
- 词性标注:早期的统计自然语言处理会通过对词性序列进行维特比解码,将单词标注为名词、动词和其他词性。
- 活动识别:身体姿态序列或可穿戴传感器读数序列可以解码为站立、行走或跌倒等活动。Ultralytics 的运动监测解决方案会跟踪这类双状态序列:它根据 YOLO26 姿态估计关键点的关节角度(默认使用肘部),将每个人标记为“抬起”或“放下”;角度超过 145° 时切换到“抬起”,低于 90° 时切换到“放下”,并在每次从抬起变为放下时计数一次。










