定义
隐马尔可夫模型是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时序建模,在语音识别、自然语言处理领域有广泛应用。
隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测随机序列的过程。

上图中箭头表示了变量间的依赖关系。在任一时刻,观测变量的取值仅依赖于状态变量,即 xt 由 yt 确定,与其他状态变量及观测变量的取值无关。同时,t 时刻的状态 yt 仅依赖 t−1 时刻的状态 yt−1 ,与此前 t−2 个状态无关。这就是“马尔科夫链”,即系统下一时刻的状态仅由当前状态决定,不依赖于以往的任何状态。基于这种依赖关系,所有变量的联合概率分布为:
P(x1,y1,...,xn,yn)=P(y1)P(x1∣y1)i=2∏nP(yi∣yi−1)P(xi∣yi)(1)
除了结构信息,确定一个隐马尔可夫模型还需要下面三个参数:
-
状态转移概率:模型在各个状态间转换的概率,通常记为矩阵 A=[aij]N×N ,其中
aij=P(yt+1=sj∣yt=si),1≤i,j≤N
-
输出观测概率:模型根据当前状态获得各个观测值的概率,通常记为矩阵 B=[bij]N×M,其中
bij=P(xt=oj∣yt=si),1≤i≤N,1≤j≤M
表示任意时刻 t ,若状态为 si ,则观测值 oj 被获取的概率
-
初始状态概率:模型在初始时刻各状态出现的概率,通常记为 π=(π1,π2,...,πN) ,其中
πi=P(y1=si),1≤i≤N
通过指定状态空间、观测空间和上述三组参数就能确定一个隐马尔可夫模型,通常用其参数 λ=[A,b,π] 来指代。
观测序列生成
给定隐马尔可夫模型 λ ,它按照如下过程产生观测序列 x1,x2,...,xn。
- 设置 t=1 ,并根据初始状态概率 π 选择初始状态 y1
- 根据状态 yt 和输出观测概率 B 选择观测变量取值 xt
- 根据状态 yt 和状态转移矩阵 A 转移模型状态,即确定 yt+1
- 若 t<n ,设置 t=t+1 ,并转到第2步,否则停止
三个基本问题
在实际应用中,人们常关注隐马尔可夫模型的三个基本问题:
- 给定模型 λ=[A,B,π] ,如何有效计算其产生的观测序列 x={x1,x2,...,xn} 的概率 P(x∣λ) ?换言之,如何评估模型与观测序列之间的匹配程度?
- 给定模型 λ=[A,B,π] 和观测序列 x={x1,x2,...,xn} ,如何找到与此观测序列最匹配的状态序列 y={y1,y2,...,yn} ?换言之,如何根据观测序列推断隐藏的模型状态?
- 给定观测序列 x={x1,x2,...,xn} ,如何调整模型参数 λ=[A,B,π] 使得该序列出现的概率 P(x∣λ) 最大?换言之,如何训练模型使其能最好地描述观测数据?
概率计算算法
如何计算观测序列概率 P(O∣λ) 呢?
直接计算法
我们可以列举出所有可能出现的长度为 T 的隐藏序列 I={i1,i2,...,iT} ,分布求出这些隐藏序列与观测序列 O={o1,o2,...oT} 的联合概率分布 P(O,I∣λ) ,这样我们就可以很容易的求出边缘分布 P(O∣λ) 了。
首先,任意一个隐藏序列 I={i1,i2,...,iT} 出现的概率是:
P(I∣λ)=πi1ai1i2ai2i3...aiT−1iT
对于固定的状态序列 I={i1,i2,...,iT},我们要求的观察序列 O={o1,o2,...oT} 出现的概率是:
P(O∣I,λ)=bi1(o1)bi2(o2)...biT(oT)
则 $O $ 和 I 联合出现的概率是:
P(O,I∣λ)=P(I∣λ)P(O∣I,λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)
然后求边缘概率分布,即可得到观测序列 O 在模型 λ 下出现的条件概率 P(O∣λ) :
P(O∣λ)=I∑P(O,I∣λ)=i1,i2,...iT∑πi1bi1(o1)ai1i2bi2(o2)...aiT−1iTbiT(oT)
虽然上述方法有效,但是如果我们的隐藏状态数 N 非常多的那就麻烦了,此时我们预测状态有 NT 种组合,算法的时间复杂度是 O(TNT) 阶的。因此对于一些隐藏状态数极少的模型,我们可以用暴力求解法来得到观测序列出现的概率,但是如果隐藏状态多,则上述算法太耗时,我们需要寻找其他简洁的算法。
前向算法
前向后向算法是前向算法和后向算法的统称,这两个算法都可以用来求HMM观测序列的概率。我们先来看看前向算法是如何求解这个问题的。
前向算法本质上属于动态规划的算法,也就是我们要通过找到局部状态递推的公式,这样一步步的从子问题的最优解拓展到整个问题的最优解。
在前向算法中,前向概率:定义时刻 t 时隐藏状态为 qi, 观测状态的序列为 o1,o2,...ot 的概率为前向概率。记为:
αt(i)=P(o1,o2,...ot,it=qi∣λ)
可以递推地求得前向概率 αt(i) 及观测序列概率 P(O∣λ)
从下图可以看出,我们可以基于时刻 t 时各个隐藏状态的前向概率,再乘以对应的状态转移概率,即 αt(j)aji 就是在时刻 t 观测到 o1,o2,...ot ,并且时刻 t 隐藏状态 qj, 时刻 t+1 隐藏状态 qi 的概率。如果将想下面所有的线对应的概率求和,即 j=1∑Nαt(j)aji 就是在时刻 t 观测到 o1,o2,...ot ,并且时刻 t+1 隐藏状态 qi 的概率。继续一步,由于观测状态 ot+1 只依赖于 t+1 时刻隐藏状态 qi , 这样 [j=1∑Nαt(j)aji]bi(ot+1) 就是在在时刻 t+1 观测到 o1,o2,...ot,ot+1 ,并且时刻 t+1 隐藏状态 qi 的概率。而这个概率,恰恰就是时刻 t+1 对应的隐藏状态ii的前向概率,这样我们得到了前向概率的递推关系式如下:
αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1)

我们的动态规划从时刻1开始,到时刻 T 结束,由于 αT(i) 表示在时刻 T 观测序列为 o1,o2,...ot ,并且时刻 T 隐藏状态 qi 的概率,我们只要将所有隐藏状态对应的概率相加,即 i=1∑NαT(i) 就得到了在时刻 T 观测序列为 o1,o2,...ot 的概率。
总结下前向算法
输入:HMM模型 λ=(A,B,Π) ,观测序列 O=(o1,o2,...oT)
输出:观测序列概率 P(O∣λ)
- 计算时刻1的各个隐藏状态前向概率:
α1(i)=πibi(o1),i=1,2,...N
- 递推时刻 2,3,...T 时刻的前向概率:
αt+1(i)=[j=1∑Nαt(j)aji]bi(ot+1),i=1,2,...N
- 计算最终结果:
P(O∣λ)=i=1∑NαT(i)
从递推公式可以看出,我们的算法时间复杂度是 O(TN2),比暴力解法的时间复杂度 O(TNT) 少了几个数量级。
后向算法
后向算法和前向算法非常类似,都是用的动态规划,唯一的区别是选择的局部状态不同,后向算法用的是“后向概率”,那么后向概率是如何定义的呢?
定义时刻 t 时隐藏状态为 qi , 从时刻 t+1 到最后时刻 T 的观测状态的序列为 ot+1,ot+2,...oT 的概率为后向概率。记为:
βt(i)=P(ot+1,ot+2,...oT∣it=qi,λ)
后向概率的动态规划递推公式和前向概率是相反的。现在我们假设我们已经找到了在时刻 t+1 时各个隐藏状态的后向概率 βt+1(j),现在我们需要递推出时刻 t 时各个隐藏状态的后向概率。如下图,我们可以计算出观测状态的序列为 ot+2,ot+3,...oT,t 时隐藏状态为 qi , 时刻 t+1 隐藏状态为 qj 的概率为 aijβt+1(j) , 接着可以得到观测状态的序列为 ot+1,ot+2,...oT ,t 时隐藏状态为 qi , 时刻 t+1 隐藏状态为 qj 的概率为 aijbj(ot+1)βt+1(j) , 则把下面所有线对应的概率加起来,我们可以得到观测状态的序列为 ot+1,ot+2,...oT,t 时隐藏状态为 qi 的概率为 j=1∑Naijbj(ot+1)βt+1(j) ,这个概率即为时刻 t 的后向概率。

这样我们得到了后向概率的递推关系式如下:
βt(i)=j=1∑Naijbj(ot+1)βt+1(j)
现在我们总结下后向算法的流程,注意下和前向算法的相同点和不同点:
输入:HMM模型 λ=(A,B,Π) ,观测序列 O=(o1,o2,...oT)
输出:观测序列概率 P(O∣λ)
- 初始化时刻 T 的各个隐藏状态后向概率:
βT(i)=1,i=1,2,...N
- 递推时刻 T−1,T−2,...1 时刻的后向概率:
βt(i)=j=1∑Naijbj(ot+1)βt+1(j),i=1,2,...N
- 计算最终结果:
P(O∣λ)=i=1∑Nπibi(o1)β1(i)
此时我们的算法时间复杂度仍然是 O(TN2)。
HMM常用概率的计算
利用前向概率和后向概率,我们可以计算出HMM中单个状态和两个状态的概率公式。
1)给定模型 λ 和观测序列 O ,在时刻 t 处于状态 qi 的概率记为:
γt(i)=P(it=qi∣O,λ)=P(O∣λ)P(it=qi,O∣λ)
利用前向概率和后向概率的定义可知
P(it=qi,O∣λ)=αt(i)βt(i)
于是我们得到:
γt(i)=j=1∑Nαt(j)βt(j)αt(i)βt(i)
2)给定模型 λ 和观测序列 O ,在时刻 t 处于状态 qi ,且时刻 t+1 处于状态 qj 的概率记为:
ξt(i,j)=P(it=qi,it+1=qj∣O,λ)=P(O∣λ)P(it=qi,it+1=qj,O∣λ)
而 P(it=qi,it+1=qj,O∣λ) 可以由前向后向概率来表示为:
P(it=qi,it+1=qj,O∣λ)=αt(i)aijbj(ot+1)βt+1(j)
从而最终我们得到 ξt(i,j) 的表达式如下:
ξt(i,j)=r=1∑Ns=1∑Nαt(r)arsbs(ot+1)βt+1(s)αt(i)aijbj(ot+1)βt+1(j)
- 将 γt(i) 和 ξt(i,j) 在各个时刻 t 求和,可以得到:
在观测序列 O 下状态ii出现的期望值 t=1∑Tγt(i)
在观测序列 O 下由状态ii转移的期望值 t=1∑T−1γt(i)
在观测序列 O 下由状态ii转移到状态jj的期望值 t=1∑T−1ξt(i,j)
上面这些常用的概率值在求解HMM问题二,即求解HMM模型参数的时候需要用到。我们在这个系列的第三篇来讨论求解HMM参数的问题和解法。
参考
https://www.cnblogs.com/pinard/p/6955871.html
周志华《机器学习》