1. 问题背景与定位
我们已经学习了 HMM 的评估问题(计算一个观测序列的概率)和学习问题(估计模型参数)。现在,我们面临第三个,也是应用最广泛的问题之一:预测(或解码)问题。
预测问题描述:给定一个 HMM 模型 和一个观测序列 ,我们的任务是找到一条最有可能的隐藏状态序列 ,这条序列能够最好地解释我们所看到的观测序列。
用数学语言来说,我们的目标是求解:
与评估问题的关键区别:
- 评估问题 (前向算法) 计算的是所有可能的隐藏路径产生观测 的概率之和,即 。它回答的是“这个观测序列有多大概率发生?”。
- 预测问题 寻找的是那唯一的一条使后验概率 最大的隐藏路径 。它回答的是“最可能发生了什么内部状态变化,才导致了我看到的这个结果?”。
在实际应用中,比如词性标注,我们拿到一个句子(观测序列),我们想要的不是这个句子出现的概率,而是每个词最可能的词性(最可能的隐藏状态序列)。这正是解码问题的用武之地。
2. 近似算法
在深入维特比算法之前,让我们先思考一个最简单、最直观的方法,也就是“近似算法”。
2.1 算法思想
这个方法的想法是,我们可以独立地考察每一个时刻 ,找出在该时刻最有可能的隐藏状态是什么,然后把这些最可能的状态串起来,作为最终的预测路径。
我们如何计算在时刻 最有可能的状态呢?这正是我们之前学习过的概率 。
这个概率表示,在观测到全部序列 的前提下,时刻 的状态是 的概率。
所以,近似算法的步骤如下: 对每一个时刻 ,都独立地求解:
最后,将这些 拼接起来,得到最终的路径 。
2.2 为什么是“近似”且“有缺陷”的?
这种方法虽然简单直观,但它存在一个致命的缺陷:它只保证了每个时间点的局部最优,而完全忽略了状态之间的转移关系,因此无法保证全局最优。
更严重的是,它甚至可能产生一条非法路径!例如,在时刻 算出的最优状态是 ,在时刻 算出的最优状态是 ,但模型中的状态转移概率 可能为 0。这意味着从 到 的转移是根本不可能发生的。近似算法由于其“各自为政”的计算方式,无法避免这种情况。
因此,我们需要一个能够从全局视角考虑路径整体概率的算法。
2.3 例子分析
模型和数据: 与解决隐马尔科夫模型的学习问题相同,观测序列 。
- 值(前向概率)和 值(后向概率)已由前向-后向算法算出。
- 总概率 。
计算 :
-
时刻 t=1:
- 在时刻1, 最大,所以 。
-
时刻 t=2:
- 在时刻2, 最大,所以 。
-
时刻 t=3:
- 在时刻3, 最大,所以 。
近似算法得到的最优路径为: 。
我们稍后会看到,这个结果与维特比算法得到的全局最优路径是不同的。
3. 维特比算法
维特比算法是解决 HMM 解码问题的标准答案。它同样运用了动态规划 (Dynamic Programming) 的思想,但目标与前向算法截然不同。
- 前向算法在递推时,将所有到达当前状态的路径概率进行求和。
- 维特比算法在递推时,只保留所有到达当前状态的路径中概率最大的那一条。
3.1 直观理解与核心定义
为了实现这个目标,维特比算法需要定义两个关键变量:
-
最大概率变量 : 定义: 在时刻 ,所有以状态 结尾的部分路径 中,能够生成观测子序列 的、概率最大的那条路径的概率值。
这个 记录了到达“时刻 、状态 ”这个节点的最优路径的“得分”。
-
路径记忆变量 (psi): 定义: 在时刻 ,使得 取得最大值的、那个在时刻 的状态。
这个 就像一个“路标”或“回溯指针”,它不记录概率值,而是记录路径本身。它告诉我们,要想到达“时刻 、状态 ”这个最优节点,应该从“时刻 ”的哪个节点过来。
3.2 算法推导与步骤
维特比算法的流程可以分解为四个经典的动态规划步骤:
1. 初始化 (Initialization), 在初始时刻,到达状态 的路径只有一条,就是直接从开始走到 。
-
计算 :
这表示在时刻1处于状态 并观测到 的路径的概率。
-
初始化 :
因为时刻1之前没有状态,我们用0来表示起点。
2. 递推 (Recursion), for 这是算法的核心。假设我们已经计算出了时刻 所有的 ,我们要计算时刻 的 和 。
要想到达时刻 的状态 ,必须从时刻 的某个状态 转移过来。对于每一个可能的 ,从开始到 的最优路径概率是 ,从 转移到 的概率是 。因此,经过 再到 的路径概率是 。
我们要在所有可能的上一步状态 中,选择使得这个概率最大的那一个。
-
计算 :
-
计算 :
这个
argmax记录了是哪个 使得上面的max成立。
3. 终止 (Termination) 当递推到最后时刻 时,我们已经计算出了所有 。最终的最优路径的概率,就是这些值中的最大值。
-
最优路径概率 :
-
最优路径的最后一个状态 :
4. 路径回溯 (Path Backtracking) 现在我们知道了最优路径在时刻 结束于 。我们可以利用存储的 指针,像多米诺骨牌一样,从后往前倒推出整条路径。 For :
最终,我们便能得到完整的全局最优路径 。
3.3 走一遍维特比算法
我们使用之前文章中的盒子与球模型来完整地演算一遍。
- 模型参数:
- (红, 白)
- 观测序列
1. 初始化 (t=1), 观测
2. 递推 (t=2), 观测
-
计算 和 :
- (因为最大值来自 )
-
计算 和 :
- (因为最大值来自 )
-
计算 和 :
- (因为最大值来自 )
3. 递推 (t=3), 观测
-
计算 和 :
-
计算 和 :
-
计算 和 :
4. 终止与回溯
-
比较 。
-
最大值是 。所以最优路径的概率是 。
-
最优路径的最后一个状态是 。
-
开始回溯:
维特比算法得到的全局最优路径为: 。
对比结论:
- 近似算法结果: (状态3 状态2 状态3)
- 维特比算法结果: (状态3 状态3 状态3)
两者结果不同。维特比算法的结果是真正意义上的全局最优解,它考虑了路径上每一步转移的代价,而近似算法没有。
4. 总结与展望
本次,我们成功攻克了 HMM 的解码问题。
- 问题核心: 寻找给定观测序列下,概率最大的那一条隐藏状态序列。
- 近似方法: 通过独立最大化每个时间点的 来确定状态,此方法简单但有缺陷,可能产生非法或非最优的路径。
- 维特比算法: 作为解决解码问题的标准动态规划方法,它通过巧妙地定义最大概率变量 和路径记忆变量 ,高效地找到了全局最优路径。
- 关键区别: 前向算法的核心是求和,而维特比算法的核心是取最大值。这微小但本质的差别,决定了它们解决的是完全不同的问题。
至此,我们已经系统地学习了隐马尔可夫模型的三个基本问题:评估(前向算法)、学习(鲍姆-韦尔奇算法)和解码(维特比算法)。