HMM经典介绍论文【Rabiner 1989】翻译(十六)——放大

5 HMM的实现问题

前面两节的讨论主要是关于HMM的理论以及模型的变体。这一节我们会讨论HMM的实现问题,包括放大、多观测序列、初始参数估计、数据丢失、模型大小以及类型的选择。对其中一些实现问题,我们可得到精确解析解;而对于其他问题,我们只能给出一些经验建议。

5.1 放大

为了理解在HMM参数估计过程中为什么需要放大,考虑(18)中定义的 αt(i) 。可以看到 αt(i) 包含很多项的和,每一项的形式为

(s=1t1aqsqs+1s=1tbqs(Os)),

其中 qt=Si 。由于每个 a b项是小于1的(一般是远小于1的),所以当 t 变得比较大时(比如10或者更多),αt(i)的每一项开始趋向于0。对非常大的 t (100或者更多),αt(i)计算的动态范围会超出机器的精度范围(甚至是双精度)。所以,唯一有效的计算方式是结合一个放大过程。

基本的放大步骤是把 αt(i) 乘以一个放大系数并且这个放大系数是独立于 i 的(即只依赖于t),使得放大后的αt(i) 1tT )位于计算机的动态范围中。对 βt(i) 也要进行一个相似的放大步骤,在计算的最后,需要消掉放大系数。

为了更好地理解放大过程,考虑状态转移系数 aij 的估计公式。如果我们把估计公式(41)直接写成前向变量和后项变量的形式。可以得到

a¯ij=T1t=1αt(i)aijbj(Ot+1)βt+1(j)Tt=1Nj=1αt(i)aijbj(Ot+1)βt+1(j).(90)

(原文中的符号表示有些混乱,下面做了些修改。)

首先令 α¯1(i)=α1(i)

对每个 t ,我们首先根据递推公式(20)计算α¯t(i),然后乘以一个放大系数 ct

ct=1Ni=1α¯t(i).(91)

于是,对固定的 t ,我们首先计算

α¯t(i)=j=1Nα^t1(j)ajibi(Ot).(92a)

然后计算放大 α^t(i)

α^t(i)=α¯iNi=1α¯i=Nj=1α^t1(j)ajibi(Ot)Ni=1Nj=1α^t1(j)ajibi(Ot).(92b)

通过递推,可以把 α^t1(j) 写成

α^t1(j)=[τ=1t1cτ]αt1(j).(93a)

于是有

α^t(i)=Nj=1αt1(j)(t1τ=1cτ)aijbj(Ot)Ni=1Nj=1αt1(j)(t1τ=1cτ)aijbj(Ot)=αt(i)Ni=1αt(i).(93b)

下一步我们用后向地推计算 βt(i) 。这里我们在每个 t 上仍然使用计算α时用的放大因子。于是放大后的 β

β^t(i)=ctβ¯t(i).(94)

因为每个放大因子把 α 放大到和为1,由于 α β 项的值是相近的,使用同样的放大因子可以把 β 放大到有效范围。而且,参数估计公式(90)现在变成

a¯ij=T1t=1α^t(i)aijbj(Ot+1)β^t+1(j)T1t=1Nj=1α^t(i)aijbj(Ot+1)β^t+1(j),(95)

而每个 α^t(i) 可以写成

α^t(i)=[s=1tcs]αt(i)=Ctαt(i)(96)

每个 β^t+1(j) 可以写成

β^t+1(j)=[s=t+1Tcs]βt+1(j)=Dt+1βt+1(j).(97)

于是(95)可以写成

a¯ij=T1t=1Ctαt(i)aijbj(Ot+1)Dt+1βt+1(j)T1t=1Nj=1Ctαt(i)aijbj(Ot+1)Dt+1βt+1(j),(98)

CtDt+1 项可以写作

CtDt+1=s=1tcss=t+1Tcs=s=1Tcs=CT(99)

t 无关。于是(98)分子分母中的CtDt+1抵消了,得到的结果就是(90)对应的准确结果。(虽然是用放大后的 α^ 进行计算的,但得到的结果竟然和真实值一样!)

显然,上面的放大过程同样适用于 π B 的估计。缩放过程(92)不需要在每个时刻t都要执行,而是可以在需要或必要(比如防止下溢)的时候才执行。如果某时刻 t 没有进行放大,只要把放大系数ct设置成1,然后上面讨论的所有条件都满足。

由放大导致的唯一变化是 P(O|λ) 的计算过程。我们不能只对 α^T(i) 进行求和,因为这些值是放大后的值。但是我们可以利用性质

t=1Tcti=1NαT(i)=CTi=1NαT(i)=1.(100)

于是有

t=1TctP(O|λ)=1(101)

P(O|λ)=1Tt=1ct(102)

log[P(O|λ)]=t=1Tlogct.(103)

于是得到 P 的log值,但是不是P,这是因为后者可能会超出计算机的动态范围。

最后我们注意到当使用Viterbi算法来得到似然最大的状态序列时,如果我们按下面的算法计算那么不需要放大过程。定义

ϕt(i)=maxq1,q2,,qtlogP[q1q2qt,O1O2Ot|λ],(104)

初始值

ϕ1(i)=log(πi)+log[bi(O1)],(105a)

递推步骤

ϕt(j)=max1IleqN[ϕt1(i)+logaij]+log[bj(Ot)](105b)

以及终止步骤

logP=max1iN[ϕT(i)].(105c)

这样我们得到 logP 而非 P ,而计算量大大减少了并且没有数值问题。读者应该注意到(105b)中的 logaij 项可以事先计算。并且,当观测值有限时 log[bj(Ot)] 项也可以事先计算。

你可能感兴趣的:(机器学习)