3. HMM三类问题的求解方法
3.1 问题1的求解方法
给定模型λ,希望计算观测序列O=O1O2⋯OT的概率,即P(O|λ)。最直接的计算方式是枚举所有长度为T的状态序列。对某个状态序列
Q=q1q2⋯qT(12)
其中q1是初始状态。在上面的状态序列的条件下,观测序列O的概率是
P(O|Q,λ)=∏t=1TP(Ot|qt,λ),(13a)
这里假设观测是独立的。于是
P(O|Q,λ)=bq1(O1)⋅bq2(O2)⋯bqT(OT).(13b)
状态序列Q的概率为
P(Q|λ)=πq1aq1q2aq2q3⋯aqT−1qT.(14)
于是O和Q的联合概率为
P(O,Q|λ)=P(O|Q,λ)P(Q,λ).(15)
通过对所有可能的状态序列的联合概率进行求和可以得到O的概率:
P(O|λ)=∑QP(O|Q,λ)P(Q|λ)=∑q1,q2,⋯,qTπq1bq1(O1)aq1q2bq2(O2) ⋯aqT−1qTbqT(QT).(16)(17)
上面的计算公式可以这样理解:在初始时刻(t=1),我们以概率πq1选择状态q1,然后以概率bq1(O1)生成观测值O1。在时刻由t到t+1时,我们从状态q1以概率qq1q2转移到状态q2,然后以概率bq2(O2)生成观测值O2。重复这个过程直到生产时刻T的观测值OT。
根据公式(17)直接计算P(O|λ)的时间复杂度是2T⋅NT阶的,因为在每个时刻t=1,2,⋯,T,都有N种可能的状态,即共有NT种可能的状态序列,对每个状态序列需要大概2T的计算量。更准确地,我们需要(2T−1)NT次乘法,NT−1次加法。即使对比较小的N和T,这个计算量也是非常大的,比如N=5,T=100,计算量是2⋅100⋅5100≈1072阶的。很显然,我们需要一个更有效的方法来解决问题1。这个方法称为前向-后向过程。
事实上,我们只需要前向-后向过程中的前向过程来求解问题1。我们在这节也会介绍后向过程,因为在求解问题3的时候会用到。定义前向变量
αt(i)=P(O1O2⋯Ot,qt=Si|λ),(18)
即给定模型λ,到时刻t部分观测序列为O1O2⋯Ot且t时刻的状态为Si的概率。我们可以通过归纳计算αi(i):
1)初始化:
α1(i)=πibi(O1),1≤i≤N.(19)
2)归纳计算:
αt+1(j)=[∑i=1Nαt(i)aij]bj(Ot+1),1≤t≤T−1,1≤j≤N.(20)
3)终止:
P(O|λ)=∑i=1NαT(i).(21)

步骤1)初始化前向概率为状态Si和O1的联合概率。归纳过程时前向算法的核心,如图4(a)所示。这个图展示了t+1时刻的状态Sj可以由t时刻的N个可能状态Si,1≤i≤N到达。由于αt(i)是部分观测序列O1O2⋯Ot和qt=Si的联合概率,所以乘积αt(i)aij是部分观测序列为O1O2⋯Ot并且qt=Si,qt+1=Sj的联合概率。对时刻t所有可能的N个状态对应的乘积求和,结果就是观测序列为O1O2⋯Ot并且qt+1=Sj的联合概率。这个结果与观测概率bj(Ot+1)的乘积就是αt+1(j)。对给定时刻t,计算所有状态j,1≤j≤N前向概率;然后对所有t=1,2,⋯,T−1迭代计算。步骤3)给出了P(O|λ)的计算公式。因为
αT(i)=O(O1O2⋯OT,qT=Si|λ),(22)
所以P(O|λ)是αT(i)的和。
前向概率计算P(O|λ)的计算量是N2T阶(N(N+1)(T−1)+N次乘法和N(N−1)(T−1)次加法)的,而不是直接计算的TNT阶。对n=5,T=100,前向算法只需要3000次计算,而不是1072次。
前向算法高效的关键在于图4(b)所示的结构。在时刻t=1时刻,计算α1(i),1≤i≤N的。在时刻t=2,3,⋯,T,只需要计算αt(j),1≤j≤N,其中每个值的计算利用了前一时刻的N个αt−1(i)。
类似地,定义后向变量βt(i):
βt(i)=P(Ot+1Ot+2⋯OT|qt=Si,λ)(23)
即在t时刻的状态为Si和给定模型λ的条件下,从t+1到T时刻的部分观测序列为Ot+1Ot+2⋯OT的概率。
仍然可以用归纳的方法计算βt(i):
1) 初始化:
βT(i)=1,1≤i≤N.(24)
2)归纳:
βt(i)=∑j=1Naijbj(Ot+1)βt+1(j),t=T−1,T−2,⋯,1,1≤i≤N.(25)

如图5所示,为了计算在qt=Si的条件下,t+1时刻后的观测序列为Ot+1Ot+2⋯OT的后向概率,需要考虑t+1时刻所有可能状态Sj的转移概率(aij),以及此状态下的观测概率(bj(Ot+1)),然后考虑状态Sj之后的观测序列的后向概率(βt+1(j))。我们后面会看到如何利用前向计算以及后向计算来解决问题2和问题3。
βt(i),1≤t≤T,1≤i≤N的计算量是N2T阶的。