用语音输入法说话,麦克风拿到的是一串声学特征,你想要的是文字。这类语音 AI 要在两者之间架一座桥,而中间隔着一层谁也没直接看见的东西:此刻发出的到底是哪个音。隐马尔可夫模型就是为这类问题设计的——观测看得见,状态看不见,靠两者的统计关系把状态反推出来。这篇讲清它用两组概率把看不见和看得见连起来、三个基本问题各自对应什么算法、它的两条假设在什么情况下会崩,以及今天的深度模型替代了它的哪一部分。
两个序列,两组概率
模型里有两条并行的序列。状态序列是真正想知道的那条,比如每个时刻的音素、词性或真实天气,它不可观测;观测序列是能采集到的那条,比如声学特征、带不带伞。把两者连起来的是两组概率:转移概率描述状态之间怎么切换,今天下雨明天继续下雨的可能性有多大;发射概率描述某个状态下观测长什么样的可能性,下雨天带伞的概率高、晴天带伞的概率低。再加上一组初始状态分布,模型就完整了。所谓隐,指的就是状态这条线藏在观测背后。
三个问题,三套算法
围绕这个结构,经典教材把问题归成三类,每一类都有对应的解法:
| 问题 | 要回答什么 | 经典算法 | 典型用途 |
|---|---|---|---|
| 评估 | 给定模型,这串观测出现的概率有多大 | 前向-后向算法 | 语音识别里给候选句子打分 |
| 解码 | 给定观测,最可能的状态序列是什么 | Viterbi 算法 | 词性标注、音素对齐,实际用得最多 |
| 学习 | 只有观测,两组概率怎么估出来 | Baum-Welch,EM 的一种 | 没有标注数据时训练模型 |
三个问题共用同一套动态规划思路:把对所有可能路径的枚举压缩成逐时刻递推,复杂度从指数级降到与序列长度和状态数的乘积成正比。这也是 HMM 能在算力有限的年代大规模落地的主要原因,优势来自算法把计算量压到了可承受的范围。
为什么这套简化曾经够用
HMM 的两条假设都是大幅简化:当前状态只依赖上一个状态,观测只依赖当前状态。现实显然不是这样,语音里一个音受前后好几个音影响,相邻帧之间高度相关。但在数据量小、算力紧张的条件下,简化带来的偏差往往小于参数估计的方差——状态数一多,要估的转移概率就成倍增长,参数估不准,模型再好也没用。HMM 用强假设换来了参数少、可解释、能在小数据上稳定训练,这三条在当年的工业场景里比精度更值钱。它的状态还能起名字,这个状态对应摩擦音这种可读性,是后来的黑箱模型给不了的。
两条假设,各自在哪里崩
马尔可夫假设的问题出在长距离依赖。自然语言里主谓一致要看很远,语音里的协同发音也跨多个音素,一阶假设把这些信息全压成上一刻,模型只能靠局部上下文猜。观测独立假设的问题更隐蔽:它认为给定状态后各时刻的观测互不相关,而真实信号相邻帧几乎必然相关,这会系统性低估序列的似然,实践中靠加入差分特征、或用混合高斯做发射分布来缓解,但只是打补丁。第三处限制不在假设里,而在设计上:状态数量要人定,设几个、每个代表什么,没有客观标准,设少了表达力不够,设多了参数估不准、还容易过拟合。训练用 EM,只能收敛到局部最优,初始值不同结果可能不同。
两条假设一破就不准
把边界说透:HMM 无法建模真正的长程结构,这是原理性的,调参解决不了;它不擅长处理输入输出长度不一致且对齐未知的任务,后来的 CTC 就是针对这一点提出的;它生成的序列质量偏弱,因为假设太强;状态数与状态含义的人为设定,让它在探索性任务里很难用。这些短板直接催生了后面的路线——用循环网络记住更长的历史,见 LSTM 的门控设计;用注意力机制绕开逐步递推。但要说它完全过时也不准确,在样本少、要求可解释、状态本身有物理含义的场合,比如部分传感器信号分析、生物序列比对,它仍然是个合理选择。
今天还值得理解它的理由
HMM 真正留下的遗产是隐变量这个思路:你观察到的数据背后,往往有一层没被记录的状态,先假设这层状态存在、再假设它如何产生观测,就能把模糊的问题变成可计算的问题。今天的对话系统猜用户意图、推荐系统猜兴趣偏好,用的都是同一个框架,只是把假设换成了神经网络。想从更基础的地方理解这条线,可以先看 马尔可夫链,它是不带隐状态的那一半;再看 语音识别 的演进,能看清这套方法是怎么被一步步替换掉的。
速查:隐马尔可夫模型
- 两个序列:状态序列不可见,观测序列可见
- 两组概率:转移概率管状态怎么变,发射概率管观测怎么来
- 三个问题:评估用前向-后向,解码用 Viterbi,学习用 Baum-Welch
- 两条假设:一阶马尔可夫、观测独立,长依赖和帧间相关都会让它们失真


