版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/86528437
1.隐马尔可夫模型HMM
1.1 简介
隐马尔科夫模型是与概率论密切相关的一个模型,隐马尔科夫模型(Hidden Markov Model,以下简称HMM)在语音识别,自然语言处理等方面都有所应用。它被用来解决这样的问题:有两组序列Q和V,Q无法被观察到,称为隐藏序列。但是与V有着某种概率上的关系,而V是可以直接被观察到的,称为状态序列。
1.2 定义
令
Q={
q1,q2,...,qN}表示所有隐藏状态的集合,
V={
v1,v2,...,vM}表示所有可观察状态的集合,N表示隐藏状态数,M表示可观察状态数。对于一个长度为T的序列来说,S表示隐藏状态序列,O表示观察序列,即
S={
s1,s2,...,sT},
O={
o1,o2,...oT},其中
st∈Q,
ot∈V。
一个HMM模型需要由三部分组成,分别是隐藏状态的初始概率分布
Π,状态转移概率矩阵
A,以及观测状态概率矩阵
B。
HMM模型假定了一个隐藏状态只跟前一个隐藏状态有关。令时刻t的状态
st=qi,时刻t+1的状态为
st+1=qj即从时刻t到时刻t+1的HMM状态转移概率
aij=P(st+1=qj∣st=qi),所有的
aij组成了状态转移概率矩阵A。
HMM模型同时也假定了一个被观测到的状态,只跟当前的隐藏状态有关。令时刻t的隐藏状态
st=qj,对应的观察状态
ot=vk即时刻t的观察状态
vk在隐藏状态
qj下的生成概率为
bj(k)=P(ot=vk∣st=qj),所有的$b_j(k)组成了观测状态概率矩阵B。
1.3 实例
用概率论中经典的“取球模型”来类比的话,假设我们有3个盒子,每个盒子里都有红色和白色两种球,这三个盒子里球的数量分别是:
白球数红球数盒子155盒子246盒子373
根据盒子中球的分布,可以得到观测状态概率矩阵B:
A=⎝⎛0.50.40.70.50.60.3⎠⎞
按照下面的方法从盒子里抽球,开始的时候,从第一个盒子抽球的概率是0.2,从第二个盒子抽球的概率是0.4,从第三个盒子抽球的概率是0.4。则初始概率分布
Π=(0.2,0.4,0.4)T 以这个概率抽一次球后,将球放回。然后从当前盒子转移到下一个盒子进行抽球。规则是:如果当前抽球的盒子是第一个盒子,则以0.5的概率仍然留在第一个盒子继续抽球,以0.2的概率去第二个盒子抽球,以0.3的概率去第三个盒子抽球。如果当前抽球的盒子是第二个盒子,则以0.5的概率仍然留在第二个盒子继续抽球,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球。如果当前抽球的盒子是第三个盒子,则以0.5的概率仍然留在第三个盒子继续抽球,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。说了这么多,最终得到的就是状态转移概率矩阵A:
A=⎝⎛0.50.30.20.20.50.30.30.20.5⎠⎞
其中
观察集合是:
V={红,白},M=2
状态集合是:
Q={盒子1,盒子2,盒子3},N=3
1.4 生成观测序列
假设我们存在一个HMM模型
λ=(A,B,Π),且已知观测序列的长度T,需要生成一个观测序列
O={o1,o2,...oT},其生成过程如下:
- 根据初始概率分布
Π生成隐藏状态
s1
- 根据当前隐藏状态
st以及观察状态概率
bst(k)生成观察状态
ot。
- 根据当前隐藏状态
st以及状态转移概率
astst+1生成隐藏状态
st+1
- 重复T次步骤2和3,得到所有的
ot组成观察序列
O={o1,o2,...oT}
1.5 HMM的三个基本问题
- 评估观察序列概率。即给定模型λ=(A,B,Π)和观测序列O={o1,o2,…oT},计算在模型λ下观测序列O出现的概率P(O|λ)。这个问题的求解需要用到基于动态规划的前向后向算法。
- 模型参数学习问题。即给定观测序列O={o1,o2,…oT},估计模型λ=(A,B,Π)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法。
- 预测问题,也称为解码问题。即给定模型λ=(A,B,Π)和观测序列O={o1,o2,…oT},求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法。
2.前向后向算法
问题描述:给定模型λ=(A,B,Π)和观测序列O={o1,o2,…oT},计算在模型λ下观测序列O出现的概率P(O|λ)。
2.1 暴力求法
任意一个隐藏序列
S={s1,s2,...,sT}出现的概率是:
P(S∣λ)=Πs1as1s2as2s3...asT−1sT
在已知S的情况下,我们要求的观察序列
O={o1,o2,...oT}出现的概率为
P(O∣S,λ)=bs1(o1)bs2(o2)...bsT(oT)
则S和O联合出现的概率为
P(O,S∣λ)=P(S∣λ)P(O∣S,λ)=Πs1as1s2as2s3...asT−1sTbs1(o1)bs2(o2)...bsT(oT)
然后求边缘概率分布,即可得到观测序列O在模型λ下出现的条件概率P(O|λ):
P(O∣λ)=S∑P(O,S∣λ)
然而暴力算法存在一个大问题,当隐藏状态较多时,预测状态有
NT种组合,上述的算法太过耗时。我们一般使用前向算法或者后向算法来求解这个问题。
2.2 前向算法
算法比较好的同学也许已经发现,上述的过程可以使用动态规划来完成。动态规划的本质是递推,也就是说,我们需要将问题分解为子问题,从子问题的最优解中一步一步,根据递推式,推出整个问题的最优解。
这里给出动态规划中的子问题,也就是前向概率的定义。假设在时刻t,隐藏状态为
qi,观测状态为
o1,o2,...ot的概率为前向概率
ft(i)=P(o1,o2,...,ot∣st=qi,λ)。
考虑时刻t+1的情况,因为HMM的隐藏状态只与前一个隐藏状态有关,既然这样,我们就考虑所有前一个状态,让它们都向t+1时刻的某个状态转移,就可以得到相应的概率,这样的话,我们就得到了前向概率的递推式:
ft+1(i)=bi(ot+1)j=1∑Nft(j)aji
有了递推式,我们就可以推算出最终的目标,得到观测序列O在模型λ下出现的条件概率P(O|λ)。前向算法过程如下:
- 初始化时刻1各个状态的前向概率
f1(i)=Πibi(o1),i=1,2,3,...,N
- 使用递推式
ft+1(i)=bi(ot+1)∑j=1Nft(j)aji递推时刻2,3,…,T的前向概率。
- 计算观测序列O在模型λ下出现的条件概率
P(O∣λ)=i=1∑NfT(i)
2.3 后向算法
后向算法和前向算法类似,不同的地方在于后向算法是从后往前递推。假设在时刻t,隐藏状态为
qi,观测状态为
ot+1,ot+2,...oT的概率为后向概率
gt(i)=P(ot+1,ot+2,...oT∣st=qi,λ)。
考虑时刻t+1的情况,假定我们已经知道当前所有隐藏状态的后向概率
gt+1(j),在时刻t的某个状态i下,由i到达观测状态为
ot+1,ot+2,...,oT的概率为
aijbj(ot+1)gt+1(j),由于这这样的j可以有多个,我们将时刻t+1下所有的状态j考虑进来,就得到了后向概率的递推式:
gt(i)=j=1∑Naijbj(ot+1)gt+1(j)
有了递推式,我们就可以推算出最终的目标,得到观测序列O在模型λ下出现的条件概率P(O|λ)。后向算法过程如下:
- 初始化时刻T各个状态的前向概率
gT(i)=1,i=1,2,3,...,N
- 使用递推式
gt(i)=∑j=1Naijbj(ot+1)gt+1(j)递推时刻T-1,T-2,…,1的后向概率。
- 计算观测序列O在模型λ下出现的条件概率
P(O∣λ)=i=1∑NΠibi(o1)g1(i)
3.鲍勃-韦尔奇算法
给定若干训练样本O={o1,o2,…oT},估计模型λ=(A,B,Π)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法。
联合分布
P(O,S∣λ)的表达式如下:
P(O,S∣λ)=d=1∏DΠi1(d)bi1(d)(o1(d))ai1(d)i2(d)bi2(d)(o2(d))...aiT−1(d)iT(d)biT(d)(oT(d))
E-Step的期望表达式为:
L(λ,λˉ)=S∑P(S∣O,λˉ)logP(O,S∣λ)
因为
P(S∣O,λˉ)=P(O∣λˉ)P(O,S∣λˉ),分母是常数,所以在M-Step中我们要最大化的表达式为:
λˉ=argλmaxd=1∑DS∑P(O,S∣λˉ)(logπs1+t=1∑T−1logast,st+1+t=1∑Tbst(ot))............(1)
式子1分别对A,B,
Π求导,得到相应的迭代公式。在开始推导前,我们先定义一些变量。
由前向概率和后向概率定义可知:
P(st=qi,O∣λ)=ft(i)gt(i)P(st=qi,st+1=qj,O∣λ)=ft(i)aijbj(ot+1)gt+1(j)
给定模型λ和观测序列O,在时刻t处于状态
qi的概率记为:
γt(i)=P(st=qi∣O,λ)=P(O∣λ)P(st=qi,O∣λ)=j=1∑Nft(j)gt(j)ft(i)gt(i)
给定模型λ和观测序列O,在时刻t处于状态
qi,且时刻t+1处于状态
qj的概率记为:
ξt(i,j)=P(st=qi,st+1=qj∣O,λ)=P(O∣λ)P(st=qi,st+1=qj,O∣λ)=r=1∑Ns=1∑Nft(r)arsbs(ot+1)gt+1(s)ft(i)aijbj(ot+1)gt+1(j)
3.1 对
πi求导
式子1对
Πi求偏导,式子中后面部分的
t=1∑T−1logast,st+1+t=1∑Tbst(ot)为常数,直接无视,求导的式子变成
λˉ=argλmaxd=1∑DS∑P(O,S∣λˉ)logπs1............(2)
由于
Πi是初始概率分布,所以还满足
i=1∑Nπi=1。因此需要用到拉格朗日乘子法来求。式子2的拉格朗日函数为:
L(πi)=d=1∑DS∑P(O,S∣λˉ)logπs1+γ(i=1∑Nπi−1)............(3)
对
πi进行求导,并令偏导数为0,得到
d=1∑DP(O,s1(d)=i∣λˉ)+γπi=0.........(4)
由于i可以取值范围为1到N,因此我们得到N个方程,将所有方程相加后得到
d=1∑DP(O∣λˉ)+πi=0..........(5)
联立4和5得到
πi=d=1∑DP(O∣λˉ)d=1∑DP(O,s1(d)=i∣λˉ)=DP(O∣λˉ)d=1∑DP(O,s1(d)=i∣λˉ)=Dd=1∑DP(s1(d)=i∣O(d),λˉ)=Dd=1∑Dγi(d)..........(6)
至此就得到了
π的迭代公式。
3.2 对
aij求导
式子1对
aij求偏导,直接无视常数部分,求导的式子变成
d=1∑DS∑t=1∑T−1P(O,S∣λˉ)logast,st+1=d=1∑Di=1∑Nj=1∑Nt=1∑T−1P(O,st(d)=i,st+1(d)=j∣λˉ)logaij............(7)
同样存在
i=1∑Naij=1的限制,使用拉格朗日乘子法,最终得到
aij的表达式为
aij=∑d=1D∑t=1T−1P(O(d),st(d)=i∣λˉ)∑d=1D∑t=1T−1P(O(d),st(d)=i,st+1(d)=j∣λˉ)=∑d=1D∑t=1T−1γt(d)(i)∑d=1D∑t=1T−1ξt(d)(i,j)
3.3 对
bj求导
同上述的步骤类似,
bj(k)的迭代公式为:
bj(k)=d=1∑Dt=1∑NP(O,st(d)=j∣λˉ)d=1∑Dt=1,ot(d)=vk∑NP(O,st(d)=j∣λˉ)=d=1∑Dt=1∑Nγt(d)(j)d=1∑Dt=1,ot(d)=vk∑Nγt(d)(j)
3.4 算法总结
- 随机初始化HMM的参数
λ
- 对所有的观察序列,计算
γt(d)(i),ξt(d)(i,j),t=1,2,…,T
- 根据迭代公式更新模型参数
- 如果参数收敛,则算法结束,否则重复2和3。
4. 维特比算法
问题描述:在已知模型参数
λ和观察序列O的情况下,要找出最有可能的隐藏状态。可以使用维特比算法来解决,它是一种基于动态规划的算法。在维特比算法中,定义了两个局部状态。
定义
δt(i)表示在时刻t,状态为i的情况下,到目前为止所有可能的转移路径中概率最大的情况。递推式如下:
δt+1(i)=1≤j≤Nmaxδt(j)ajibi(ot+1)
ψt(i)记录在时刻t,状态为i的情况下,概率最大的转移路径的第t-1个节点的状态。递推式如下:
ψt(i)=1≤j≤Nmaxδt−1aji
维特比算法总结如下:
- 初始化
δ1(i)=πibi(o1),ψ1(i)=0,i=1,2,...,N
- 利用递推式
δt+1(i)=max1≤j≤Nδt(j)ajibi(ot+1)和
ψt(i)=max1≤j≤Nδt−1aji求解时刻2,3,…,T
- 选择最大的
δT(i),利用
ψt(i)回溯得到前T-1个状态,最终得到最有可能的序列,并且最大的
δT(i)为这个序列出现的概率。