有任何的书写错误、排版错误、概念错误等,希望大家包含指正。
由于字数限制,分成六篇博客。
【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型
【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述
【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题
【自然语言处理】隐马尔科夫模型【Ⅳ】学习问题
【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题
【自然语言处理】隐马尔科夫模型【Ⅵ】精度问题
注意,此时我们恢复到对单个序列(样本)进行讨论。
下面介绍隐马尔可夫模型预测的两种算法:近似算法与维特比算法(Viterbi algorithm)。
近似算法的想法是,在每个时刻 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∗=arg1≤i≤Nmax[γt(i)], 1≤t≤T
从而得到状态序列 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 时。尽管如此,近似算法仍然是有用的。
维特比算法实际是用动态规划求解隐马尔可夫模型预测问题,即用动态规划求概率最大路径(最优路径)。这时一条路径对应着一个状态序列。
根据动态规划原理,最优路径具有这样的特性:如果最优路径在时刻 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^* sT−1∗…,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,…,st−1maxP(ot,ot−1,…,o1,st=qi,st−1,…,s1∣λ), 1≤i≤N(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∣λ)=1≤j≤Nmax[δt(j)aji]bi(ot+1), 1≤i≤N;1≤t≤T−1(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,…,st−1,st=qi) 中概率最大的路径的第 t − 1 t - 1 t−1 个结点为
ψ 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)=arg1≤j≤Nmax[δt−1(j)aji], ,1≤i≤N(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 t−1 的哪种状态转移而来。如果将递推过程类比构建一棵树的话, ψ 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,1≤i≤N1≤i≤N递推。对 t=2,3,…,Tδt(i)=1≤j≤Nmax[δt−1(j)aji]bi(ot),ψt(i)=arg1≤j≤Nmax[δt−1(j)aji],1≤i≤N1≤i≤N终止P∗=1≤i≤NmaxδT(i)sT∗=arg1≤j≤Nmax[δT(i)]最优路径回溯。对 t=T−1,T−2,…,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 所示,要在所有可能的路径中选择一条最优路径,按照以下步骤处理:
图 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)=1≤j≤3max[δ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)=arg1≤j≤3max[δ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)=1≤j≤3max[δ1(j)aj1]b1(o2)=jmax{0.10×0.5,0.16×0.3,0.28×0.2}×0.5=0.028=3=1≤j≤3max[δ1(j)aj2]b2(o2)=jmax{0.10×0.2,0.16×0.5,0.28×0.3}×0.6=0.0504=3=1≤j≤3max[δ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)=1≤j≤3max[δ2(j)aji]bi(o3)=arg1≤j≤3max[δ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∗=1≤i≤3maxδ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)。