隐马尔可夫模型(Hidden Markov Model)

背景

隐马尔可夫模型(Hidden Markov Model)是一种常用的统计模型。应用也比较广泛,在时序问题,以及语音识别等问题上有广泛的应用。下面简单介绍一下隐马尔可夫模型。

隐马尔可夫模型是在马尔可夫过程的基础上,加入了隐含状态后的一种结构。这里首先介绍一下什么是马尔可夫过程(Markov Process)

在一个随机过程中,有一个状态变量II,其下一时刻的状态之和之前的状态有关。例如布朗运动,粒子的下一时刻状态之和之前时刻的状态有关。而II变化的过程,也就是马尔科夫链。这个约束,也就是马尔可夫假设。
隐马尔可夫模型(Hidden Markov Model)
在马尔可夫过程中,模型还是很复杂,我们还可以加约束来让模型变得简单一点。我们可以假设,状态变量II的下一时刻状态只和上一时刻的状态有关。这样就得到了齐次马尔可夫模型。即:

p(ItIt1,It2,...,I0)=p(ItIt1),t=1,2,...,Tp(I_t|I_{t-1}, I_{t-2}, ..., I_{0}) = p(I_t|I_{t-1}), t=1, 2, ..., T

我们可以看出,马尔可夫模型的描述,只针对某一个变量而言。但是实际生活中,很多变量之间都是相关的。例如你的运动是由肌肉的收缩和舒张来完成的。但是在观察者看来,你只是完成了一个简单的运动。其中,你的运动状态就是观测到的变化量,而肌肉的状态就是隐藏的状态。所以HMM模型的结构如下图所示:
隐马尔可夫模型(Hidden Markov Model)

和马尔可夫过程一样,HMM也有一些约束条件。首先,HMM要满足马尔可夫假设且满足齐次马尔可夫模型,即:

p(ItIt1,ot1,...,I0,o0)=p(ItIt1),t=1,2,...,Tp(I_t|I_{t-1}, o_{t-1}, ..., I_{0}, o_{0}) = p(I_t|I_{t-1}), t=1, 2, ..., T

然后是观测独立性假设,也就是说任意时刻的观测值只依赖于当前时刻的马尔可夫链的状态iti_t, 即:

p(otIt,It1,ot1,...,I0,o0)=p(otIt),t=1,2,...,Tp(o_t|I_t, I_{t-1}, o_{t-1}, ..., I_{0}, o_{0}) = p(o_t|I_t), t=1, 2, ..., T

原理

HMM的结构如上图所示,其中II是状态变量,OO是观测变量。假设QQ是所有可能的状态的集合,VV是所有可能的观测的集合。

Q={q1,q2,...,qN}Q = \{ q_1,q_2,...,q_N \}

V={v1,v2,...,vM}V = \{v_1,v_2,...,v_M \}

即可能的状态有N种, 可能的观测值有M种,两者不一定会相等。那么在一次试验中,观测到的值为OO,每个观测值会唯一对应一个状态值,因为试验已经结束了,假设状态序列为II,那么OOII的长度一样,假设为T,那么: O={O1,O2,...,OT}O = \{ O_1,O_2,...,O_T \}

I={I1,I2,...,IT}I = \{ I_1,I_2,...,I_T \}

tt时刻会有一个状态值,那么下一个时刻的状态值会与上一时刻相关,当然也可以是不相关的,由此给出状态矩阵AA的定义:

A=[aij]A=[a_{ij}]

aija_{ij}表示当前时刻tt状态为qiq_i的情况下,下一时刻的状态为qjq_j的概率,这里i,j=1,2,...Ni,j=1,2,...N,用数学形式表示,即: aij=P(It+1=qjIt=qi)a_{ij}=P(I_{t+1}=q_j | I_t=q_i)

有了状态转移矩阵后,我们并不能直接估计下一时刻的状态,因为状态在整个试验过程中是隐藏的,试验中只能得到观测值的相关信息,所以还要有观测值和状态值之间的转换矩阵,即当观测到某个值时,其对应于各个状态的概率分别是多少。假设观测概率矩阵是BB,给出BB的定义:

B=[bjk]B=[b_{jk}]

bjkb_{jk}表示当前时刻tt状态值为qjq_j的情况下,观测值为vkv_k的概率。所以有k=1,2,...Mk=1,2,...Mj=1,2,...,Nj=1,2,...,N,用数学形式表示,即:

bjk=P(ot=vkit=qj)b_{jk}=P(o_t=v_k | i_t=q_j)

确定了观测值和状态值之间的转换概率,当前时刻和下一时刻之间的状态转换概率,那么我们还需要确定可能的观测值在试验刚开始时被选中的概率,假设为π\pi,给出π\pi的定义:

π=[πi]\pi=[\pi_{i}]

其中πi\pi_{i}表示观测值qiq_i在刚开始被选中的概率,那么,i=1,2,...,Ni=1,2,...,N,用数学的形式表示,即:

πi=P(I1=qi)\pi_i=P(I_1=q_i)

到这里,整个HMM模型中的主要参数已经全部介绍了,由介绍可知,根据π,A,B\pi,A,B可以让一个HMM模型顺利工作。可以求出在任意状态序列对应的概率P(Oλ)P(O|\lambda)。所以,我们也用这些参数来表示一个HMM模型,即: λ={A,B,π}\lambda=\{ A,B,\pi \}

常见问题

以上介绍了HMM的基本概念,在实际应用中,主要有以下几个基本问题:

  1. 已知模型λ\lambda以及观测序列OO,计算在这种模型下出现这种观测序列的概率P(Oλ)P(O|\lambda)
  2. 已知观测序列OO,但是不知道模型λ\lambda,计算模型λ\lambda,使得当前观测序列产生的概率P(Oλ)P(O|\lambda)最大
  3. 给定模型λ\lambda和观测序列OO,计算最有可能产生这一观测序列的状态序列II,即使得P(IO,λ)P(I|O,\lambda)最大的II

以上就是最常见的HMM问题,主要涉及到模型中各个参数计算的问题。

在问题1中,我们需要计算观测序列出现的概率,主要可以用来判断出现的这一观测序列是否常见,如果计算得到的概率很低,但是在实际观测中却经常出现,那么就需要检查系统中是否出现了外部干扰。

在问题2中,我们需要计算模型的参数。主要是用于模型的学习和自适应参数调整的问题。模型是不确定的,但是根据给定的观测序列,我们需要找到一个最合适的模型,来保证出现这一观测序列的概率最大。有点类似回归求最优解或者神经网络拟合的思想。

在问题3中,我们需要通过观测序列和模型,来估计隐藏状态。这个主要适用于一些解码问题。通过观测值求解隐藏值。

针对以上的问题,分别有对应的解决办法。下面会介绍最常见的一些解法。当然,由于HMM中,观测变量和隐藏状态可能的取值是有限的。所以其实用穷举法也可以算,只是计算量会很大。

解决办法

问题1

已知模型和观测序列,要计算出现这种观测序列的概率P(Oλ)P(O|\lambda)

这个问题有两种解法,前向和后向算法。两种方法比较类似。

  1. 前向算法

首先,我们定义一个概率:

pt(i)=P(o1,o2,...,ot,It=qi)p_t(i) = P(o_1, o_2, ..., o_t, I_t=q_i)

pt(i)p_t(i)表示观测序列为o0,o1,...,ot{o_0, o_1, ...,o_t},同时It=qiI_t=q_i的概率。所以我们有以下递推公式:

pt(i)=(j=1Npt1(j)aji)bikp_{t}(i) = (\sum_{j=1}^{N}p_{t-1}(j)a_{ji})b_{ik}

同时,有ot=vko_{t}=v_{k}。在上面的公式中,j=0Npt1(j)aji\sum_{j=0}^{N}p_{t-1}(j)a_{ji}表示前t1t-1个输出为o1,o2,...,ot1{o_1, o_2, ..., o_{t-1}},且第tt个隐藏状态为qiq_i的概率。因为t1t-1时刻的状态是任何值都可以,只需要乘以对应的转移概率,就可以计算出tt时刻状态为qiq_i的概率了。

然后在初始状态时,有:

p1(i)=πibik,o1=vkp_1(i) = \pi_ib_{ik}, o_1=v_k

所以最终得到的概率为:

P(Oλ)=i=1NpT(i)P(O|\lambda) = \sum_{i=1}^{N}p_T(i)

也就是说,在TT时刻,观测序列为o1,o2,...,oT{o_1, o_2, ..., o_T},且模型为λ\lambda的概率为观测序列为o1,o2,...,oT{o_1, o_2, ..., o_T}TT时刻状态值为q1,q2,...,qN{q_1, q_2, ..., q_N}的所有值的和。

  1. 后向算法

后向算法和前向算法比较类似,都是通过递推的方式逐步计算观测序列的概率。不同的地方是,后向算法是从后往前算,前向算法是从前往后算。

假设观测序列的长度为TT,并定义从t+1t+1时刻到TT时刻的序列为ot+1,ot+2,...,oT{o_{t+1}, o_{t+2}, ..., o_T},且tt时刻的隐藏状态为qiq_i的概率为:

pt(i)=P(ot+1,ot+2,...,oT,It=qiλ)p_t(i) = P(o_{t+1}, o_{t+2}, ..., o_T, I_t=q_i|\lambda)

对于后向算法,初始状态应该是pT(i)p_T(i),表示的是观测序列为oT+1{o_{T+1}}时,且隐藏状态为qiq_i的概率,但是因为已经知道了oTo_T的状态了,且oT+1o_{T+1}并没有发生,所以这里其实给任意值都可以。这个值其实主要表示的是T+1T+1时刻和TT时刻的关系,但是这个关系并不知道,所以给任意值都是可以的。表示这个关系可以是任意的。

然后和前向算法类似,我们可以计算后向的递推公式:

pt(i)=j=1Naijbjkpt+1(j)p_t(i) = \sum_{j=1}^{N}a_{ij}b_{jk}p_{t+1}(j)

其中有,ot+1=vko_{t+1} = v_k

j=1Naijpt+1(j)\sum_{j=1}^{N}a_{ij}p_{t+1}(j)表示t+2t+2时刻状态为qjq_jtt时刻的状态为qiq_i的所有可能的t+2t+2时刻的值的和,所以aijbjkpt+1(j)a_{ij}b_{jk}p_{t+1}(j)表示的是,t+1t+1时刻的观测值为ot+1o_{t+1},也就是vkv_k,同时t+1t+1时刻的状态值为qjq_j的概率。求和之后就是,t+1t+1TT时刻的观测值为ot+1,ot+2,...,oT{o_{t+1}, o_{t+2}, ..., o_{T}},且$

t时刻的隐藏状态为qiq_i的概率。也就是pt(i)p_t(i)

所以可以得到,最终计算的概率为:

P(Oλ)=i=1Nπibi(o1)p1(i)P(O|\lambda) = \sum_{i=1}^{N}\pi_{i}b_i(o_1)p_1(i)

其中,p1(i)p_1(i)表示的是观测序列为o2,o3,...,oT{o_2, o_3, ..., o_T},$ 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

已知观测序列OO, 计算使得P(Oλ)P(O|\lambda)最大的模型参数λ\lambda

这个问题有点类似于回归问题中的拉格朗日极值问题,但是由于涉及到隐藏变量的极大似然估计,所以这里并不能用求导的方法来计算。广泛使用的一种计算方法是EM(Expectation Maximum)算法。关于EM算法,会在后续的文章中介绍,这里暂且不写。

问题3

已知观测序列OO和模型参数λ\lambda,求可能产生这一观测序列的隐藏状态II, 使得P(Iλ)P(I|\lambda)最大

这个问题类似于常见的解码问题。对于HMM模型下的解码问题,一般是用动态规划的方法来求解的。因为这样计算量会降低。常用的HMM解码问题的解决办法是维特比算法(Viterbi Algorithm)。这个也会在后续的文章中介绍。这里暂且不写。