背景
隐马尔可夫模型(Hidden Markov Model)是一种常用的统计模型。应用也比较广泛,在时序问题,以及语音识别等问题上有广泛的应用。下面简单介绍一下隐马尔可夫模型。
隐马尔可夫模型是在马尔可夫过程的基础上,加入了隐含状态后的一种结构。这里首先介绍一下什么是马尔可夫过程(Markov Process)
在一个随机过程中,有一个状态变量I,其下一时刻的状态之和之前的状态有关。例如布朗运动,粒子的下一时刻状态之和之前时刻的状态有关。而I变化的过程,也就是马尔科夫链。这个约束,也就是马尔可夫假设。

在马尔可夫过程中,模型还是很复杂,我们还可以加约束来让模型变得简单一点。我们可以假设,状态变量I的下一时刻状态只和上一时刻的状态有关。这样就得到了齐次马尔可夫模型。即:
p(It∣It−1,It−2,...,I0)=p(It∣It−1),t=1,2,...,T
我们可以看出,马尔可夫模型的描述,只针对某一个变量而言。但是实际生活中,很多变量之间都是相关的。例如你的运动是由肌肉的收缩和舒张来完成的。但是在观察者看来,你只是完成了一个简单的运动。其中,你的运动状态就是观测到的变化量,而肌肉的状态就是隐藏的状态。所以HMM模型的结构如下图所示:

和马尔可夫过程一样,HMM也有一些约束条件。首先,HMM要满足马尔可夫假设且满足齐次马尔可夫模型,即:
p(It∣It−1,ot−1,...,I0,o0)=p(It∣It−1),t=1,2,...,T
然后是观测独立性假设,也就是说任意时刻的观测值只依赖于当前时刻的马尔可夫链的状态it, 即:
p(ot∣It,It−1,ot−1,...,I0,o0)=p(ot∣It),t=1,2,...,T
原理
HMM的结构如上图所示,其中I是状态变量,O是观测变量。假设Q是所有可能的状态的集合,V是所有可能的观测的集合。
Q={q1,q2,...,qN}
V={v1,v2,...,vM}
即可能的状态有N种, 可能的观测值有M种,两者不一定会相等。那么在一次试验中,观测到的值为O,每个观测值会唯一对应一个状态值,因为试验已经结束了,假设状态序列为I,那么O和I的长度一样,假设为T,那么: O={O1,O2,...,OT}
I={I1,I2,...,IT}
在t时刻会有一个状态值,那么下一个时刻的状态值会与上一时刻相关,当然也可以是不相关的,由此给出状态矩阵A的定义:
A=[aij]
aij表示当前时刻t状态为qi的情况下,下一时刻的状态为qj的概率,这里i,j=1,2,...N,用数学形式表示,即: aij=P(It+1=qj∣It=qi)
有了状态转移矩阵后,我们并不能直接估计下一时刻的状态,因为状态在整个试验过程中是隐藏的,试验中只能得到观测值的相关信息,所以还要有观测值和状态值之间的转换矩阵,即当观测到某个值时,其对应于各个状态的概率分别是多少。假设观测概率矩阵是B,给出B的定义:
B=[bjk]
bjk表示当前时刻t状态值为qj的情况下,观测值为vk的概率。所以有k=1,2,...M,j=1,2,...,N,用数学形式表示,即:
bjk=P(ot=vk∣it=qj)
确定了观测值和状态值之间的转换概率,当前时刻和下一时刻之间的状态转换概率,那么我们还需要确定可能的观测值在试验刚开始时被选中的概率,假设为π,给出π的定义:
π=[πi]
其中πi表示观测值qi在刚开始被选中的概率,那么,i=1,2,...,N,用数学的形式表示,即:
πi=P(I1=qi)
到这里,整个HMM模型中的主要参数已经全部介绍了,由介绍可知,根据π,A,B可以让一个HMM模型顺利工作。可以求出在任意状态序列对应的概率P(O∣λ)。所以,我们也用这些参数来表示一个HMM模型,即: λ={A,B,π} 。
常见问题
以上介绍了HMM的基本概念,在实际应用中,主要有以下几个基本问题:
- 已知模型λ以及观测序列O,计算在这种模型下出现这种观测序列的概率P(O∣λ)
- 已知观测序列O,但是不知道模型λ,计算模型λ,使得当前观测序列产生的概率P(O∣λ)最大
- 给定模型λ和观测序列O,计算最有可能产生这一观测序列的状态序列I,即使得P(I∣O,λ)最大的I
以上就是最常见的HMM问题,主要涉及到模型中各个参数计算的问题。
在问题1中,我们需要计算观测序列出现的概率,主要可以用来判断出现的这一观测序列是否常见,如果计算得到的概率很低,但是在实际观测中却经常出现,那么就需要检查系统中是否出现了外部干扰。
在问题2中,我们需要计算模型的参数。主要是用于模型的学习和自适应参数调整的问题。模型是不确定的,但是根据给定的观测序列,我们需要找到一个最合适的模型,来保证出现这一观测序列的概率最大。有点类似回归求最优解或者神经网络拟合的思想。
在问题3中,我们需要通过观测序列和模型,来估计隐藏状态。这个主要适用于一些解码问题。通过观测值求解隐藏值。
针对以上的问题,分别有对应的解决办法。下面会介绍最常见的一些解法。当然,由于HMM中,观测变量和隐藏状态可能的取值是有限的。所以其实用穷举法也可以算,只是计算量会很大。
解决办法
问题1
已知模型和观测序列,要计算出现这种观测序列的概率P(O∣λ)
这个问题有两种解法,前向和后向算法。两种方法比较类似。
- 前向算法
首先,我们定义一个概率:
pt(i)=P(o1,o2,...,ot,It=qi)
pt(i)表示观测序列为o0,o1,...,ot,同时It=qi的概率。所以我们有以下递推公式:
pt(i)=(j=1∑Npt−1(j)aji)bik
同时,有ot=vk。在上面的公式中,∑j=0Npt−1(j)aji表示前t−1个输出为o1,o2,...,ot−1,且第t个隐藏状态为qi的概率。因为t−1时刻的状态是任何值都可以,只需要乘以对应的转移概率,就可以计算出t时刻状态为qi的概率了。
然后在初始状态时,有:
p1(i)=πibik,o1=vk
所以最终得到的概率为:
P(O∣λ)=i=1∑NpT(i)
也就是说,在T时刻,观测序列为o1,o2,...,oT,且模型为λ的概率为观测序列为o1,o2,...,oT且T时刻状态值为q1,q2,...,qN的所有值的和。
- 后向算法
后向算法和前向算法比较类似,都是通过递推的方式逐步计算观测序列的概率。不同的地方是,后向算法是从后往前算,前向算法是从前往后算。
假设观测序列的长度为T,并定义从t+1时刻到T时刻的序列为ot+1,ot+2,...,oT,且t时刻的隐藏状态为qi的概率为:
pt(i)=P(ot+1,ot+2,...,oT,It=qi∣λ)
对于后向算法,初始状态应该是pT(i),表示的是观测序列为oT+1时,且隐藏状态为qi的概率,但是因为已经知道了oT的状态了,且oT+1并没有发生,所以这里其实给任意值都可以。这个值其实主要表示的是T+1时刻和T时刻的关系,但是这个关系并不知道,所以给任意值都是可以的。表示这个关系可以是任意的。
然后和前向算法类似,我们可以计算后向的递推公式:
pt(i)=j=1∑Naijbjkpt+1(j)
其中有,ot+1=vk
∑j=1Naijpt+1(j)表示t+2时刻状态为qj且t时刻的状态为qi的所有可能的t+2时刻的值的和,所以aijbjkpt+1(j)表示的是,t+1时刻的观测值为ot+1,也就是vk,同时t+1时刻的状态值为qj的概率。求和之后就是,t+1到T时刻的观测值为ot+1,ot+2,...,oT,且$
t时刻的隐藏状态为qi的概率。也就是pt(i)。
所以可以得到,最终计算的概率为:
P(O∣λ)=i=1∑Nπibi(o1)p1(i)
其中,p1(i)表示的是观测序列为o2,o3,...,oT,$ b_i(o_1)p_1(i)表示观测序列为{o_1, o_2, …, o_T}。所以\pi_ib_i(o_i)p_1(i)表示观测序列为o_1, o_2, …, o_T,且I_1=q_i的概率,对所有的I_1={q_1, q_2, …, q_N}求和,就是观测序列为{o_1, o_2, …, o_N}$的概率
以上就是两种计算观测序列概率的算法。主要的思想都是通过递推计算。
问题2
已知观测序列O, 计算使得P(O∣λ)最大的模型参数λ
这个问题有点类似于回归问题中的拉格朗日极值问题,但是由于涉及到隐藏变量的极大似然估计,所以这里并不能用求导的方法来计算。广泛使用的一种计算方法是EM(Expectation Maximum)算法。关于EM算法,会在后续的文章中介绍,这里暂且不写。
问题3
已知观测序列O和模型参数λ,求可能产生这一观测序列的隐藏状态I, 使得P(I∣λ)最大
这个问题类似于常见的解码问题。对于HMM模型下的解码问题,一般是用动态规划的方法来求解的。因为这样计算量会降低。常用的HMM解码问题的解决办法是维特比算法(Viterbi Algorithm)。这个也会在后续的文章中介绍。这里暂且不写。