前面两节的讨论主要是关于HMM的理论以及模型的变体。这一节我们会讨论HMM的实现问题,包括放大、多观测序列、初始参数估计、数据丢失、模型大小以及类型的选择。对其中一些实现问题,我们可得到精确解析解;而对于其他问题,我们只能给出一些经验建议。
为了理解在HMM参数估计过程中为什么需要放大,考虑(18)中定义的 αt(i) 。可以看到 αt(i) 包含很多项的和,每一项的形式为
其中 qt=Si 。由于每个 a 和b项是小于1的(一般是远小于1的),所以当 t 变得比较大时(比如10或者更多),αt(i)的每一项开始趋向于0。对非常大的 t (100或者更多),αt(i)计算的动态范围会超出机器的精度范围(甚至是双精度)。所以,唯一有效的计算方式是结合一个放大过程。
基本的放大步骤是把 αt(i) 乘以一个放大系数并且这个放大系数是独立于 i 的(即只依赖于t),使得放大后的αt(i)( 1≤t≤T )位于计算机的动态范围中。对 βt(i) 也要进行一个相似的放大步骤,在计算的最后,需要消掉放大系数。
为了更好地理解放大过程,考虑状态转移系数 aij 的估计公式。如果我们把估计公式(41)直接写成前向变量和后项变量的形式。可以得到
(原文中的符号表示有些混乱,下面做了些修改。)
首先令 α¯1(i)=α1(i) 。
对每个 t ,我们首先根据递推公式(20)计算α¯t(i),然后乘以一个放大系数 ct :
于是,对固定的 t ,我们首先计算
然后计算放大 α^t(i) :
通过递推,可以把 α^t−1(j) 写成
于是有
下一步我们用后向地推计算 βt(i) 。这里我们在每个 t 上仍然使用计算α时用的放大因子。于是放大后的 β 是
因为每个放大因子把 α 放大到和为1,由于 α 和 β 项的值是相近的,使用同样的放大因子可以把 β 放大到有效范围。而且,参数估计公式(90)现在变成
而每个 α^t(i) 可以写成
每个 β^t+1(j) 可以写成
于是(95)可以写成
而 CtDt+1 项可以写作
和 t 无关。于是(98)分子分母中的CtDt+1抵消了,得到的结果就是(90)对应的准确结果。(虽然是用放大后的 α^ 进行计算的,但得到的结果竟然和真实值一样!)
显然,上面的放大过程同样适用于 π 和 B 的估计。缩放过程(92)不需要在每个时刻t都要执行,而是可以在需要或必要(比如防止下溢)的时候才执行。如果某时刻 t 没有进行放大,只要把放大系数ct设置成1,然后上面讨论的所有条件都满足。
由放大导致的唯一变化是 P(O|λ) 的计算过程。我们不能只对 α^T(i) 进行求和,因为这些值是放大后的值。但是我们可以利用性质
于是有
于是得到 P 的log值,但是不是P,这是因为后者可能会超出计算机的动态范围。
最后我们注意到当使用Viterbi算法来得到似然最大的状态序列时,如果我们按下面的算法计算那么不需要放大过程。定义
初始值
递推步骤
以及终止步骤
这样我们得到 logP∗ 而非 P∗ ,而计算量大大减少了并且没有数值问题。读者应该注意到(105b)中的 logaij 项可以事先计算。并且,当观测值有限时 log[bj(Ot)] 项也可以事先计算。