【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题

有任何的书写错误、排版错误、概念错误等,希望大家包含指正。

由于字数限制,分成六篇博客。
【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型
【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述
【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题
【自然语言处理】隐马尔科夫模型【Ⅳ】学习问题
【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题
【自然语言处理】隐马尔科夫模型【Ⅵ】精度问题

2.5. 解码算法

注意,此时我们恢复到对单个序列(样本)进行讨论。

下面介绍隐马尔可夫模型预测的两种算法:近似算法与维特比算法(Viterbi algorithm)。

2.5.1. 近似算法

近似算法的想法是,在每个时刻 t t t 选择在该时刻最有可能出现的状态 s t ∗ s_t^* st,从而得到一个状态序列 S ∗ = ( s 1 ∗ , s 2 ∗ , … , s T ∗ ) S^*=(s_1^*,s_2^*,\dots,s_T^*) S=(s1,s2,,sT),将它作为预测的结果。

给定隐马尔可夫模型 λ \lambda λ 和观测序列 O O O,在时刻 t t t 处于状态 q i q_i qi 的概率 γ t ( i ) \gamma_t(i) γt(i)。在每一时刻 t t t 最有可能的状态 s t ∗ s_t^* st
s t ∗ = a r g max ⁡ 1 ≤ i ≤ N [ γ t ( i ) ] ,      1 ≤ t ≤ T s_t^* = {\rm arg}\max_{1\le i \le N} [\gamma_t(i)],\space\space\space\space 1\le t\le T st=arg1iNmax[γt(i)],    1tT
从而得到状态序列 S ∗ = ( s 1 ∗ , s 2 ∗ , … , s T ∗ ) S^*=(s_1^*,s_2^*,\dots,s_T^*) S=(s1,s2,,sT)

近似算法的优点是计算简单,其缺点是不能保证预测的状态序列整体是最有可能的状态序列,因为预测的状态序列可能有实际不发生的部分。事实上,上述方法得到的状态序列中有可能存在转移概率为 0 0 0 的相邻状态,即对某些 i , j , a i j = 0 i,j,a_{ij}= 0 i,j,aij=0 时。尽管如此,近似算法仍然是有用的。

2.5.2. 维特比算法

维特比算法实际是用动态规划求解隐马尔可夫模型预测问题,即用动态规划求概率最大路径(最优路径)。这时一条路径对应着一个状态序列。

根据动态规划原理,最优路径具有这样的特性:如果最优路径在时刻 t t t 通过结点,那么这一路径从结点 s t ∗ s_t^* st 到终点 s T ∗ s_T^* sT 的部分路径,对于从 s t ∗ s_t^* st s T ∗ s_T^* sT 的所有可能的部分路径来说,必须是最优的。因为假如不是这样,那么从 s t ∗ s_t^* st s T ∗ s_T^* sT 就有另一条更好的部分路径存在,如果把它和从 s 1 ∗ s_1^* s1 到达 s t ∗ s_t^* st 的部分路径连接起来,就会形成一条比原来的路径更优的路径,这是矛盾的。依据这一原理,我们只需从时刻 t = 1 t =1 t=1 开始,递推地计算在时刻 t t t 状态为 q i q_i qi 的各条部分路径的最大概率,直至得到时刻 t = T t =T t=T 状态为 q i q_i qi 的各条路径的最大概率。时刻 t = T t =T t=T 的最大概率即为最优路径的概率 P ∗ P^* P,最优路径的终结点 s T ∗ s_T^* sT 也同时得到。之后,为了找出最优路径的各个结点,从终结点 s T ∗ s_T^* sT 开始,由后向前逐步求得结点 s T − 1 ∗ … , s 1 ∗ s_{T-1}^*\dots,s_1^* sT1,s1,得到最优路径 S ∗ = ( s 1 ∗ , s 2 ∗ , … , s T ∗ ) S^*=(s_1^*, s_2^*,\dots,s_T^*) S=(s1,s2,,sT)。这就是维特比算法。

首先引入两个变量 δ \delta δ ψ \psi ψ。定义在时刻 t t t 状态为 q i q_i qi 的所有单个路径 ( s 1 , s 2 , … , s t ) (s_1,s_2,\dots, s_t) (s1,s2,,st) 中概率最大值为
δ t ( i ) = max ⁡ s 1 , s 2 , … , s t − 1 P ( o t , o t − 1 , … , o 1 , s t = q i , s t − 1 , … , s 1 ∣ λ ) ,      1 ≤ i ≤ N (24) \delta_t(i) = \max _{s_1,s_2,\dots, s_{t-1}} P(o_t, o_{t-1},\dots, o_1,s_{t}=q_i,s_{t-1},\dots, s_1\mid \lambda),\space\space\space\space 1\le i\le N \tag{24} δt(i)=s1,s2,,st1maxP(ot,ot1,,o1,st=qi,st1,,s1λ),    1iN(24)
由定义可得变量 δ \delta δ 的递推公式:
δ t + 1 ( i ) = max ⁡ s 1 , s 2 , … , s t P ( o t + 1 , o t , … , o 1 , s t + 1 = q i , s t , … , s 1 ∣ λ ) = max ⁡ 1 ≤ j ≤ N [ δ t ( j ) a j i ] b i ( o t + 1 ) ,      1 ≤ i ≤ N ; 1 ≤ t ≤ T − 1 (25) \begin{aligned} \delta_{t+1}(i) &= \max_{s_1,s_2,\dots, s_{t}} P(o_{t+1}, o_{t},\dots, o_1,s_{t+1}=q_i,s_{t},\dots, s_1\mid \lambda)\\ &= \max_{1\le j\le N}[\delta_t(j) a_{ji}] b_i(o_{t+1}),\space\space\space\space 1\le i\le N;1\le t\le T-1 \tag{25} \end{aligned} δt+1(i)=s1,s2,,stmaxP(ot+1,ot,,o1,st+1=qi,st,,s1λ)=1jNmax[δt(j)aji]bi(ot+1),    1iN;1tT1(25)
定义在时刻 t t t 状态为 q i q_i qi 的所有单个路径 ( s 1 , s 2 , … , s t − 1 , s t = q i ) (s_1,s_2,\dots ,s_{t-1},s_t=q_i) (s1,s2,,st1,st=qi) 中概率最大的路径的第 t − 1 t - 1 t1 个结点为
ψ t ( i ) = a r g max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] ,      , 1 ≤ i ≤ N (26) \psi_t(i) = {\rm arg} \max_{1\le j \le N} [\delta_{t-1}(j) a_{ji}],\space\space\space\space,1\le i \le N \tag{26} ψt(i)=arg1jNmax[δt1(j)aji],    ,1iN(26)
ψ t ( i ) \psi_t(i) ψt(i) 保存的是时刻 t t t 状态 s t = q i s_t=q_i st=qi 由时刻 t − 1 t-1 t1 的哪种状态转移而来。如果将递推过程类比构建一棵树的话, ψ t ( i ) \psi_t(i) ψt(i) 保存的孩子结点的父结点,这样方可通过回溯确定最优路径。

维特比算法的大致流程如下。

输入:   模 型   λ = ( A , B , π ) ,   观 测   O = ( o 1 , o 2 , … , o T ) 过程: \begin{array}{ll} \textbf{输入:}&\space模型\space \lambda=(A,B,\pi),\space 观测 \space O=(o_1,o_2,\dots,o_T) \\ \textbf{过程:} \end{array} 输入:过程:  λ=(A,B,π),  O=(o1,o2,,oT)

1 : 初 始 化 δ 1 ( i ) = π i b i ( o 1 ) , 1 ≤ i ≤ N ψ 1 ( i ) = 0 , 1 ≤ i ≤ N 2 : 递 推 。 对   t = 2 , 3 , … , T δ t ( i ) = max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] b i ( o t ) , 1 ≤ i ≤ N ψ t ( i ) = a r g max ⁡ 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] , 1 ≤ i ≤ N 3 : 终 止 P ∗ = max ⁡ 1 ≤ i ≤ N δ T ( i ) s T ∗ = a r g max ⁡ 1 ≤ j ≤ N [ δ T ( i ) ] 4 : 最 优 路 径 回 溯 。 对   t = T − 1 , T − 2 , … , 1 s t ∗ = ψ t + 1 ( s t + 1 ∗ ) 求 得 最 优 路 径   S ∗ = ( s 1 ∗ , s 2 ∗ , … , s T ∗ ) \begin{array}{rl} 1:& 初始化\\ \\ &\begin{array}{c} \delta_1(i) = \pi_ib_i(o_1), & 1\le i\le N \\ \psi_1(i) = 0, & 1\le i\le N \\ \end{array}\\\\ 2:& 递推。对 \space t=2,3,\dots, T\\ \\ &\begin{array}{c} \delta_t(i) = \max\limits_{1\le j\le N}[\delta_{t-1}(j) a_{ji}] b_i(o_{t}),& 1\le i\le N \\ \psi_t(i) = {\rm arg} \max \limits_{1\le j \le N} [\delta_{t-1}(j) a_{ji}],& 1\le i \le N \end{array}\\\\ 3:& 终止\\ \\ &\begin{array}{c} P^* = \max \limits_{1\le i\le N} \delta_T(i) \\ s_T^* = {\rm arg}\max \limits_{1\le j\le N} [\delta_T(i)] \end{array}\\\\ 4:& 最优路径回溯。对 \space t=T-1,T-2,\dots,1\\ \\ &\begin{array}{c} & s_t^* = \psi_{t+1}(s_{t+1}^*) \end{array}\\\\ & 求得最优路径\space S^* = (s_1^*,s_2^*,\dots, s_T^*) \end{array} 1:2:3:4:δ1(i)=πibi(o1),ψ1(i)=0,1iN1iN t=2,3,,Tδt(i)=1jNmax[δt1(j)aji]bi(ot),ψt(i)=arg1jNmax[δt1(j)aji],1iN1iNP=1iNmaxδT(i)sT=arg1jNmax[δT(i)] t=T1,T2,,1st=ψt+1(st+1) S=(s1,s2,,sT)

输出:   最 优 路 径   S ∗ = ( s 1 ∗ , s 2 ∗ , … , s T ∗ ) \begin{array}{l} \textbf{输出:}\space 最优路径 \space S^* = (s_1^*,s_2^*,\dots, s_T^*) &&&&&& \end{array} 输出:  S=(s1,s2,,sT)

算法 2    维特比算法

上面对维特比算法的介绍还是比较抽象,配合下面的例子来直观理解维特比算法的过程。

继续采用上面的例子,模型 λ = ( A , B , π ) \lambda = (A,B,\pi) λ=(A,B,π)
A = [ 0.5 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.5 ] ,      B = [ 0.5 0.5 0.4 0.6 0.7 0.3 ] ,      π = [ 0.2 0.4 0.4 ] A = \left[\begin{matrix} 0.5 & 0.2 & 0.3 \\ 0.3 & 0.5 & 0.2 \\ 0.2 & 0.3 & 0.5 \\ \end{matrix}\right],\space\space\space\space B = \left[\begin{matrix} 0.5 & 0.5 \\ 0.4 & 0.6 \\ 0.7 & 0.3 \\ \end{matrix}\right],\space\space\space\space \pi = \left[\begin{matrix} 0.2 \\ 0.4 \\ 0.4 \\ \end{matrix}\right] A=0.50.30.20.20.50.30.30.20.5,    B=0.50.40.70.50.60.3,    π=0.20.40.4
已知观测序列 O = ( O=( O=( , , , , , , ) ) ),试求最优状态序列,即最优路径 S ∗ = ( s 1 ∗ , s 2 ∗ , s 3 ∗ ) S^*=(s_1^*,s_2^*,s_3^*) S=(s1,s2,s3)

如图 6 6 6 所示,要在所有可能的路径中选择一条最优路径,按照以下步骤处理:

【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题_第1张图片

图 6    求最优路径

从图 6 6 6 中可以看出树型结构, ψ \psi ψ 保存每个结点的父结点。由于要从时刻 t = 1 t=1 t=1 中选出一个结点作为根结点建树,所以时刻 t = 1 t=1 t=1 对应的三个结点是没有父结点的,即 ψ = 0 \psi=0 ψ=0

初始化。在 t = 1 t=1 t=1 时,对每一个状态 q i q_i qi i = 1 , 2 , 3 i=1,2,3 i=1,2,3,求状态为 q i q_i qi 观测 o 1 o_1 o1 为红的概率,记该概率为 δ 1 ( i ) \delta_1(i) δ1(i),则
δ 1 ( i ) = π i b i ( o 1 ) = π i b i ( 红 ) ,      i = 1 , 2 , 3 \delta_1(i) = \pi_ib_i(o_1) = \pi_i b_i(红),\space\space\space\space i=1,2,3 δ1(i)=πibi(o1)=πibi(),    i=1,2,3
代入实际数据
δ 1 ( 1 ) = 0.2 × 0.5 = 0.10 δ 1 ( 2 ) = 0.4 × 0.4 = 0.16 δ 1 ( 3 ) = 0.4 × 0.7 = 0.28 \delta_1(1) = 0.2\times 0.5 = 0.10 \\ \delta_1(2) = 0.4\times 0.4 = 0.16 \\ \delta_1(3) = 0.4\times 0.7 = 0.28 \\ δ1(1)=0.2×0.5=0.10δ1(2)=0.4×0.4=0.16δ1(3)=0.4×0.7=0.28
ψ 1 ( i ) = 0 \psi_1(i) = 0 ψ1(i)=0 i = 1 , 2 , 3 i=1,2,3 i=1,2,3

t = 2 t=2 t=2 时,对每个状态 q i q_i qi i = 1 , 2 , 3 i=1,2,3 i=1,2,3,求在 t = 1 t=1 t=1 时状态为 q j q_j qj 观测为红并在 t = 2 t=2 t=2 时状态为 q i q_i qi 观测 o 2 o_2 o2 为白的路径的最大概率,记此最大概率为 δ 2 ( i ) \delta_2(i) δ2(i),则
δ 2 ( i ) = max ⁡ 1 ≤ j ≤ 3 [ δ 1 ( j ) a j i ] b i ( o 2 ) \delta_2(i) = \max _{1\le j\le 3} [\delta_1(j) a_{ji}] b_i(o_2) δ2(i)=1j3max[δ1(j)aji]bi(o2)
同时,对每个状态 q i q_i qi i = 1 , 2 , 3 i=1,2,3 i=1,2,3,记录概率最大路径的前一个状态 q j q_j qj
ψ 2 ( i ) = a r g max ⁡ 1 ≤ j ≤ 3 [ δ 1 ( j ) a j i ] ,      i = 1 , 2 , 3 \psi_2(i) = {\rm arg} \max_{1\le j\le 3} [\delta_1(j)a_{ji}],\space\space\space\space i=1,2,3 ψ2(i)=arg1j3max[δ1(j)aji],    i=1,2,3
计算:
δ 2 ( 1 ) = max ⁡ 1 ≤ j ≤ 3 [ δ 1 ( j ) a j 1 ] b 1 ( o 2 ) = max ⁡ j { 0.10 × 0.5 , 0.16 × 0.3 , 0.28 × 0.2 } × 0.5 = 0.028 ψ 2 ( 1 ) = 3 δ 2 ( 2 ) = max ⁡ 1 ≤ j ≤ 3 [ δ 1 ( j ) a j 2 ] b 2 ( o 2 ) = max ⁡ j { 0.10 × 0.2 , 0.16 × 0.5 , 0.28 × 0.3 } × 0.6 = 0.0504 ψ 2 ( 2 ) = 3 δ 2 ( 3 ) = max ⁡ 1 ≤ j ≤ 3 [ δ 1 ( j ) a j 3 ] b 3 ( o 2 ) = max ⁡ j { 0.10 × 0.3 , 0.16 × 0.2 , 0.28 × 0.5 } × 0.3 = 0.042 ψ 2 ( 3 ) = 3 \begin{aligned} \delta_2(1) &= \max_{1\le j\le 3} [\delta_1(j)a_{j1}] b_1(o_2)\\ &= \max_j\{0.10\times 0.5,0.16\times 0.3,0.28\times 0.2\}\times 0.5 \\ &= 0.028 \\ \psi_2(1)&=3 \\\\ \delta_2(2) &= \max_{1\le j\le 3} [\delta_1(j)a_{j2}] b_2(o_2)\\ &= \max_j\{0.10\times 0.2,0.16\times 0.5,0.28\times 0.3\}\times 0.6 \\ &= 0.0504 \\ \psi_2(2)&=3 \\\\ \delta_2(3) &= \max_{1\le j\le 3} [\delta_1(j)a_{j3}] b_3(o_2)\\ &= \max_j\{0.10\times 0.3,0.16\times 0.2,0.28\times 0.5\}\times 0.3 \\ &= 0.042 \\ \psi_2(3)&=3 \\ \end{aligned} δ2(1)ψ2(1)δ2(2)ψ2(2)δ2(3)ψ2(3)=1j3max[δ1(j)aj1]b1(o2)=jmax{0.10×0.5,0.16×0.3,0.28×0.2}×0.5=0.028=3=1j3max[δ1(j)aj2]b2(o2)=jmax{0.10×0.2,0.16×0.5,0.28×0.3}×0.6=0.0504=3=1j3max[δ1(j)aj3]b3(o2)=jmax{0.10×0.3,0.16×0.2,0.28×0.5}×0.3=0.042=3
同样,在 t = 3 t=3 t=3 时,
δ 3 ( i ) = max ⁡ 1 ≤ j ≤ 3 [ δ 2 ( j ) a j i ] b i ( o 3 ) ψ 3 ( i ) = a r g max ⁡ 1 ≤ j ≤ 3 [ δ 2 ( j ) a j i ] δ 3 ( 1 ) = 0.00756 ψ 3 ( 1 ) = 2 δ 3 ( 2 ) = 0.01008 ψ 3 ( 2 ) = 2 δ 3 ( 3 ) = 0.0147 ψ 3 ( 3 ) = 3 \begin{aligned} \delta_3(i) &= \max_{1\le j\le 3} [\delta_2(j)a_{ji}] b_i(o_3) \\ \psi_3(i) &= {\rm arg}\max_{1\le j\le 3} [\delta_2(j)a_{ji}] \\\\ \delta_3(1) &= 0.00756 \\ \psi_3(1) &= 2 \\ \delta_3(2)& = 0.01008 \\ \psi_3(2) &= 2 \\ \delta_3(3) &= 0.0147 \\ \psi_3(3) &= 3 \\ \end{aligned} δ3(i)ψ3(i)δ3(1)ψ3(1)δ3(2)ψ3(2)δ3(3)ψ3(3)=1j3max[δ2(j)aji]bi(o3)=arg1j3max[δ2(j)aji]=0.00756=2=0.01008=2=0.0147=3
P ∗ P^* P 表示最优路径的概率,则
P ∗ = max ⁡ 1 ≤ i ≤ 3 δ 3 ( i ) = 0.0147 P^* = \max_{1\le i \le 3} \delta_3(i) = 0.0147 P=1i3maxδ3(i)=0.0147
最优路径的终点是 s 3 ∗ s_3^* s3
s 3 ∗ = a r g max ⁡ i [ δ 3 ( i ) ] = 3 s_3^* = {\rm arg}\max_i [\delta_3(i)] = 3 s3=argimax[δ3(i)]=3
由最优路径的终点 s 3 ∗ s_3^* s3,逆向找到 s 2 ∗ s_2^* s2 s 1 ∗ s_1^* s1。在 t = 2 t=2 t=2 时, s 2 ∗ = ψ 3 ( s 3 ∗ ) = ψ 3 ( 3 ) = 3 s_2^* = \psi_3(s_3^*) = \psi_3(3)=3 s2=ψ3(s3)=ψ3(3)=3;在 t = 1 t=1 t=1 时, s 1 ∗ = ψ 2 ( s 2 ∗ ) = ψ 2 ( 3 ) = 3 s_1^* = \psi_2(s_2^*) = \psi_2(3)=3 s1=ψ2(s2)=ψ2(3)=3。于是求得最优路径,即最优状态序列 S ∗ = ( s 1 ∗ , s 2 ∗ , s 3 ∗ ) = ( 3 , 3 , 3 ) S^* = (s_1^*,s_2^*,s_3^*)=(3,3,3) S=(s1,s2,s3)=(3,3,3)

你可能感兴趣的:(【自然语言处理】,【机器学习】,人工智能,算法,自然语言处理,概率论)