隐马尔科夫模型三大问题

关于隐马尔科夫模型以及三大问题的相关概念,在之前一篇博客已经介绍过,这里就不再介绍了。这篇博客的主要内容是通过一个例子介绍解决隐马尔科夫模型三大问题的算法。

下面给出例子。
隐马尔科夫模型三大问题
其中三种可观测的值是(walk,shop,clean),隐含的状态是(rainy,sunny)。你可以简单理解为你和你的女朋友异地恋,你的女朋友在她的城市每天所做的事情和你报备,但是你不知道她的城市天气如何。

对于这个例子的三大问题描述是:
(1)已知整个模型,观测到连续三天做的事情是:walk,shop,clean,根据模型求产生这些行为的概率是多少?
(2)同样已知模型,同样连续三天所做的事情是:walk,shop,clean,求这三天的天气如何?
(3)已知这三天所做的事情是:walk,shop,clean,其他什么全都不知道,求这个模型?

遍历算法

即直接计算法,该算法用于解决第一种问题。参考李航的《统计学习方法》一书,给出此方法的数学表述。

给定模型λ(A,B,π)\lambda(A,B,\pi),以及观测序列O=(o1,o2,,oT)O=(o_1,o_2,\cdots,o_T),计算观测序列OO出现的概率P(Oλ)P(O|\lambda)。通过列举所有可能的长度为TT的状态序列I=(i1,i2,,iT)I=(i_1,i_2,\cdots,i_T),求状态序列II和观测序列OO的联合概率P(O,Iλ)P(O,I|\lambda),然后对此求和,得到P(Oλ)P(O|\lambda)

状态序列I=(i1,i2,,iT)I=(i_1,i_2,\cdots,i_T)的概率是P(Iλ)=πi1ai1i2ai2i3aiT1iTP(I|\lambda)=\pi_{i_1}a_{i_1i_2}a_{i_2i_3}\cdots a_{i_{T-1}i_T}对固定的状态序列I=(i1,i2,,iT)I=(i_1,i_2,\cdots,i_T),观测序列O=(o1,o2,,oT)O=(o_1,o_2,\cdots,o_T)的概率是P(OI,λ)=bi1(o1)bi2(o2)biT(oT)P(O|I,\lambda)=b_{i_1}(o_1)b_{i_2}(o_2)\cdots b_{i_T}(o_T)OOII同时出现的联合概率P(O,Iλ)=P(OI,λ)P(Iλ)P(O,I|\lambda)=P(O|I,\lambda)P(I|\lambda)然后求和得到P(Oλ)=IP(O,Iλ)=IP(OI,λ)P(Iλ)P(O|\lambda)=\sum_I{P(O,I|\lambda)}=\sum_I{P(O|I,\lambda)P(I|\lambda)}

在本例中,观测序列OO就是walk,shop,clean(之后用w,s,c表示),而状态序列II则是rainy,sunny(之后用R,S表示)的排列组合,比如说这三天可以是(R,R,R),或者(R,S,R)。这样的排列组合总共有八种,我们只需要计算在这八种情况下(w,s,c)的概率分别是多少,然后求和就行了。

比方说,对于(R,R,R)的情况下连续三天做了(w,s,c)的概率是P(w,s,cR,R,R)=P(R1)P(wR1)P(R2R1)P(sR2)P(R3R1,R2)P(cR3)P(w,s,c|R,R,R)=P(R1)*P(w|R1)*P(R2|R1)*P(s|R2)*P(R3|R1,R2)*P(c|R3)带入数值P(w,s,cR,R,R)=0.60.10.70.40.70.5=0.0058P(w,s,c|R,R,R)=0.6*0.1*0.7*0.4*0.7*0.5=0.0058这就是连续三天下雨并且做了(w,s,c)的概率。同样道理,求出其他几种情况下(w,s,c)的概率,然后求和(这里就不算了),最终得到的就是我们要求的P(Oλ)P(O|\lambda)

对于本例来说,状态序列和观测序列并不是很多,或许可以用此方法计算,但是如果状态序列和观测序列很多的情况下,该算法的计算量是很庞大的,是O(TNT)O(TN^T)阶的(这里NTN^T是指所有可能的状态序列,在本例中就是23=82^3=8种可能),所以这种方法是不可行的。下面介绍计算P(Oλ)P(O|\lambda)的有效算法:前向-后向算法。

前向算法

首先根据《统计学习方法》给出前向概率的定义:给定隐马尔科夫模型λ\lambda,定义到时刻tt部分观测序列为o1,o2,,oto_1,o_2,\cdots,o_t且状态为qiq_i的概率为前向概率,记为αt(i)=P(o1,o2,,ot,it=qiλ)\alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_t=q_i|\lambda)可以递推地求出前向概率αt(i)\alpha_t(i)及观测序列概率P(Oλ)P(O|\lambda)

该算法可以分为以下几步:
(1)初值α1(i)=πibi(o1)i=1,2,,N\alpha_1(i)=\pi_ib_i(o_1),i=1,2,\cdots,N
(2)递推,对于t=1,2,,T1t=1,2,\cdots,T-1αt+1(i)=[j=1Nαt(j)aji]bi(ot+1)i=1,2,,N\alpha_{t+1}(i)=[\sum_{j=1}^N{\alpha_{t}(j)a_{ji}}]b_i(o_{t+1}),i=1,2,\cdots,N
(3)终止P(Oλ)=i=1NαT(i)P(O|\lambda)=\sum_{i=1}^N{\alpha_T(i)}
利用前向概率计算P(Oλ)P(O|\lambda)的计算量是O(N2T)O(N^2T)阶的,显然比直接计算的O(TNT)O(TN^T)要小。

接下来结合例子来做一下说明。
我们把连续三天划分为三个时刻,第一天、第二天和第三天。在第一天,我们观测到的行为是walk,它有两种可能,第一天是晴天的情况下散步和第一天是雨天的情况下散步。所以对于t=1t=1,计算如下:P(w,R1)=P(R1)P(wR1)=0.60.1=0.06P(w,S1)=P(S1)P(wS1)=0.40.6=0.24P(w,R1)=P(R1)*P(w|R1)=0.6*0.1=0.06\\ P(w,S1)=P(S1)*P(w|S1)=0.4*0.6=0.24
在第二天我们观测到的行为是shop,它同样有两种可能,第二天是晴天的情况下购物和第二天是雨天的情况下购物。但是第二天的行为是在第一天的基础上来的,也就是说P(w,s,R2)=[P(w,R1)P(R2R1)+P(w,S1)P(R2S1)]P(sR2)P(w,s,S2)=[P(w,R1)P(S2R1)+P(w,S1)P(S2S1)]P(sS2)P(w,s,R2)=[P(w,R1)*P(R2|R1)+P(w,S1)*P(R2|S1)]*P(s|R2)\\ P(w,s,S2)=[P(w,R1)*P(S2|R1)+P(w,S1)*P(S2|S1)]*P(s|S2)\\
在第三天我们观测到的行为是clean,同第二天一样,所以它的计算方式是:P(w,s,c,R3)=[P(w,s,R2)P(R3R2)+P(w,s,S2)P(R3S2)]P(cR3)P(w,s,c,S3)=[P(w,s,R2)P(S3R2)+P(w,s,S2)P(S3S2)]P(cS3)P(w,s,c,R3)=[P(w,s,R2)*P(R3|R2)+P(w,s,S2)*P(R3|S2)]*P(c|R3)\\ P(w,s,c,S3)=[P(w,s,R2)*P(S3|R2)+P(w,s,S2)*P(S3|S2)]*P(c|S3)
最终P(Oλ)P(O|\lambda)是等于P(w,s,c,R3)+P(w,s,c,S3)P(w,s,c,R3)+P(w,s,c,S3)

后向算法

依旧线给出后向概率的定义:给定隐马尔科夫模型λ\lambda,定义在时刻tt状态为qiq_i的条件下,从t+1t+1TT的部分观测序列为ot+1,ot+2,,oTo_{t+1},o_{t+2},\cdots,o_T的概率为后向概率,记为βt(i)=P(ot+1,ot+2,,oT,it=qiλ)\beta_t(i)=P(o_{t+1},o_{t+2},\cdots,o_T,i_t=q_i|\lambda)同样可以用递推的方法求出后向概率βt(i)\beta_t(i)及观测序列概率P(Oλ)P(O|\lambda)

该算法可以分为以下几步:
(1)初始化后向概率,对最终时刻的所有状态qiq_i规定βT(i)=1\beta_T(i)=1
(2)对t=T1,T2,,1t=T-1,T-2,\cdots,1,有βt(i)=j=1Naijbj(ot+1)βt+1(j)i=1,2,,N\beta_t(i)=\sum_{j=1}^N{a_{ij}b_j(o_{t+1})\beta_{t+1}(j)},i=1,2,\cdots,N
(3)求P(Oλ)P(O|\lambda)思路与(2)一致,只不过初始概率代替了转移概率,即P(Oλ)=i=1Nπibi(o1)β1(i)P(O|\lambda)=\sum_{i=1}^N{\pi_ib_i(o_1)\beta_1(i)}

还是这个例子。设β3(R)=β3(S)=1\beta_3(R)=\beta_3(S)=1,开始计算β2(R)\beta_2(R)β2(S)\beta_2(S)β2(R)=aR>RbR(c)β3(R)+aR>SbS(c)β3(S)=0.70.51+0.30.11=0.38\beta_2(R)=a_{R->R}b_{R}(c)\beta_3(R)+a_{R->S}b_{S}(c)\beta_3(S)\\ =0.7*0.5*1+0.3*0.1*1=0.38这个式子的意思是:假设第二天是雨天,计算第三天是雨天并且clean和第三天是晴天并且clean的情况。同理,β2(S)=aS>RbR(c)β3(R)+aS>SbS(c)β3(S)\beta_2(S)=a_{S->R}b_{R}(c)\beta_3(R)+a_{S->S}b_{S}(c)\beta_3(S)
同样道理,计算β1(R)\beta_1(R)β1(S)\beta_1(S)β1(R)=aR>RbR(s)β2(R)+aR>SbS(s)β2(S)β1(S)=aS>RbR(s)β2(R)+aS>SbS(s)β2(S)\beta_1(R)=a_{R->R}b_{R}(s)\beta_2(R)+a_{R->S}b_{S}(s)\beta_2(S)\\ \beta_1(S)=a_{S->R}b_{R}(s)\beta_2(R)+a_{S->S}b_{S}(s)\beta_2(S)
最后P(Oλ)=πRbR(w)β1(R)+πSbS(w)β1(S)P(O|\lambda)=\pi_{R}b_{R}(w)\beta_1(R)+\pi_{S}b_{S}(w)\beta_1(S)

利用前向概率和后向概率可以将观测序列概率P(Oλ)P(O|\lambda)统一表示成P(Oλ)=i=1Nj=1Nαt(i)aijbj(ot+1)βt+1(j)t=1,2,,T1P(O|\lambda)=\sum_{i=1}^N{\sum_{j=1}^N{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}},t=1,2,\cdots,T-1此式当t=1t=1t=T1t=T-1时分别是两个算法第三步的两个式子。

Viterbi(维特比)算法

该算法是用来解决第二种问题。维特比算法实际上是用动态规划解隐马尔科夫模型预测问题,即用动态规划求概率最大路径(最优路径)。这时一条路径对应着一个状态序列。

根据动态规划的原理,最优路径具有这样的特性:如果最优路径在时刻tt通过节点iti_t^*,那么这一路径从节点iti_t^*到终点iTi_T^*的部分路径,对于从iti_t^*iTi_T^*的所有可能的部分路径来说,必须是最优的。因为如果不是这样,那么从iti_t^*iTi_T^*就有一条更优的部分路径存在,如果把它和i1i_1^*到终点iti_t^*的部分路径连接起来,就会形成一条比原来路径更优的路径,这是矛盾的。

根据这一原理,我们只需要从时刻t=1t=1开始,递推地计算在时刻tt状态为ii的各条部分路径的概率最大值,直至得到时刻t=Tt=T状态为ii的各条部分路径的最大概率,时刻t=Tt=T的最大概率即为最优路径的概率PP^*,最优路径终点iTi_T^*也同时得到。之后,为了找出最优路径的各个节点,从终点iTi_T^*开始,向前逐步求得iT1,,i1i_{T-1}^*,\cdots,i_1^*,得到最优路径I=(i1,i2,,iT)I^*=(i_1^*,i_2^*,\cdots,i_T^*)。这就是维特比算法。

我们引入两个变量Δ\Deltaϕ\phi。定义在时刻tt状态为ii的所有单个路径(i1,i2,,it)(i_1,i_2,\cdots,i_t)中的概率最大值为Δt(i)=maxi1,i2,,it1P(it=i,it1,,i1,ot,,o1λ)i=1,2,,N\Delta_t(i)=\mathop{\text{max}}\limits_{i_1,i_2,\cdots,i_{t-1}}P(i_t=i,i_{t-1},\cdots,i_1,o_t,\cdots,o_1|\lambda),i=1,2,\cdots,N由定义可得变量σ\sigma的递推公式Δt+1(i)=maxi1,i2,,itP(it+1=i,it,,i1,ot+1,,o1λ)=max1jN[Δt(j)aji]bi(ot+1)i=1,2,,Nt=1,2,,T1\Delta_{t+1}(i)=\mathop{\text{max}}\limits_{i_1,i_2,\cdots,i_{t}}P(i_{t+1}=i,i_{t},\cdots,i_1,o_{t+1},\cdots,o_1|\lambda)\\ =\mathop{\text{max}}\limits_{1\leq j \leq N}[\Delta_{t}(j)a_{ji}]b_i(o_{t+1}),i=1,2,\cdots,N;t=1,2,\cdots,T-1定义在时刻tt状态为ii的所有单个路径(i1,i2,,it)(i_1,i_2,\cdots,i_t)中概率最大的路径的第i1i-1个节点为ϕt(i)=argmax1jN[Δt1(j)aji]i=1,2,,N\phi_t(i)=\mathop{\text{argmax}}\limits_{1\leq j \leq N}[\Delta_{t-1}(j)a_{ji}],i=1,2,\cdots,N

维特比算法的步骤如下:
(1)初始化Δ1(i)=πibi(o1)i=1,2,,Nϕ1(i)=0i=1,2,,N\Delta_1(i)=\pi_ib_i(o_1),i=1,2,\cdots,N\\ \phi_1(i)=0,i=1,2,\cdots,N
(2)递推。对于t=2,3,,Tt=2,3,\cdots,TΔt(i)=max1jN[Δt1(j)aji]bi(ot)i=1,2,,Nϕt(i)=argmax1jN[Δt1(j)aji]i=1,2,,N\Delta_{t}(i)=\mathop{\text{max}}\limits_{1\leq j \leq N}[\Delta_{t-1}(j)a_{ji}]b_i(o_{t}),i=1,2,\cdots,N\\ \phi_t(i)=\mathop{\text{argmax}}\limits_{1\leq j \leq N}[\Delta_{t-1}(j)a_{ji}],i=1,2,\cdots,N
(3)终止P=max1iNΔT(i)iT=argmax1iN[ΔT(i)]P^*=\mathop{\text{max}}\limits_{1\leq i \leq N}\Delta_{T}(i)\\ i_T^*=\mathop{\text{argmax}}\limits_{1\leq i \leq N}[\Delta_{T}(i)]
(4)最优路径回溯。对于t=T1,T2,,1t=T-1,T-2,\cdots,1it=ϕt+1(it+1)i_t^*=\phi_{t+1}(i_{t+1}^*)于是,求得最优路径I=(i1,i2,,iT)I^*=(i_1^*,i_2^*,\cdots,i_T^*)

对于本例,我们设ϕ1(R)=ϕ1(S)=0\phi_1(R)=\phi_1(S)=0,这是因为对于第一天的晴天或雨天状态来说它没有前驱。然后计算Δ1(R)\Delta_1(R)Δ1(S)\Delta_1(S),这两个变量表示的是到目前为止最高可能性是多少,就是说第一天是雨天的可能性是多少和第一天是晴天的可能性是多少。Δ1(R)=πRbR(w)=0.60.1=0.06Δ1(S)=πSbS(w)=0.40.6=0.24\Delta_1(R)=\pi_R*b_R(w)=0.6*0.1=0.06\\ \Delta_1(S)=\pi_S*b_S(w)=0.4*0.6=0.24
接下来我们计算Δ2(R)\Delta_2(R)Δ2(S)\Delta_2(S)Δ2(R)=max(Δ1(R)aR>R,Δ1(S)aS>R)bR(s)=max(0.060.7,0.240.4)0.4=0.0384\Delta_2(R)=max(\Delta_1(R)*a_{R->R},\Delta_1(S)*a_{S->R})*b_R(s)\\ =max(0.06*0.7,0.24*0.4)*0.4=0.0384因为Δ1(R)aR>R\Delta_1(R)*a_{R->R}Δ1(S)aS>R\Delta_1(S)*a_{S->R}要小,所以ϕ2(R)=S\phi_2(R)=S,就是说在第二天是雨天的情况下它的前序最优解是晴天。同样的方法求出Δ2(S)\Delta_2(S)ϕ2(S)\phi_2(S)Δ3(R)\Delta_3(R)ϕ3(R)\phi_3(R)Δ3(S)\Delta_3(S)ϕ3(S)\phi_3(S)

最后我们比较Δ3(R)\Delta_3(R)Δ3(S)\Delta_3(S)。假设Δ3(R)>Δ3(S)\Delta_3(R)>\Delta_3(S),那么可以认为连续三天做了(w,s,c)的最优解在第三天是雨天。往上回溯,假设ϕ3(R)=S\phi_3(R)=S(这里是因为上面没做计算),那么最优解在第二天是晴天,继续往上,假设ϕ2(S)=R\phi_2(S)=R(同样没计算),那么最优解在第一天是雨天,而ϕ1(R)=0\phi_1(R)=0,所以回溯结束。最终按照倒序排列得到(R,S,R)(R,S,R),即第一天是雨天第二天是晴天第三天是雨天,这就是所有的最优解。

Baum-Welch算法

这个算法是用来解决第三种问题。假定给定的训练数据只包含SS个长度为TT的观测序列O1,O2,,OSO_1,O_2,\cdots,O_S而没有对应的状态序列,目标是学习隐马尔科夫模型λ=(A,B,π)\lambda=(A,B,\pi)的参数。我们把观测数据看做观测数据OO,状态序列数据看做不可观测的隐藏数据II,那么隐马尔科夫模型实际上就是一个含有隐藏变量的概率模型P(Oλ)=IP(OI,λ)P(Iλ)P(O|\lambda)=\sum_I{P(O|I,\lambda)P(I|\lambda)}它的参数学习可以由EM算法实现。无奈没有学过EM算法,所以只好继续挖坑,下次再填吧。