每个时刻的状态概率给定,我们希望计算整个路径(所有时刻)的最大概率状态。
- 贪心算法(Greedy Algorithm)
- 动态规划:
- Beam search:选定当前时刻k个最佳状态。k=N时计算复杂度和维特比相同,但可能不如维特比好,因为没有假设独立并且每个时刻保存前k个状态可能都是当前时刻的同一状态(比如 [A, B, C] -> [AA, BA, CA] 都是A而没有A’B‘)。
- 维特比算法Viterbi:马尔可夫假设,只考虑相邻时刻的所有状态。比如 [A, B, C] -> [AA, AB, BC]
Beam search
当num_beams=1时集束搜索就退化成了贪心搜索。
维特比算法
从开始状态之后每走一步,就记录下到达该状态的所有路径的概率最大值,然后以此最大值为基准继续向后推进。
假设给定[[隐马尔可夫模型|隐式马尔可夫模型]](HMM)状态空间 S,共有k个状态,初始状态 i 的概率为 ,从状态 i 到状态 j 的转移概率(transition probability)为 。 令观察到的输出为 。 产生观察结果的最有可能的状态序列 由递推关系给出:
此处 是前 t 个最终状态为 k 的观测结果最有可能对应的状态序列的概率。 通过保存向后指针记住在第二个等式中用到的状态 x 可以获得维特比路径。声明一个函数 ,它返回若 时计算 用到的 x 值 或若 时的 k . 这样:
算法复杂度为
具有隐藏状态的概率转移路径(HMM模型)
隐马尔可夫三大问题
- 给定模型,如何有效计算产生观测序列的概率?换言之,如何评估模型与观测序列之间的匹配程度?
- 给定模型和观测序列,如何找到与此观测序列最匹配的状态序列?换言之,如何根据观测序列推断出隐藏的模型状态?
- 给定观测序列,如何调整模型参数使得该序列出现的概率最大?换言之,如何训练模型使其能最好地描述观测数据?
前两个问题是模式识别的问题:1) 根据隐马尔科夫模型得到一个可观察状态序列的概率(评价);2) 找到一个隐藏状态的序列使得这个序列产生一个可观察状态序列的概率最大(解码)。第三个问题就是根据一个可以观察到的状态序列集产生一个隐马尔科夫模型(学习)。
对应的三大问题解法:
- 向前算法(Forward Algorithm)、向后算法(Backward Algorithm)
- 维特比算法(Viterbi Algorithm)
- 鲍姆-韦尔奇算法(Baum-Welch Algorithm) (约等于EM算法)
前向算法(算出观测序列的概率):
后向算法(最后一个时刻的概率合为1,跟前向算法相反的计算路径):
两种算法复杂度都为 O(TN^2)