概率图模型(2)隐马尔可夫模型HMM

1 概述

1.1 HMM概念理解

首先我们需要对一些看起来比较相似的概念做一个总结和区分:

  • 马尔可夫性(Markov Property):无后效性或无记忆性,在已知“现在”的条件下,“将来”与“过去”无关,这种特性就叫强马尔可夫性。如人口增长、电子跃迁、传染病传染人数等;
  • 马尔可夫过程(Markov Process):满足马尔可夫性的随机过程;
  • 马尔可夫链(Markov Chain):时间和状态都是离散的马尔可夫过程称为马尔可夫链,描述了一种状态序列,其每个状态值取决于前面有限个状态。马尔可夫链是具有马尔可夫性质的随机变量的一个数列;
  • 马尔可夫模型(Markov Model):时间t的状态只与其在时间t-1的状态有关,即只取决于前面一个状态,比如语言模型中的二元语法模型2-gram就是一个马尔可夫模型。

在马尔可夫模型中,每个状态代表一个时间的可观察事件,比如在2-gram中每个状态就是一个单词,所以马尔可夫模型又称为可视马尔可夫模型(visible Markov Model,VHM)

那么对于状态不可观察的问题呢,我们观察到的不是状态,观察到的事件是状态的随机函数,状态是未知、不可见的,相当于有两层的随机过程,比如经典的掷硬币问题:假如有两个不均匀硬币A,B,掷到正面的概率分别为\mu_A,\mu_B,小明每次扔一个硬币,我来观察正反面,但我不知道他每次扔的是A还是B,即状态A,B对我是不可见的,我观察到的正反面是状态A,B的随机函数,这种问题怎么描述呢?显然VHM是行不通了,我们要使用隐马尔可夫模型(hidden Markov Model,HHM),如下图,z表示状态,为硬币ABx表示观察到的事件,为正面或反面:

1.2 HMM数学表示

HMM的图示简单明了,下面我们从数学的语言来定义一下隐马尔可夫模型:

1)模型变量:

Q=\{q_1,q_2,...,q_N\}是所有可能状态的集合,V=\{v_1,v_2,...,v_M\}是所有可能观测的集合。
对于一个长度为T的序列:Z=\{z_1,z_2,...,z_T\}为状态序列,X=\{x_1,x_2,...,x_T\}为观测序列。

2)模型基本假设:

  • 齐次马尔可夫性假设:任意时刻的隐藏状态只依赖于它前一个隐藏状态,即在时刻t的隐藏状态是z_t=q_i,在时刻t+1的隐藏状态是z_{t+1}=q_j,从时刻t状态到时刻t+1状态的转移概率a_{ij}可以表示为:

a_{ij}=P(z_{t+1}=q_{j}|z_{t}=q_{i})

  • 观测独立性假设:任意时刻的观察状态只依赖于当前时刻的隐藏状态,即t时刻观察状态v_k在隐藏状态q_i下生成的概率为b_i(k)

b_i(k) = P(x_t = v_k | z_t= q_i)

3)模型参数:

  • 状态转移概率分布A:状态与状态之间互相转移的概率;
  • 观测概率分布B:某状态下生成观测的概率;
  • 初始概率分布\pi:某状态作为初始时刻状态的概率。

4)模型解决的问题:

我们知道,在HMM中我们观察到的是观测序列X,即观测序列X肯定是已知的,状态序列Z和模型参数A,B,\pi都有可能是未知的,因为很容易得到HMM的三个基本问题:

  • 预测问题:求状态序列Z,观测序列X和模型参数A,B,\pi为已知;
  • 学习问题:求模型参数A,B,\pi,观测序列X为已知,状态序列Z可能已知也可能未知;
  • 概率计算问题:求观测序列X出现的概率,模型参数A,B,\pi为已知。

其中预测问题和学习问题是在应用中最常见的饿两个问题,但是要解决他们,问题三概率计算问题的解决是基础,所以我们接下来先来看看概率计算问题怎么解决。

2 概率计算问题

求观测序列X出现的概率,就是计算P(X|A,B,\pi),将参数综合表示为\lambda,即P(X|\lambda),最直接的方法是使用全概率公式,如果我们能把所有可能的状态z都枚举出来,P(X|\lambda)就能以下式计算:

P(X|\lambda)=\sum_Z P(X,Z|\lambda)=\sum_Z P(X|Z,\lambda)P(Z|\lambda)

但是状态序列的可能性很多,上式的时间复杂度为O(TN^T),基本上是不可行的。那怎么办呢?我们采用前向算法或后向算法来计算。

2.1 前向计算

前向概率是t时刻状态和t之前(包括t)观测的联合概率:

\alpha_t(i) = P(o_1,o_2,...o_t, i_t =q_i | \lambda)

前向算法流程:

输入:HMM模型λ=(A,B,\pi),观测序列O=(o_1,o_2,...o_T)
输出:观测序列概率P(O|λ)

  1. 计算时刻1的各个隐藏状态前向概率:

α_1(i)=π_ib_i(o_1),i=1,2,...N

  1. 递推时刻2,3,...T时刻的前向概率:

\begin{align*} α_{t+1}(i)&=P(o_1,o_2,...o_t,o_{t+1}, i_{t+1} =q_i | \lambda)\\ &=∑_{j=1}^NP(o_1,o_2,...o_t,o_{t+1}, i_{t+1} =q_i,i_{t} =q_j | >\lambda)\\ &=∑_{j=1}^NP(o_1,o_2,...o_t,i_{t} =q_j | \lambda)\times P(i_{t+1} >=q_i|o_1,o_2,...o_t,i_{t} =q_j,\lambda)\\&\times P(o_{t+1} >=q_i|o_1,o_2,...o_t,i_{t} =q_j,i_{t+1}=q_i,\lambda)\\ &=∑_{j=1}^Nα_t(j)\times P(i_{t+1} =q_i|i_{t} =q_j)\times >P(o_{t+1}|i_{t+1}=q_i)\\ &=[∑_{j=1}^Nα_t(j)a_{ji}]b_i(o_{t+1}),i=1,2,...N \end{align*}

  1. 计算最终结果:

P(O|λ)=∑_{i=1}^Nα_T(i)

2.2 后向计算

后向概率是t时刻状态条件下,t以后的观测的条件概率,定义时刻t时隐藏状态为q_i, 从时刻t+1到最后时刻T的观测状态的序列为o_{t+1},o_{t+2},...o_T的概率为后向概率。记为:

\beta_t(i) = P(o_{t+1},o_{t+2},...o_T| i_t =q_i , \lambda)

使用后向概率来计算P(O|λ)仍然是一个动态规划的过程,找到\beta_t\beta_{t+1}的关系,从后往前推即可:

后向算法流程:

输入:HMM模型λ=(A,B,\pi),观测序列O=(o_1,o_2,...o_T)
输出:观测序列概率P(O|λ)

  1. 初始化时刻T的各个隐藏状态后向概率:

β_T(i)=1,i=1,2,...N

  1. 递推时刻T−1,T−2,...1时刻的后向概率:

\begin{align*} \beta_{t}(i) &= P(o_{t+1}, o_{t+2},\cdots,o_T|i_t=q_i,\lambda) \\ &=\sum_{j=1}^N{P(o_{t+1}, o_{t+2},\cdots,o_T, i_{t+1}=q_j|i_t=q_i,\lambda)} \\ &=\sum_{j=1}^N{P(o_{t+1}, o_{t+2},\cdots,o_T|i_{t+1}=q_j, i_t=q_i,\lambda)} \cdot P(i_{t+1}=q_j|i_t=q_i,\lambda)\\ &=\sum_{j=1}^N{P(o_{t+1}, o_{t+2},\cdots,o_T|i_{t+1}=q_j, i_t=q_i,\lambda)} \cdot a_{ij}\\ &=\sum_{j=1}^N{P(o_{t+1}, o_{t+2},\cdots,o_T|i_{t+1}=q_j,\lambda)} \cdot a_{ij}\quad \leftarrow 假设1 \\ &=\sum_{j=1}^N{P(o_{t+1}| o_{t+2},\cdots,o_T,i_{t+1}=q_j,\lambda)\cdot P(o_{t+2},\cdots,o_T|i_{t+1}=q_j,\lambda)} \cdot a_{ij}\quad \\ &=\sum_{j=1}^N{P(o_{t+1}|i_{t+1}=q_j,\lambda)\cdot P(o_{t+2},\cdots,o_T|i_{t+1}=q_j,\lambda)} \cdot a_{ij}\quad \leftarrow 假设2\\ &=\sum_{j=1}^N a_{ij}\cdot b_j(o_{t+1})\cdot \beta_{t+1}(j) \quad \end{align*}

  1. 计算最终结果:

P(O|λ)=∑_{i=1}^Nπ_ib_i(o_1)β_1(i)

2.3 前向后向计算小结

前向后向算法的时间复杂度如何呢?不管是前向后向,都是T次递推,每次递推都有N次循环,最后还有一层N次循环,所以时间复杂度是O(TN^2),比O(TN^T)小多了。

看到前向计算和后向计算的定义我们难免有这么个问题:为什么前向概率是联合概率形式,后向概率是条件概率形式呢?
我认为,因为前向计算是要从当前t时刻向t+1时刻推o_{t+1}的,o_{t+1}z_{t+1}得到,z_{t+1}又可由z_{t}得到,也就是说,推o_{t+1}是不需要提前知道任何t+1时刻的信息的,作为对比,我们再看看后向的公式为什么用条件概率的形式,后向计算要从后往前推,而HMM是有向的,从z_{t+1}不能反向推到z_{t},所以我们要得到o_{t}必须先得到z_{t}作为条件,所以后向概率要设计成条件概率的形式。

前后向算法帮助我们解决了HMM的概率计算问题,接下来我们来尝试解决预测问题。

3 预测问题

预测问题:求状态序列Z,观测序列X和模型参数A,B,\pi为已知。

所谓预测,就是找出最可能出现情况,将其作为我们预测的结果。在HMM中就是要找到使观测序列出现概率最大的状态序列Z,即:

Z=\arg \max_Z P(X|Z,\lambda)

我们直接能想到的最简单的办法就是把所有可能的状态序列Z枚举出来,挨个计算P(X|Z,\lambda),使其取得最大值的状态序列Z^*即为我们的预测结果,然而问题还是时间复杂度,维特比算法能够大幅优化这个问题。

维特比算法是基于动态规划的求序列最短路径的方法,不只是用在HMM中,对于维特比算法的具体内容有一篇很好的博客,推荐一波,我就不再拾人牙慧了~链接如下:
小白给小白详解维特比算法(一)
稍微总结一下维特比算法的思路:全部路线下图1,最短路径是从A到D1最短的那条,当我们处于C层,想要到达D1点时,我们必然要选择C1C2C3中的一个(如图2),假设知道了C层前面的所有路线的距离,我们就能结合C到D之间路径的距离决定选择C层的哪个点,一层层依次往前走,我们就能推出一条路来。当然这是倒着想的,正着也是一样的,我们在A层没法决定B层走哪个点,但如果我们看远一点,就可以通过C层的信息决定B层的点,基本上就是这个思路,不清楚的话还是看上面的博客吧。

图1
图2

维特比算法的流程:

输入:HMM模型=(,,\pi),观测序列=(_1,_2,..._)
输出:最可能的状态序列^∗={^∗_1,^∗_2,...,^∗_}

  1. 初始化:

\delta_1(i) = \pi_ib_i(o_1),\;i=1,2...N

\Psi_1(i)=0,\;i=1,2...N

  1. 动态规划递推。对=2,3,...

\delta_{t}(i) = \max_{1 \leq j \leq N}\;[\delta_{t-1}(j)a_{ji}]b_i(0_{t}),\;i=1,2...N

\Psi_t(i) = arg \; \max_{1 \leq j \leq N}\;[\delta_{t-1}(j)a_{ji}],\;i=1,2...N

  1. 终止。计算时刻最大的_(),为最可能状态序列出现的概率;计算时刻最大的Ψ_(),为时刻最可能的状态:

P^* = \max_{1 \leq j \leq N}\delta_{T}(i)

i_T^* = arg \; \max_{1 \leq j \leq N}\;[\delta_{T}(i)]

  1. 最优路径回溯。对于=−1,−2,...,1

i_t^* = \Psi_{t+1}(i_{t+1}^*)

即求得最优路径(最可能的状态序列)I^*= \{i_1^*,i_2^*,...i_T^*\}

4 学习问题

学习问题:求模型参数A,B,\pi,观测序列X为已知,状态序列Z可能已知也可能未知,所以就要分两种情况讨论,第一种是状态序列Z已知;第二种是状态序列Z未知。

4.1 状态序列Z已知:极大似然估计

这种情况比较简单,给定的训练数据中既有观测序列,也有对应的状态序列\{(O_1, Z_1), (O_2, Z_2), ...(O_N, Z_N)\},直接用极大似然估计可得:

  1. 状态转移矩阵:

样本从状态转移到的频率计数是_{},状态转移矩阵为:

A = \Big[a_{ij}\Big], a_{ij} = \frac{A_{ij}}{\sum\limits_{j=1}^{N}A_{ij}}

  1. 观测概率矩阵:

样本状态为j,观测为k的频率计数是B_{jk},观测概率矩阵为:

B= \Big[b_{j}(k)\Big], b_{j}(k) = \frac{B_{jk}}{\sum\limits_{k=1}^{M}B_{jk}}

  1. 初始状态概率:

样本中初始状态为的频率计数为(),初始状态概率分布为:

\Pi = \pi(i) = \frac{C(i)}{\sum\limits_{i=1}^{N}C(i)}

不过很多时候我们是无法得到状态序列的,这种情况下怎么学习到模型的参数呢?我们一般使用鲍姆-韦尔奇算法(Baum-Welch)。

4.1 状态序列Z未知:Baum-Welch算法

训练数据是一批只有观测序列,没有状态序列的数据\{O_1,O_2,...,O_N\},要学习参数\lambda=(A,B,\pi),可以把HMM模型看做是一个含有隐变量的概率模型:

P(O|\lambda)=\sum_ZP(OZ|\lambda)=\sum_ZP(O|Z,\lambda)P(Z|\lambda)

这种含有隐变量的问题我们用EM算法来解决。

未完待续。。。

你可能感兴趣的:(概率图模型(2)隐马尔可夫模型HMM)