4.5 维特比算法解码隐藏状态序列
学习目标
在本篇我们会讨论维特比算法解码隐藏状态序列,即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。
HMM模型的解码问题最常用的算法是维特比算法,当然也有其他的算法可以求解这个问题。
同时维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题。
1 HMM最可能隐藏状态序列求解概述
HMM模型的解码问题即:
- 给定模型λ=(A,B,Π)和观测序列O=o1,o2,...oT,求给定观测序列O条件下,最可能出现的对应的状态序列I∗=i1∗,i2∗,...iT∗,即P(I∗∣O)的最大化。
一个可能的近似解法是求出观测序列O在每个时刻t最可能的隐藏状态 it∗ 然后得到一个近似的隐藏状态序列I∗=i1∗,i2∗,...iT∗。要这样近似求解不难,利用前向后向算法评估观察序列概率的定义:
- 在给定模型λ和观测序列O时,在时刻t处于状态qi的概率是γt(i),这个概率可以通过HMM的前向算法与后向算法计算。这样我们有:

近似算法很简单,但是却不能保证预测的状态序列整体是最可能的状态序列,因为预测的状态序列中某些相邻的隐藏状态可能存在转移概率为0的情况。
而维特比算法可以将HMM的状态序列作为一个整体来考虑,避免近似算法的问题,下面我们来看看维特比算法进行HMM解码的方法。
2 维特比算法概述
维特比算法是一个通用的解码算法,是基于动态规划的求序列最短路径的方法。
既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式。在HMM中,维特比算法定义了两个局部状态用于递推。
1) 第一个局部状态是在时刻t隐藏状态为i所有可能的状态转移路径i1,i2,...it中的概率最大值。
- 记为δt(i):

由δt(i)的定义可以得到δ 的递推表达式:

2) 第二个局部状态由第一个局部状态递推得到。
- 我们定义在时刻t隐藏状态为i的所有单个状态转移路径(i1,i2,...,it−1,i)中概率最大的转移路径中第t-1个节点的隐藏状态为ψt(i),
- 其递推表达式可以表示为:

有了这两个局部状态,我们就可以从时刻0一直递推到时刻T,然后利用ψt(i)记录的前一个最可能的状态节点回溯,直到找到最优的隐藏状态序列。
3 维特比算法流程总结
现在我们来总结下维特比算法的流程:
输入:HMM模型λ=(A,B,Π),观测序列O=(o1,o2,...oT)
输出:最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗
流程如下:

- 2) 进行动态规划递推时刻t=2,3,...T时刻的局部状态:

- 3) 计算时刻T最大的δT(i),即为最可能隐藏状态序列出现的概率。计算时刻T最大的ψt(i),即为时刻T最可能的隐藏状态。

- 4) 利用局部状态ψt(i)开始回溯。对于t=T−1,T−2,...,1:

最终得到最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗
4 HMM维特比算法求解实例
下面我们仍然用盒子与球的例子来看看HMM维特比算法求解。
我们的观察集合是:

我们的状态集合是:

而观察序列和状态序列的长度为3.
初始状态分布为:

状态转移概率分布矩阵为:

观测状态概率矩阵为:

球的颜色的观测序列:

按照我们前面的维特比算法,首先需要得到三个隐藏状态在时刻1时对应的各自两个局部状态,此时观测状态为1:

现在开始递推三个隐藏状态在时刻2时对应的各自两个局部状态,此时观测状态为2:
- δ2(1)=max1≤j≤3[δ1(j)aj1]b1(o2)=max1≤j≤3[0.1×0.5,0.16×0.3,0.28×0.2]×0.5=0.028
- Ψ2(1)=3
- δ2(2)=max1≤j≤3[δ1(j)aj2]b2(o2)=max1≤j≤3[0.1×0.2,0.16×0.5,0.28×0.3]×0.6=0.0504
- Ψ2(2)=3
- δ2(3)=max1≤j≤3[δ1(j)aj3]b3(o2)=max1≤j≤3[0.1×0.3,0.16×0.2,0.28×0.5]×0.3=0.042
- Ψ2(3)=3
继续递推三个隐藏状态在时刻3时对应的各自两个局部状态,此时观测状态为1:
- δ3(1)=max1≤j≤3[δ2(j)aj1]b1(o3)=max1≤j≤3[0.028×0.5,0.0504×0.3,0.042×0.2]×0.5=0.00756
- Ψ3(1)=2
- δ3(2)=max1≤j≤3[δ2(j)aj2]b2(o3)=max1≤j≤3[0.028×0.2,0.0504×0.5,0.042×0.3]×0.4=0.01008
- Ψ3(2)=2
- δ3(3)=max1≤j≤3[δ2(j)aj3]b3(o3)=max1≤j≤3[0.028×0.3,0.0504×0.2,0.042×0.5]×0.7=0.0147
- Ψ3(3)=3
此时已经到最后的时刻,我们开始准备回溯。此时最大概率为δ3(3),从而得到i3∗=3
由于ψ3(3)=3,所以i2∗=3, 而又由于ψ2(3)=3,所以i1∗=3。从而得到最终的最可能的隐藏状态序列为:(3,3,3)。
5 小结
维特比算法流程总结:
输入:HMM模型λ=(A,B,Π),观测序列O=(o1,o2,...oT)
输出:最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗
流程如下:

- 2) 进行动态规划递推时刻t=2,3,...T时刻的局部状态:

- 3) 计算时刻T最大的δT(i),即为最可能隐藏状态序列出现的概率。计算时刻T最大的ψt(i),即为时刻T最可能的隐藏状态。

- 4) 利用局部状态ψt(i)开始回溯。对于t=T−1,T−2,...,1:

最终得到最有可能的隐藏状态序列I∗=i1∗,i2∗,...iT∗