Advertisement

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

阅读量:

隐马尔可夫模型(HMM)

简述一下HMM:(参考资料:《统计学习方法》-李航)

隐马尔可夫模型(Hidden Markov Model,HMM)描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型

HMM是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列(状态序列),再由各个状态生成一个观测而产生的观测随机序列(观测序列)的过程。

一堆拗口的术语?下边慢慢道来…

马尔可夫过程

马尔可夫过程指的是:假设一个随机过程中,t+1t+1时刻的状态it+1i_{t+1}的条件分布,仅仅与其前一个状态iti_{t}有关,即:
p(it+1∣i1,i2,...,it)=p(it+1∣it) p(i_{t+1}|i_1, i_2, ..., i_t) = p(i_{t+1}|i_t)

隐马尔可夫模型 是由马尔可夫链生成随机不可观测的随机状态序列,再由各个状态生成可观测的随机序列:

可以得到上述隐马尔可夫模型的图模型结构,状态序列(不可观测的)为I=i1,i2,...,iTI={i_1, i_2, ..., i_T},观测序列为O=o1,o2,...,oTO = {o_1, o_2, ..., o_T}

根据上述图,去理解HMM的两个基本假设.

HMM模型的两个基本的假设

齐次马尔可夫假设 :假设隐藏的马尔可夫链在任一时刻t的状态只依赖于其前一个时刻的状态:
p(it∣it−1,ot−1,...,i1,o1)=p(it∣it−1),i=1,2,...,T p(i_t|i_{t-1}, o_{t-1},...,i_1, o_1) = p(i_t|i_{t-1}), i=1, 2, ..., T
上式中的iti_t表示tt时刻的状态序列值,oto_t表示tt时刻的观测序列值,再强调一遍:该假设就是在说当前时刻序列状态只依赖于上一时刻序列状态。

观测独立性假设 :假设任意时刻的观测状态oto_t只依赖于该时刻的马尔可夫链iti_t 的状态,与其他的观测状态及状态都无关。

继续上边的符号表达:
p(ot∣iT,oT,iT−1,oT−1,...,it+1,ot+1,....,i1,o1)=p(ot∣it) p(o_t|i_T, o_T, i_{T-1}, o_{T-1},...,i_{t+1}, o_{t+1}, ...., i_1, o_1) = p(o_t|i_t)

生成模型 or 判别模型

1.生成模型:

由生成方法学习到的模型称之为生成模型,生成方法是由数据学习联合分布 P(X,Y)P(X, Y),然后求出条件概率分布P(Y∣X)P(Y|X)作为预测的模型:
P(Y|X) = \frac{P(X, Y)}{P(X)}
典型的生成模型有:朴素贝叶斯法,隐马尔可夫模型,生成对抗网络(GAN),变分自编码器(VAE);

生成模式有两种:确定性和非确定性的。

确定性生成模式:变化规律固定,能够根据当前状态,确定判断出下一状态,如交通红绿灯的变化;

非确定性生成模式:变化相对多样,不能准确确定下一状态,如天气的变化。

2.判别模型:

由判别方法学习到的模型称之为判别模型,判别方法是由数据直接学习决策函数或者条件概率分布 P(Y∣X)P(Y|X)作为预测的模型。

典型的判别模型有:kk近邻法,感知机模型,决策树,逻辑回归模型,最大熵模型 ,支持向量机,提升方法和条件随机场 等。

隐藏的马尔可夫链/观测序列

一个比较好的例子去介绍HMM模型,可以参考一下:

http://www.360doc.com/content/13/0226/14/11619026_268005483.shtml

Wikipedia 介绍: https://en.wikipedia.org/wiki/Hidden_Markov_model

简单描述一下这个例子:

假设A与B是两个处于不同地方的朋友,A关心B每天干了什么事情(观测序列 )「散步,购物,大扫除」,想要通过B干的事情去推断出B处地的天气变化(隐藏序列)「晴天,雨天」

隐藏序列集合:Shidden={晴天,雨天}S_{hidden} = {晴天,雨天}

观测序列集合:Sobservations={散步,购物,大扫除}S_{observations} = {散步,购物,大扫除}

初始状态概率矩阵:

Mstart_probability={雨天:0.6,晴天:0.4}M_{start_probability}= {雨天: 0.6, 晴天: 0.4}

状态转移矩阵:

Mtransition_probability={雨天:{晴天:0.3,雨天:0.7},晴天:{晴天:0.6,雨天:0.4}}M_{transition_probability} = {雨天: {晴天: 0.3, 雨天:0.7}, 晴天: {晴天: 0.6, 雨天:0.4}}

发射概率矩阵:

Memission_probability={雨天:{散步:0.1,购物:0.4,大扫除:0.5},晴天:{散步:0.6,购物:0.3,大扫除:0.1}}M_{emission_probability}= {雨天: {散步: 0.1, 购物:0.4,大扫除:0.5}, 晴天: {散步: 0.6, 购物:0.3, 大扫除:0.1}}

隐藏序列:表示无法直接观测到的状态,就上述例子而言就是对方的天气状态;

观测序列:可以直接观测到的状态,就上述例子而言就是获取到的B执行的事情;

初始状态概率矩阵:表示B第一次告诉A的时候,得到的隐藏状态集合中每个状态发生的概率;

状态转移矩阵:表示从一个状态到另一个状态变化的概率,如在上述例子中,从雨天到晴天的概率为0.3;

发射状态矩阵:表示B在相应隐藏状态(天气)下,去执行得到观测状态(执行的动作)的概率,如在雨天,B去散步的概率为0.1;

HMM模型综上描述起来就是五个要素:

两个序列:隐藏序列和观测序列

三个矩阵:初始状态矩阵,发射状态矩阵以及状态转移矩阵

隐马尔可夫模型的3个基本问题

概率计算问题 :给定模型和观测序列,计算观测序列出现的概率 P(O∣λ)P(O|\lambda);

学习问题:已知观测序列 求解模型参数,使得模型在观测序列下的概率最大P(O∣λ)P(O|\lambda),最大似然估计求参数;

预测问题:给定观测序列,求有 可能的对应的状态序列II

符号说明(借鉴《统计学习方法》–李航):

Q:Q:所有可能的状态集合, Q={q1,q2,...,qN}Q={q_1, q_2, ..., q_N}

VV: 所有可能的观测状态的集合,V={v1,v2,...,vM}V={v_1, v_2, ..., v_M}

OO: 实际观测序列,O={o1,o2,...,oT}O={o_1, o_2, ..., o_T}

II: 隐藏的状态序列,I={i1,i2,...,iT}I={i_1, i_2, ..., i_T}

AA: 状态转移矩阵,aija_{ij}表示tt时刻处于状态qiq_i在t+1t+1时刻转移到qjq_j的概率

BB: 观测概率矩阵,bjotb_{jo_t}表示tt时刻处于状态qjq_j条件下生成观测oto_t的概率

π\pi: 初始状态概率向量,猜猜这个向量的长度为多少?当然是等于所有可能的状态集合啦~~~

根据上式定义,有:

所有的初始状态概率和为1:
∑i=1Nπi=1 \sum_{i=1}^{N}\pi_i =1

时刻tt转移到一下个所有可能的状态的概率和为1:

∑j=1Naij=1 \sum_{j=1}^{N} a_{ij} = 1

  1. 时刻tt,由状态jj观测到的所有可能的观测值的概率和为1:

∑k=1Mbjk=1 \sum_{k=1}^{M} b_{jk} = 1

第一个问题:概率计算问题--计算观测序列出现的概率

概率计算问题描述:给定模型λ=(A,B,π)\lambda=(A,B,\pi)和观测序列O=(o1,o2,...,oT)O=(o_1, o_2, ..., o_T),计算观测序列出现的概率P(O∣λ)P(O|\lambda).

1.直接法

直接法,就是直接按照概率公式进行计算,通过穷举出所有可能的长度为TT的状态序列和观测序列的联合概率,然后对状态序列求和:
P(O|\lambda)=\sum_I P(O, I|\lambda) = \sum_I P(O|I, \lambda)P(I|\lambda)
根据隐马尔可夫模型的定义,可以计算状态序列I=(i1,i2,...,iT)I=(i_1, i_2, ..., i_T)的概率(齐次马尔可夫性假设):
P(i_1, i_2, ..., i_T|\lambda) = \pi_{i_1}a_{i_1i_2}a_{i_2i_3}...a_{i_{T-1}i_T}
计算观测序列O=(o1,o2,...,oT)O=(o_1, o_2, ..., o_T)的概率(观测独立性假设):
P(o_1, o_2, ..., o_T | I, \lambda) = b_{i_1o_1}b_{i_2o_2}...b_{i_To_T}

得到他们的联合概率分布如下:
\end{aligned}
对状态序列求和:
\end{aligned}

分析一下时间复杂度,对于状态序列I=(i1,i2,...,iT)I=(i_1, i_2, ..., i_T), i1,i2,...,iTi_1, i_2, ..., i_T均有NN种可能的选择,所以共有NTNT中方法,加之求和符号,所以直接法总的复杂度为O(TNT)O(TNT),指数级别的时间复杂度,往往是不可取的。

2.前向算法 —动态规划的思想

前向算法的核心:定义前向概率
\alpha_t(i) = p(o_1, o_2, ..., o_t, i_t=q_i|\lambda)

根据定义的公式,简单理解就是为从图红线处断隔开,只考虑前半部分计算前向概率,注意:前向概率定义没有包括对隐状态i1,i2,...,it−1i_1, i_2, ..., i_{t-1}的定义。

如此定义的原因是希望后边能够构建动态规划的递推公式:

根据上述定义:

(1) 计算t=1t=1时刻定义的前向概率:
\alpha_1(i) = p(o_1, i_1 = q_1 |\lambda)=p(o_1|i_1, \lambda)p(i_1 | \lambda) = b_{i_1o_1}\pi_i,i=1, 2, ..., N
(2) 构建递推公式(不知道推的过程我是不是复杂化了),对t=1,2,...,T−1t=1, 2, ..., T-1有:
\end{aligned}
(3) 递推终止之后:
P(O|\lambda) = \sum_iP(O, i_t=q_i|\lambda)=\sum_{i=1}^{N}\alpha_T(i)
此时来计算一下时间复杂度:

α1(i)\alpha_ 1(i)中的ii有N种可能性,αt+1(i)\alpha_{t+1}(i)中的计算结果都依赖于αt(j)\alpha_t(j)对N个状态求和的结果(直接引用,避免了重复计算),每次递推都是在前一次的基础上做的,累加O(T)O(T)次,所以总的时间复杂度为O(N2T)O(N^2T),从指数级别的复杂度降成了多项式级别的复杂度.

3.后向算法 —动态规划的思想

后向算法的核心:定义后向概率(时刻tt的状态为qiq_i的条件下,t+1t+1到TT的部分观测序列为ot+1,ot+2,...,oTo_{t+1}, o_{t+2}, ..., o_T的概率)
\beta_t(i) = p(o_{t+1}, o_{t+2}, ..., o_T | i_t=q_i, \lambda)

根据上述后向概率的定义:

(1)计算t=Tt=T时刻的后向概率:
βT(i)=1,i=1,2,...,T \beta_T(i) = 1, \qquad i = 1, 2, ..., T
(2)构建递推公式,递推t=T−1,T−2,...,1t=T-1, T-2, ..., 1
βt(i)=p(ot+1,ot+2,...,oT∣it=qi,λ)=∑jp(ot+1,ot+2,...,oT,it+1=qj∣it=qi,λ)=∑jp(ot+1,ot+2,...,oT∣it=qi,it+1=qjλ)p(it+1=qj∣it=qi,λ)=∑jp(ot+1,ot+2,...,oT∣it=qi,it+1=qjλ)aij=∑jp(ot+2,...,oT∣it+1=qj,λ)p(ot+1∣it=qi,it+1=qj,λ)aij=∑jβt+1(j)bjot+1aij,i=1,2,...,N
(3)计算观测序列的概率:
P(O∣λ)=∑i=1NP(O,i1=qi∣λ)=∑i=1NP(O∣i1=qi,λ)p(i1=qi∣λ)=∑i=1Nβ1(i)πibio1

同前向算法分析复杂度原理可知,后向算法时间复杂度也为O(N2T)O (N^2T)

第二个问题:学习问题--计算模型的参数

学习问题包括两种:

给定观测序列和状态序列的学习问题–监督学习;

只给定观测序列的学习问题–非监督学习,Baum-Welch算法。

1. 给定观测序列和状态序列–监督学习

依据大数定理,计算频率近似于概率(此处不详细描述,具体可参见《统计学习方法》-李航)

2. 只给定观测序列–非监督学习,Baum-Welch算法

只给定观测序列的学习问题,主要是指给定观测序列O=(o1,o2,...,ot)O=(o_1, o_2, ..., o_t)的情况下,学习模型的参数:λ=(A,B,π)\lambda=(A, B, \pi),在状态序列未知的情况下,其实就是含有隐变量的模型参数求解问题,利用最大似然估计求解:
P(O∣λ)=∑IP(O∣I,λ)P(I∣λ) P(O|\lambda) = \sum_IP(O|I, \lambda)P(I|\lambda)
给定观测序列,状态序列未知,熟悉EM算法的应该很容易联想到这个算法了,可以将状态序列看作是EM算法中的隐变量,回顾一下EM算法的求解步骤:
E−step:Q(θ,θ(i))=∑zlogP(x,z,θ)P(z∣x,θ(i))M−step:θ(i+1):=argmaxθQ(θ,θ(i))
其中z(i)z^{(i)}表示隐变量,xx表示输入数据,θ\theta表示模型求解的参数

继续回到Baum-Welch算法:

(1) 目标对数似然函数:P(O,I∣λ)P(O, I|\lambda);

(2) 利用EM算法求解:

E步骤,求解Q函数:
Q(λ,λ)=∑IlogP(O,I∣λ)p(I∣λ)=∑IlogP(O,I∣λ)P(O,I∣λ)P(O∣λ)∝∑IlogP(O,I∣λ)P(O,I∣λ~)
其中λ~\tilde{\lambda}是隐马尔可夫模型参数的当前估计值,λ\lambda是要极大化的模型参数。

根据直接计算(直接法)联合概率的公式:
P(O,I∣λ)=πiai1i2ai2i3...aiT−1iTbi1o1bi2o2...biToT
取对数函数:
logP(O,I∣λ)=log(πiai1i2ai2i3...aiT−1iTbi1o1bi2o2...biToT)=logπi+∑t=1T−1logaitit+1+∑t=1Tlogbitot
带入Q函数:
∑IlogP(O,I∣λ)P(O,I∣λ)=∑Ilog(πiai1i2ai2i3...aiT−1iTbi1o1bi2o2...biToT)P(O,I∣λ)=∑I(logπi+∑t=1T−1logaitit+1+∑t=1Tlogbitot)P(O,I∣λ~)

M-step 求解模型的参数

上述三个加和拆开,得到三个部分,三个部分分别满足约束条件:∑ipi=1,∑jaij=1,∑kbjk=1\sum_i p_i = 1, \sum_j a_ij =1, \sum_k b_jk=1,分别对这三个部分依次利用拉格朗日求解,即可求解得到模型的参数。

第三个问题:预测问题--给定观测序列预测隐藏序列

预测算法–(经典算法–维特比算法)-- 参照《统计学习方法》

维特比算法实际是用动态规划解马尔可夫模型预测问题,用动态规划求解概率最大的路径。

定义tt时刻状态为ii的所有单个路径(i1∗,i2∗,...,it∗)(i_1^, i_2^, ..., i_t^*)中概率最大值:
δt(i)=maxi1,i2,...,it−1P(it=i,it−1,...,i1,ot,ot−1,...,o1∣λ),i=1,2,...,N \delta_t(i) = max_{i_1, i_2, ..., i_{t-1}}P(i_t=i, i_{t-1}, ..., i_1, o_t, o_{t-1}, ..., o_1| \lambda), \quad i=1, 2, ..., N
由定义和隐马尔可夫假设可以得到变量δ\delta的递推公式,可以推出如下公式:
δt+1(i)=maxi1,i2,...,itP(it+1=i,it,...,i1,ot+1,ot,ot−1,...,o1∣λ)=max1≤j≤N[δt(j)aji]biot+1,i=1,2,...,N;t=1,2,...,T−1
定义在时刻tt状态为ii的所有单个路径(i1,i2,...,it)(i_1, i_2, ..., i_t)中概率最大的路径的第t−1t-1个结点为:
ϕt(i)=argmax1≤j≤N[δt−1(j)aji],i=1,2,...,N \phi_t(i) = argmax_{1 \leq j \leq N}[\delta_{t-1}(j)a_{ji}], \qquad i=1, 2, ..., N

维特比算法:

(1) 初始值: δ1(i)=πibio1,i=1,2,...,N;\delta_1(i) = \pi_ib_{io_1},i=1, 2, ..., N; ϕ1(i)=0,i=1,2,...,N\phi_1(i) = 0, i=1, 2, ..., N

(2)递推:对t=2,3,4,...,Tt=2, 3, 4,..., T,有:
δt(i)=max1≤j≤N[δt−1(j)aji]biot,i=1,2,...,N;ϕt(i)=argmax1≤j≤N[δt−1(j)aji],i=1,2,...,N \delta_t(i)= max_{1 \leq j \leq N}[\delta_{t-1}(j)a_{ji}]b_{io_{t}}, \qquad i=1, 2, ..., N;\ \phi_t(i) = argmax_{1 \leq j \leq N}[\delta_{t-1}(j)a_{ji}], \qquad i=1, 2, ..., N
(3)终止:
P∗=max1≤i≤NδT(i);iT∗=argmax1≤i≤N[δT(i)] P^* = max_{1 \leq i \leq N} \delta_T(i); \ i_T^* = argmax_{1 \leq i \leq N}[\delta_T(i)]
(4)最优路径回溯:对t=T−1,T−2,...,1t= T-1, T-2, ..., 1,有:
it∗=ϕt+1(it+1∗) i_t^* = \phi_{t+1}(i_{t+1}^)
最优路径为:I∗=(i1∗,i2∗,...,iT∗)I^
= (i_1^, i_2^, ..., i_T^*)

整个算法的流程如上述描述,下边简单介绍一下每一步都在干什么?

(1)定义初始值,针对第一个节点而言,其概率值即为每个状态的概率值乘以每个状态下观测到第一个值的概率,即πibio1\pi_i b_{io_1};

(2)在初始值给定的条件下,计算产生第二个观测序列值在每一个状态下的概率最大值,即δ2(i)\delta_2(i),使用ϕ2(i)\phi_2(i)来记录到达该最大概率值的上一个状态,依次递推下去。这里δt(i)\delta_t(i)获取的是概率最大值,ϕt(i)\phi_t(i)获取的是到达概率最大值的上一个状态;

(3)最终计算到最后一个时刻TT的最大概率值,并且可以进行最优路径的回溯。

参考资料:

[1] http://www.360doc.com/content/13/0226/14/11619026_268005483.shtml

[2] https://en.wikipedia.org/wiki/Hidden_Markov_model

[3] 统计学习方法,李航著,清华大学出版社

全部评论 (0)

还没有任何评论哟~