上文讲到用直接法求概率复杂度很大,本文讲述利用前向后向算法求概率。即给定模型参数λ,以及观测序列,求条件概率 P(O|λ)
前向算法(一定要记住前向概率定义)
- 前向概率。给定模型参数λ,定义t时刻部分观测序列为 o1,o2,...,ot ,并且状态为 qi 的概率为前向概率。记为 αt(i)=P(o1,o2,..,ot and it=qi|λ) ,
- 接下来我们就可以根据前向概率求得
P(O|λ)
- 初值 α1(i)=P(o1 and it=qi|λ)=πibi(o1)
- 递推 对于
t=1,2,3,...,T−1
则 αt+1(i)=P(o1,o2,..,ot+1 and it+1=qi|λ)
=∑Nj=1P(o1,o2,..,ot and it=qj|λ)ajibi(ot+1)
=[∑Nj=1αt(j)aji]bi(ot+1) - 终止
P(O|λ)=∑Ni=1αT(i)
显然时间复杂度大幅度降低,只有 O(TN2)
后向算法(和前向算法如同一辙)
- 后向概率。给定模型参数λ,定义t时刻部分观测序列为 ot+1,ot+2,...,oT ,且状态为 qi 的概率为后向概率。记为 βt(i)=P(ot+1,ot+2,...,oT | it=qi and λ) 。这里需要和前向概率区分一下,前向概率 αt(i) 是包含当前时刻t的观测,而 βt(i) 是不包含当前时刻观测的。
- 接下来我们根据后向算法求概率
P(O|λ)
- 初值 βT(i)=P(oT+1,oT+2,...,oT|iT=qi and λ)=1 这里和前向概率初值稍作区别
- 对于t = T-1,T-2,…,1
βt(i)=P(ot+1,ot+2,...,oT|it=qi and λ)
=∑Nj=1aijbj(ot+1)P(ot+2,...,oT|it+1=qj)
=∑Nj=1aijbj(ot+1)βt+1(j) - 终止 P(O|λ)=∑Ni=1πibi(o1)β1(i)
利用前向和后向计算一些概率(后面参数训练会用到)
- 计算观测序列概率
P(O|λ)
-
P(O|λ)
=∑Ni=1∑Nj=1
P(o1,...,ot and it=qi|λ)aijbj(ot+1)
P(ot+2,ot+3,...,oT|it+1=qj and λ)
=∑Ni=1∑Nj=1αt(i)aijbj(ot+1)βt+1(j)
-
P(O|λ)
- 计算给定模型λ和观测O,在时刻t处于状态
qi
的概率,记为
γt(i)=P(it=qi|O,λ)
-
γt(i)=P(it=qi|O,λ)
=P(it=qi,O|λ)÷P(O|λ)
=αt(i)βt(i)÷∑Ni=1αt(i)βt(i)
-
γt(i)=P(it=qi|O,λ)
- 计算给定模型λ和观测O,在时刻t处于状态
qi
并且 在时刻t+1处于状态
qt
的概率,记为
ζt(i,j)=P(it=qi,it+1=qj|O,λ)
=P(it=qi,it+1=qj,O|λ)÷P(O|λ)
=αt(i)aijbj(ot+1)βt+1(j)
÷∑Ni=1∑Nj=1αt(i)aijbj(ot+1)βt+1(j)
- 计算观测序列概率
P(O|λ)