HMM的概率计算问题
HMM的概率计算问题是指,给定模型参数
λ=(A,B,π)
和观测序列
O=(o1,o2,...,oT)
,计算在模型
λ
下,观测序列
O
出现的概率:
P(O|λ)
。
直接计算
按概率公式直接计算,在贝叶斯框架下有:
P(O|λ)=∑IP(O,I|λ)=∑IP(O|I,λ)P(I|λ)
其中,
P(O|I,λ)
是从
it→ot
,由发射概率矩阵
[bj(k)]N×M
中获得:
P(O|I,λ)=P(o1|i1)...P(ot|it)...P(oT|iT)=bi1(o1)...bit(ot)...biT(oT)
,共
T
项
P(I|λ)
是从
it−1→it
,由转移概率矩阵
[aij]N×N
和初始状态概率向量
π
获得:
P(I|λ)=πi1P(i2|i1)...P(it|it−1)...P(iT|iT−1)=πi1ai1i2...ait−1it...aiT−1iT
,共
T
项
两式代入计算得:
P(O|λ)=∑IP(O,I|λ)
=∑IP(O|I,λ)P(I|λ)
=∑I[bi1(o1)...bit(ot)...biT(oT)]×[πi1ai1i2...ait−1it...aiT−1iT]
=∑Iπi1∏Tt=1bit(ot)∏T−1t=1aitit+1
由于
∑I=∑i1...∑it...∑iT
,每个
it
有
N
种取值可能,故
∑I
共有
NT
项,可知若按概率公式直接计算
P(O|λ)
,计算量会很大。
前向算法(Forward Algorithm)
找出从时刻
1→...→t→...→T
,前向概率的递归关系:
前向概率
在观测时间点
1,...,t,...,T
上,对应的观测值为
o1,...,ot,...,oT
,各隐状态分别为
i1,...,it,...,iT
。
i1→...→it→...→iT
o1→...→ot→...→oT
定义前向概率
:
αt(i)=P(o1,...,ot,it=qi|λ)
它表示:截止到时刻
t
,观测序列的值为
o1,o2,...,ot
、且
t
时刻的状态为
qi
的概率。
递归过程的公式推导
根据定义,写出
t=1
和
t=2
的前向概率:
α1(i)=P(o1,i1=qi|λ)=P(o1|i1=qi,λ)P(i1=qi|λ)=bi(o1)πi
α2(j)=P(o1,o2,i2=qj|λ)
=∑Ni=1P(o1,o2,i1=qi,i2=qj|λ)
=∑Ni=1P(o2|i2=qj,λ)P(i2=qj|i1=qi,λ)P(o1|i1=qi,λ)P(i1=qi|λ)
=∑Ni=1bj(o2)aijα1
=bj(o2)∑Ni=1aijα1(i)
...
递推得到
αt+1(j)
与
αt(i)
之间的关系:
αt+1(j)=bj(ot+1)∑i=1Naijαt(i)
其中,
j∈{1,2,...,N}
。
对递归过程的直观理解
以
t=1
和
t=2
两个时刻为例,它们之间涉及到的观测值和隐状态有:
o1
、
o2
、
i1
、
i2
:
i1→i2
o1→o2
当计算出
α1(i)=P(o1,i1=qi|λ),i∈{1,2,...,N}
后,我们手上的信息有:在时刻
t=1
,隐状态为
q1
且观测值为
o1
的概率
α1(1)
、…、隐状态为
qN
且观测值为
o1
的概率
α1(N)
。
而计算
α2(j)=P(o1,o2,i2=qj|λ),j∈{1,2,...,N}
意味着我们要求出:在时刻
t=2
,隐状态为
q1
且过去两个观测值为
o1
、
o2
的概率
α2(1)
、…、隐状态为
qN
且过去两个观测值为
o1
、
o2
的概率
α2(N)
。
如何利用
α1(i)
来计算
α2(j)
?
对比我们已有的信息、待求的信息,发现我们需要确定的是观测值
o2
,而
o2
是通过
i2
决定(即
bi2(o2)
),
i2
又由
i1
确定(即
ai1i2
)。因此,在每个
α1(i)
的基础上,再加入
bi2(o2)
和
ai1i2
这两个概率,就可求得
α2(j)
:
α2(j)=∑i1=1Nα1(i)bi2(o2)ai1i2
稍作调整令
i1=qi,i2=qj
,即可得:
α2(j)=∑i=1Nα1(i)bj(o2)aij=bj(o2)∑i=1Nα1(i)aij
意义
为什么要计算前向概率?
首先,前向概率可以帮助我们计算目标概率:
P(O|λ)
。根据定义,
t=T
时刻的前向概率为:
αT(i)=P(o1,...,oT,iT=qi|λ)
因此,
P(O|λ)=∑Ni=1αT(i)
。
其次,由于递归关系的存在,计算前向概率的工作量,远小于概率公式直接计算。注意到,
i∈{1,2,...,N}
。因此,计算
α1(i)
需进行
N
次运算;计算
α2(i)
需进行
N
次累加;…;计算
αT(i)
需进行
N
次累加。最终进行了
N×T
次运算,远小于
NT
。
计算量减少的原因在于,每一次计算直接引用前一个时刻的计算结果,避免重复计算。
后向算法(Backward Algorithm)
找出从时刻
T→...→t→...→1
,后向概率的递归关系:
后向概率
在观测时间点
1,...,t,...,T
上,对应的观测值为
o1,...,ot,...,oT
,各隐状态分别为
i1,...,it,...,iT
。
i1→...→it→...→iT
o1→...→ot→...→oT
定义后向概率
:
βt(i)=P(ot+1,...,oT|it=qi,λ)
它表示:在
t
时刻的状态为
qi
的条件下,对于
t
之后的所有时刻,观测序列的值为
ot+1,ot+2,...,oT
的概率。
递归过程的公式推导
根据定义,写出
t=T
、
t=T−1
和
t=T−2
的后向概率:
βT(i)=1
【注】:初始值等于
1
是因为,后向概率考量的是
t
时刻之后(不包括
t
时刻)的观测值序列,我们的观测序列只持续到时刻
T
,
T
之后的观测值与状态都未知,所有的情况都是可能的,因此定义为
1
。
βT−1(i)=P(oT|iT−1=qi,λ)
=∑Nk=1P(oT,iT=qk|iT−1=qi,λ)
=∑Nk=1P(oT|iT=qk,λ)P(iT=qk|iT−1=qi,λ)
=∑Nk=1bk(oT)aik
βT−2(j)=P(oT,oT−1|iT−2=qj,λ)
=∑Ni=1∑Nk=1P(oT,oT−1,iT=qk,iT−1=qi|iT−2=qj,λ)
=∑Ni=1∑Nk=1P(oT|iT=qk,λ)P(iT=qk|iT−1=qi,λ)P(oT−1|iT−1=qi,λ)P(iT−1=qi|iT−2=qj,λ)
=∑Ni=1βT−1(i)bi(oT−1)aji
...
递推得到
βt(j)
与
βt+1(i)
之间的关系:
βt(j)=∑i=1Nβt+1(i)bi(ot+1)aji
其中,
j∈{1,2,...,N}
。
对递归过程的直观理解
以
t=T−1
和
t=T−2
两个时刻为例,它们之间涉及到的观测值和隐状态有:
oT−2
、
oT−1
、
oT
、
iT−2
、
iT−1
、
iT
:
iT−2→iT−1→iT
oT−2→oT−1→oT
当计算出
βT−1(i)=P(oT|iT−1=qi,λ),i∈{1,2,...,N}
后,我们手上的信息有:在时刻
t=T−1
,隐状态为
q1
的条件下,后面时刻的观测值为
oT
的概率
βT−1(1)
、…、隐状态为
qN
的条件下,后面时刻的观测值为
oT
的概率
βT−1(N)
。
而计算
βT−2(j)=P(oT,oT−1|iT−2=qj,λ),j∈{1,2,...,N}
意味着我们要求出:在时刻
t=T−2
,隐状态为
q1
的条件下,后面时刻的观测值为
oT
、
oT−1
的概率
βT−2(1)
、…、隐状态为
qN
的条件下,后面时刻的观测值为
oT
、
oT−1
的概率
βT−2(N)
。
如何利用
βT−1(i)
来计算
βT−2(j)
?
对比我们已有的信息、待求的信息,发现我们需要确定的是观测值
oT−1
,而
oT−1
是通过
iT−1
决定(即
biT−1(oT−1)
),
iT−1
又由
iT−2
确定(即
aiT−2iT−1
)。因此,在每个
βT−1(i)
的基础上,再加入
biT−1(oT−1)
和
aiT−2iT−1
这两个概率,就可求得
βT−2(j)
:
βT−2(j)=∑iT−1=1NβT−1(i)biT−1(oT−1)aiT−2iT−1
稍作调整令
t=T−2,t+1=T−1,iT−1=qi,iT−2=qj
,即可得:
βt(j)=∑i=1Nβt+1(i)bi(ot+1)aji
意义
为什么要计算后向概率?
首先,后向概率也可以帮助我们计算目标概率:
P(O|λ)
。根据定义,
t=1
时刻的后向概率为:
β1(i)=P(o2,...,oT|i1=qi,λ)
此时
β1(i)
与目标概率
P(O|λ)
相比,还差一个观测值
o1
。由于所有的观测都相互独立,在
t=1
时刻、状态为
qi
的条件下,观测值
o1
出现的条件概率为:
P(o1|i1=qi,λ)=bi(o1)
两式相乘,得到所有观测值
O=(o1,...,oT)
在
t=1
时刻、状态为
qi
条件下的联合概率:
P(o1,...,oT|i1=qi,λ)=β1(i)bi(o1)
因此,目标概率
P(O|λ)=∑i=1NP(o1,...,oT|i1=qi,λ)P(i1=qi|λ)=∑i=1Nβ1(i)bi(o1)πi
其次,后向概率与前向概率的计算量一样,最终进行了
N×T
次运算,都远远小于概率公式直接计算的
NT
项。
前向-后向算法(Forward-Backward Algorithm)
前向算法利用前向概率,从
1→T
的方向计算
P(O|λ)
=
∑Ni=1αT(i)
后向算法利用后向概率,从
T→1
的方向计算
P(O|λ)
=
∑Ni=1β1(i)bi(o1)πi
也可以同时用前向概率、后向概率计算
P(O|λ)
:
P(O|λ)=∑Ni=1P(O,it=qi|λ)
=∑Ni=1P(O|it=qi,λ)P(it=qi|λ)
=∑Ni=1P(o1,...,ot|it=qi,λ)P(ot+1,...,oT|it=qi,λ)P(it=qi|λ)
=∑Ni=1P(o1,...,ot,it=qi|λ)P(ot+1,...,oT|it=qi,λ)
=∑Ni=1αt(i)βt(i)
若利用后向概率的递推关系,替换
βt(i)=∑Nj=1βt+1(j)bj(ot+1)aij
,又有:
P(O|λ)=∑i=1N∑j=1Nαt(i)βt+1(j)bj(ot+1)aij
其他概率的计算
利用前向、后向概率,还可以进行其他的计算:
给定模型
λ
,则观测序列为
O=(o1,...,oT)
、且
t
时刻的隐状态为
qi
的概率:
P(O,it=qi|λ)=αt(i)βt(i)
给定模型
λ
和观测序列
O=(o1,...,oT)
,则
t
时刻的隐状态为
qi
的概率(单个状态
):
P(it=qi|O,λ)=P(O,it=qi|λ)P(O|λ)=αt(i)βt(i)∑Nj=1αt(j)βt(j)
给定模型
λ
和观测序列
O=(o1,...,oT)
,则
t
时刻的隐状态为
qi
、且
t+1
时刻的隐状态为
qj
的概率(两个状态
):
P(it=qi,it+1=qj|O,λ)=P(O,it=qi,it+1=qj|λ)P(O|λ)=αt(i)βt+1(j)bj(ot+1)aij∑Ni=1∑Nj=1αt(i)βt+1(j)bj(ot+1)aij