A.5 HMM 训练:前向—后向算法
下面讨论 HMM 的第三个问题:学习 HMM 的参数,即矩阵 A A A 和 B B B 。形式化地说:
学习 :给定观察序列 O O O 和 HMM 中可能的状态集合,学习 HMM 参数 A A A 和 B B B 。
这类学习算法的输入是不带标签的观察序列 O O O 和潜在隐藏状态词表 Q Q Q 。因此,在冰淇淋任务中,我们从观察序列 O = { 1 , 3 , 2 , … } O=\{1,3,2,\ldots\} O = { 1 , 3 , 2 , … } 以及隐藏状态集合 H、C 开始。
训练 HMM 的标准算法是前向—后向算法 (forward-backward algorithm),也称 Baum–Welch 算法 (Baum, 1972)。它是期望最大化 (expectation-maximization,EM)算法(Dempster et al., 1977)的一个特例。利用该算法,可以训练 HMM 的转移概率 A A A 和发射概率 B B B 。EM 是迭代算法:先计算概率的初始估计,再用已有估计计算更好的估计,如此反复,不断改善所学概率。
先考虑一个简单得多的情况:训练完全可见的马尔可夫模型,即每天的气温和冰淇淋数都已知。设想我们看到了以下输入观察,并且神奇地知道与之对齐的隐藏状态序列:
3 3 2 1 1 2 1 2 3 hot hot cold cold cold cold cold hot hot \begin{array}{ccccccccc}
3&3&2&&1&1&2&&1\ 2\ 3\\
\text{hot}&\text{hot}&\text{cold}&&\text{cold}&\text{cold}&\text{cold}&&\text{cold}\ \text{hot}\ \text{hot}
\end{array} 3 hot 3 hot 2 cold 1 cold 1 cold 2 cold 1 2 3 cold hot hot 这时,只需对训练数据进行最大似然估计,就能计算 HMM 参数。首先,根据三个序列初始隐藏状态的计数计算 π \pi π :
π h = 1 / 3 , π c = 2 / 3 \pi_h=1/3,\qquad \pi_c=2/3 π h = 1/3 , π c = 2/3 接着,根据状态转移直接计算矩阵 A A A ,忽略各序列的最终隐藏状态:
p ( hot ∣ hot ) = 2 / 3 , p ( cold ∣ hot ) = 1 / 3 , p ( cold ∣ cold ) = 2 / 3 , p ( hot ∣ cold ) = 1 / 3. \begin{aligned}
p(\text{hot}\mid\text{hot})&=2/3, &p(\text{cold}\mid\text{hot})&=1/3,\\
p(\text{cold}\mid\text{cold})&=2/3, &p(\text{hot}\mid\text{cold})&=1/3.
\end{aligned} p ( hot ∣ hot ) p ( cold ∣ cold ) = 2/3 , = 2/3 , p ( cold ∣ hot ) p ( hot ∣ cold ) = 1/3 , = 1/3. 矩阵 B B B 为:
P ( 1 ∣ hot ) = 0 / 4 = 0 , P ( 1 ∣ cold ) = 3 / 5 = 0.6 , P ( 2 ∣ hot ) = 1 / 4 = 0.25 , P ( 2 ∣ cold ) = 2 / 5 = 0.4 , P ( 3 ∣ hot ) = 3 / 4 = 0.75 , P ( 3 ∣ cold ) = 0. \begin{aligned}
P(1\mid\text{hot})&=0/4=0, &P(1\mid\text{cold})&=3/5=0.6,\\
P(2\mid\text{hot})&=1/4=0.25, &P(2\mid\text{cold})&=2/5=0.4,\\
P(3\mid\text{hot})&=3/4=0.75, &P(3\mid\text{cold})&=0.
\end{aligned} P ( 1 ∣ hot ) P ( 2 ∣ hot ) P ( 3 ∣ hot ) = 0/4 = 0 , = 1/4 = 0.25 , = 3/4 = 0.75 , P ( 1 ∣ cold ) P ( 2 ∣ cold ) P ( 3 ∣ cold ) = 3/5 = 0.6 , = 2/5 = 0.4 , = 0. 对真正的 HMM,我们无法直接从观察序列计算这些计数,因为不知道某个输入经过了模型中的哪条状态路径。假设只是不告诉你第 2 天的气温,而你神奇地拥有以上概率,并知道其他各天的气温,那么可以结合其他所有概率进行贝叶斯计算,估计缺失那天的可能气温,再据此得到第 2 天各气温的期望计数。
但真正的问题更困难:任何隐藏状态上的计数都不知道。Baum–Welch 算法通过反复估计计数来解决这个问题。我们从转移概率和观察概率的某个估计出发,用这些估计逐步导出更好的概率。具体方法是计算某个观察的前向概率,再把这部分概率质量分配给所有对该前向概率作出贡献的不同路径。
要理解该算法,需要定义一个与前向概率相关的实用概率——后向概率 (backward probability)。后向概率 β \beta β 表示:给定时间 t t t 处于状态 i i i ,并给定自动机 λ \lambda λ ,看到从时间 t + 1 t+1 t + 1 直到末尾的全部观察之概率:
β t ( i ) = P ( o t + 1 , o t + 2 , … , o T ∣ q t = i , λ ) (A.15) \beta_t(i)=P(o_{t+1},o_{t+2},\ldots,o_T\mid q_t=i,\lambda)\tag{A.15} β t ( i ) = P ( o t + 1 , o t + 2 , … , o T ∣ q t = i , λ ) ( A.15 ) 它以类似前向算法的方式归纳计算。
初始化:
β T ( i ) = 1 , 1 ≤ i ≤ N \beta_T(i)=1,\qquad 1\leq i\leq N β T ( i ) = 1 , 1 ≤ i ≤ N 递归:
β t ( i ) = ∑ j = 1 N a i j b j ( o t + 1 ) β t + 1 ( j ) , 1 ≤ i ≤ N , 1 ≤ t < T \beta_t(i)=\sum_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j),\qquad 1\leq i\leq N,\ 1\leq t<T β t ( i ) = j = 1 ∑ N a ij b j ( o t + 1 ) β t + 1 ( j ) , 1 ≤ i ≤ N , 1 ≤ t < T 终止:
P ( O ∣ λ ) = ∑ j = 1 N π j b j ( o 1 ) β 1 ( j ) P(O\mid\lambda)=\sum_{j=1}^{N}\pi_jb_j(o_1)\beta_1(j) P ( O ∣ λ ) = j = 1 ∑ N π j b j ( o 1 ) β 1 ( j ) 图 A.11 β t ( i ) \beta_t(i) β t ( i ) 的计算:把所有后继值 β t + 1 ( j ) \beta_{t+1}(j) β t + 1 ( j ) 按转移概率 a i j a_{ij} a ij 和观察概率 b j ( o t + 1 ) b_j(o_{t+1}) b j ( o t + 1 ) 加权后求和。
现在可以说明,即使模型中的实际路径隐藏不可见,前向和后向概率如何帮助我们根据观察序列计算转移概率 a i j a_{ij} a ij 和观察概率 b i ( o t ) b_i(o_t) b i ( o t ) 。
先看如何用简单最大似然估计的一个变体估计 a ^ i j \hat a_{ij} a ^ ij :
a ^ i j = 从状态 i 转移到状态 j 的期望次数 从状态 i 出发的转移期望总次数 (A.16) \hat a_{ij}=\frac{\text{从状态 }i\text{ 转移到状态 }j\text{ 的期望次数}}{\text{从状态 }i\text{ 出发的转移期望总次数}}\tag{A.16} a ^ ij = 从状态 i 出发的转移期望总次数 从状态 i 转移到状态 j 的期望次数 ( A.16 ) 怎样计算分子?直觉如下:假设我们能够估计观察序列中某个时刻 t t t 发生给定转移 i → j i\to j i → j 的概率。若知道每个时刻 t t t 的这一概率,就可以对所有 t t t 求和,估计转移 i → j i\to j i → j 的总计数。
形式上,定义概率 ξ t \xi_t ξ t :给定观察序列和模型,在时间 t t t 处于状态 i i i 、并在时间 t + 1 t+1 t + 1 处于状态 j j j 的概率:
ξ t ( i , j ) = P ( q t = i , q t + 1 = j ∣ O , λ ) (A.17) \xi_t(i,j)=P(q_t=i,q_{t+1}=j\mid O,\lambda)\tag{A.17} ξ t ( i , j ) = P ( q t = i , q t + 1 = j ∣ O , λ ) ( A.17 ) 为了计算 ξ t \xi_t ξ t ,先计算一个与之相近、但把观察本身的概率也包括进来的量。注意,下面公式中 O O O 的条件位置与公式 A.17 不同:
ξ ~ t ( i , j ) = P ( q t = i , q t + 1 = j , O ∣ λ ) (A.18) \widetilde{\xi}_t(i,j)=P(q_t=i,q_{t+1}=j,O\mid\lambda)\tag{A.18} ξ t ( i , j ) = P ( q t = i , q t + 1 = j , O ∣ λ ) ( A.18 ) 图 A.12 计算时间 t t t 处于状态 i i i 、并在时间 t + 1 t+1 t + 1 处于状态 j j j 的联合概率。需要组合前向概率 α \alpha α 、后向概率 β \beta β 、转移概率 a i j a_{ij} a ij 和观察概率 b j ( o t + 1 ) b_j(o_{t+1}) b j ( o t + 1 ) ,得到 P ( q t = i , q t + 1 = j , O ∣ λ ) P(q_t=i,q_{t+1}=j,O\mid\lambda) P ( q t = i , q t + 1 = j , O ∣ λ ) 。改编自 Rabiner(1989),© 1989 IEEE。
图 A.12 展示计算 ξ ~ t \widetilde\xi_t ξ t 所需的概率:相关弧的转移概率、弧之前的 α \alpha α 概率、弧之后的 β \beta β 概率,以及弧之后符号的观察概率。四者相乘得到:
ξ ~ t ( i , j ) = α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) (A.19) \widetilde{\xi}_t(i,j)=\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)\tag{A.19} ξ t ( i , j ) = α t ( i ) a ij b j ( o t + 1 ) β t + 1 ( j ) ( A.19 ) 根据概率法则,用 P ( O ∣ λ ) P(O\mid\lambda) P ( O ∣ λ ) 除 ξ ~ t \widetilde\xi_t ξ t ,即可得到 ξ t \xi_t ξ t ,因为:
P ( X ∣ Y , Z ) = P ( X , Y ∣ Z ) P ( Y ∣ Z ) (A.20) P(X\mid Y,Z)=\frac{P(X,Y\mid Z)}{P(Y\mid Z)}\tag{A.20} P ( X ∣ Y , Z ) = P ( Y ∣ Z ) P ( X , Y ∣ Z ) ( A.20 ) 给定模型时观察的概率,就是整条话语的前向概率;也可以等价地用整条话语的后向概率表示:
P ( O ∣ λ ) = ∑ j = 1 N α t ( j ) β t ( j ) (A.21) P(O\mid\lambda)=\sum_{j=1}^{N}\alpha_t(j)\beta_t(j)\tag{A.21} P ( O ∣ λ ) = j = 1 ∑ N α t ( j ) β t ( j ) ( A.21 ) 因此,ξ t \xi_t ξ t 的最终公式为:
ξ t ( i , j ) = α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) ∑ j = 1 N α t ( j ) β t ( j ) (A.22) \xi_t(i,j)=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{j=1}^{N}\alpha_t(j)\beta_t(j)}\tag{A.22} ξ t ( i , j ) = ∑ j = 1 N α t ( j ) β t ( j ) α t ( i ) a ij b j ( o t + 1 ) β t + 1 ( j ) ( A.22 ) 从状态 i i i 到状态 j j j 的期望转移次数,就是对所有 t t t 的 ξ t ( i , j ) \xi_t(i,j) ξ t ( i , j ) 求和。为了得到公式 A.16 中的 a i j a_{ij} a ij 估计,还需要从状态 i i i 出发的期望转移总次数;对从 i i i 出发的所有转移求和即可得到。最终公式为:
a ^ i j = ∑ t = 1 T − 1 ξ t ( i , j ) ∑ t = 1 T − 1 ∑ k = 1 N ξ t ( i , k ) (A.23) \hat a_{ij}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\sum_{k=1}^{N}\xi_t(i,k)}\tag{A.23} a ^ ij = ∑ t = 1 T − 1 ∑ k = 1 N ξ t ( i , k ) ∑ t = 1 T − 1 ξ t ( i , j ) ( A.23 ) 还需要重新估计观察概率。对观察词表 V V V 中的给定符号 v k v_k v k 和状态 j j j ,目标为 b ^ j ( v k ) \hat b_j(v_k) b ^ j ( v k ) :
b ^ j ( v k ) = 处于状态 j 且观察到符号 v k 的期望次数 处于状态 j 的期望次数 (A.24) \hat b_j(v_k)=\frac{\text{处于状态 }j\text{ 且观察到符号 }v_k\text{ 的期望次数}}{\text{处于状态 }j\text{ 的期望次数}}\tag{A.24} b ^ j ( v k ) = 处于状态 j 的期望次数 处于状态 j 且观察到符号 v k 的期望次数 ( A.24 ) 为此,需要知道时间 t t t 处于状态 j j j 的概率,记作 γ t ( j ) \gamma_t(j) γ t ( j ) :
γ t ( j ) = P ( q t = j ∣ O , λ ) (A.25) \gamma_t(j)=P(q_t=j\mid O,\lambda)\tag{A.25} γ t ( j ) = P ( q t = j ∣ O , λ ) ( A.25 ) 同样,可以先把观察序列包括在联合概率中:
γ t ( j ) = P ( q t = j , O ∣ λ ) P ( O ∣ λ ) (A.26) \gamma_t(j)=\frac{P(q_t=j,O\mid\lambda)}{P(O\mid\lambda)}\tag{A.26} γ t ( j ) = P ( O ∣ λ ) P ( q t = j , O ∣ λ ) ( A.26 ) 图 A.13 计算时间 t t t 处于状态 j j j 的概率 γ t ( j ) \gamma_t(j) γ t ( j ) 。γ \gamma γ 实际上是 ξ \xi ξ 的退化情形,因此本图相当于把图 A.12 中的状态 i i i 与状态 j j j 合并。改编自 Rabiner(1989),© 1989 IEEE。
图 A.13 表明,公式 A.26 的分子就是前向概率与后向概率的乘积:
γ t ( j ) = α t ( j ) β t ( j ) P ( O ∣ λ ) (A.27) \gamma_t(j)=\frac{\alpha_t(j)\beta_t(j)}{P(O\mid\lambda)}\tag{A.27} γ t ( j ) = P ( O ∣ λ ) α t ( j ) β t ( j ) ( A.27 ) 现在可以计算 b b b 。分子对所有满足观察 o t = v k o_t=v_k o t = v k 的时间步 t t t 的 γ t ( j ) \gamma_t(j) γ t ( j ) 求和,分母则对所有时间步的 γ t ( j ) \gamma_t(j) γ t ( j ) 求和。所得结果就是处于状态 j j j 时看到符号 v k v_k v k 的比例:
b ^ j ( v k ) = ∑ t = 1 o t = v k T γ t ( j ) ∑ t = 1 T γ t ( j ) (A.28) \hat b_j(v_k)=\frac{\sum_{\substack{t=1\\o_t=v_k}}^{T}\gamma_t(j)}{\sum_{t=1}^{T}\gamma_t(j)}\tag{A.28} b ^ j ( v k ) = ∑ t = 1 T γ t ( j ) ∑ t = 1 o t = v k T γ t ( j ) ( A.28 ) 公式 A.23 和 A.28 给出了根据观察序列 O O O 重新估计转移概率 A A A 和观察概率 B B B 的方法,前提是已经拥有 A A A 、B B B 的上一轮估计。
这些重估公式构成迭代式前向—后向算法的核心。算法从 HMM 参数 λ = ( A , B ) \lambda=(A,B) λ = ( A , B ) 的某个初始估计开始,随后反复执行两个步骤。与其他 EM 算法相同,这两个步骤分别是期望步骤 (E-step)和最大化步骤 (M-step)。
在 E 步中,根据上一轮的 A A A 和 B B B ,计算期望状态占用计数 γ \gamma γ 和期望状态转移计数 ξ \xi ξ 。在 M 步中,利用 γ \gamma γ 和 ξ \xi ξ 重新计算新的 A A A 、B B B 概率。
function FORWARD-BACKWARD(observations[1..T], vocabulary V, states Q)
returns HMM=(A,B)
initialize A and B
repeat until convergence
E-step:
γ_t(j) ← α_t(j)β_t(j) / P(O|λ) for all t,j
ξ_t(i,j) ← α_t(i)a_ij b_j(o_{t+1})β_{t+1}(j) / P(O|λ)
for all t,i,j
M-step:
â_ij ← Σ_{t=1}^{T-1}ξ_t(i,j) /
Σ_{t=1}^{T-1}Σ_{k=1}^{N}ξ_t(i,k)
b̂_j(v_k) ← Σ_{t:o_t=v_k}γ_t(j) / Σ_{t=1}^{T}γ_t(j)
return A,B图 A.14 前向—后向算法。
理论上,前向—后向算法可以完全无监督地学习参数 A A A 和 B B B ;但实践中,初始条件极其重要,因此算法经常还会获得额外信息。例如,在基于 HMM 的语音识别中,HMM 结构往往由人工设定,只根据观察序列集合 O O O 训练发射概率 B B B 和 A A A 中非零的转移概率。