【算法系列】终于有人把隐马尔可夫链的前向后向算法讲懂了!

前言

视频讲解在我女朋友的B站『终于有人把隐马尔可夫链的前向后向算法讲懂了!』

在上一篇文章《你真的理解隐马尔可夫模型了吗?》中,我们讲解了隐马尔科夫链中的基本概念,并在最后说明了隐马尔可夫链中三个基本问题:

  1. 概率计算问题:给定模型参数 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 x = { x 1 , x 2 , . . . , x n } x=\{x_1,x_2,...,x_n\} x={x1,x2,...,xn}计算在模型参数 λ \lambda λ下观测到x的概率 P ( x ∣ λ ) P(x|\lambda) P(xλ)(评估模型和观测序列之间的匹配程度)

  2. 预测问题:给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 x = { x 1 , x 2 , . . . , x n } x=\{x_1,x_2,...,x_n\} x={x1,x2,...,xn},求使得 P ( y ∣ x , λ ) P(y|x,\lambda) P(yx,λ)最大的状态观测序列 y = { y 1 , y 2 , . . . , y n } y=\{y_1,y_2,...,y_n\} y={y1,y2,...,yn}(根据观测序列推断最有可能的状态序列)

  3. 学习问题:给定观测序列 x = { x 1 , x 2 , . . . , x n } x=\{x_1,x_2,...,x_n\} x={x1,x2,...,xn},调整模型参数 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π),使得该序列出现的概率 P ( x ∣ λ ) P(x|\lambda) P(xλ)最大(训练模型使其更好地描述观测序列)

这篇文章将会以尽可能通俗易懂的方式为大家讲解这几个问题的解法,其中概率计算问题将主要讲解前向、后向算法,预测问题将主要讲解维特比算法,学习问题主要讲解神经网络学习的方式。

1.直接计算法

直接计算法就是枚举所有的路径,然后将所有路径求和,得到最终答案,这种计算方法计算复杂度为 O ( n N m ) O(nN^m) O(nNm)(每条路经有2n个乘法操作,共 N n N^n Nn个路径),计算过程复杂,且耗时,我们仅列举一下计算方法,不过多解释:

2.前向算法

我们使用这样一个信封抽球问题作为例子讲解,状态为第0/1号信封,观测为球的颜色为红/黑

我们先不管观测到的5个状态,就假设观测到了第一个球为红色,这个概率该怎么计算呢?

我们不知道第一个状态是哪个信封,我们只能根据一些先验去猜:有两种可能状态0/1,可能得到红球,如果第一个状态为0,那么得到红球观测的概率为 B 00 B_{00} B00,如果第一个状态为1,那么得到红球观测的概率为 B 10 B_{10} B10

而这里我们用来猜的的先验就是稳态向量 π \pi π,我们拿到这个稳态向量可能会猜,是0的概率为0.5,是1的概率为0.5,那么:

  • 如果第一个状态为0,得到观测为红球的概率就是 P = π ( 0 ) B 00 P=\pi(0)B_{00} P=π(0)B00
  • 如果第一个状态为1,得到观测为红球的概率就是 P = π ( 1 ) B 10 P=\pi(1)B_{10} P=π(1)B10

然后将二者加起来就可以得到第一个观测为红球的概率 P ( x 1 ∣ λ ) = π ( 0 ) B 00 ∗ π ( 1 ) B 10 P(x_1|\lambda)=\pi(0)B_{00}*\pi(1)B_{10} P(x1λ)=π(0)B00π(1)B10

我们将 P = π ( 0 ) B 00 P=\pi(0)B_{00} P=π(0)B00记为 α 1 ( 0 ) \alpha_1(0) α1(0),这表示第1个状态(下标)为0(值)的概率;同样将 P = π ( 1 ) B 10 P=\pi(1)B_{10} P=π(1)B10记为 α 1 ( 1 ) \alpha_1(1) α1(1),这表示第1个状态(下标)为1(值)的概率,这样表示是因为后面计算我们会用到,以简化我们的计算量。

我们再加入进来一个状态– x 2 = 黑 x_2=黑 x2=,我们采用同样的方法,得到第二个观测为黑球,也只有两种可能状态0/1,这时我们的先验就变成了我们之前记录的 α 1 ( 0 ) \alpha_1(0) α1(0) α 1 ( 1 ) \alpha_1(1) α1(1),它们分别表示了第一个状态为0/1的概率:

  • 如果第二个状态为0,可能由第一个状态为0/1转移而来,那么其概率为 P = α 1 ( 0 ) ∗ A 00 + α 1 ( 1 ) ∗ A 10 P=\alpha_1(0)*A_{00}+\alpha_1(1)*A_{10} P=α1(0)A00+α1(1)A10,然后再由状态0观测到黑球概率为 B 01 B_{01} B01,综合起来概率为 α 2 ( 0 ) = ( α 1 ( 0 ) ∗ A 00 + α 1 ( 1 ) ∗ A 10 ) ∗ B 01 \alpha_2(0)=(\alpha_1(0)*A_{00}+\alpha_1(1)*A_{10})*B_{01} α2(0)=(α1(0)A00+α1(1)A10)B01
  • 同样的,如果第二个状态为1,可能由第一个状态为0/1转移而来,那么其概率为 P = α 1 ( 0 ) ∗ A 01 + α 1 ( 1 ) ∗ A 11 P=\alpha_1(0)*A_{01}+\alpha_1(1)*A_{11} P=α1(0)A01+α1(1)A11,然后再由状态1观测到黑球概率为 B 11 B_{11} B11,综合起来概率为 α 2 ( 1 ) = ( α 1 ( 0 ) ∗ A 01 + α 1 ( 1 ) ∗ A 11 ) ∗ B 11 \alpha_2(1)=(\alpha_1(0)*A_{01}+\alpha_1(1)*A_{11})*B_{11} α2(1)=(α1(0)A01+α1(1)A11)B11

这样我们就得到了前两个观测和状态组成的马尔科夫链的概率,我们重复上述步骤,一直到得到5个状态的马尔科夫链概率:

  • α 5 ( 0 ) = ( α 4 ( 0 ) ∗ A 00 + α 1 ( 1 ) ∗ A 10 ) ∗ B 00 \alpha_5(0)=(\alpha_4(0)*A_{00}+\alpha_1(1)*A_{10})*B_{00} α5(0)=(α4(0)A00+α1(1)A10)B00
  • α 5 ( 1 ) = ( α 4 ( 0 ) ∗ A 01 + α 1 ( 1 ) ∗ A 11 ) ∗ B 10 \alpha_5(1)=(\alpha_4(0)*A_{01}+\alpha_1(1)*A_{11})*B_{10} α5(1)=(α4(0)A01+α1(1)A11)B10

将这两个概率加起来,就得到了最终的,在模型参数 λ \lambda λ下观测到x的概率 P ( x ∣ λ ) = α 5 ( 0 ) + α 5 ( 1 ) P(x|\lambda)=\alpha_5(0)+\alpha_5(1) P(xλ)=α5(0)+α5(1)

附录展示了完整的计算过程!

可以把这个过程化成一个树状图:

3.后向算法

后向算法,顾名思义就是从后往前算,我们先定义一个类似于 α \alpha α的中间变量 β \beta β β t ( i ) \beta_t(i) βt(i)表示:在t时刻的状态为i的条件下,从t+1时刻到n时刻(最后时刻)的部分观测变量 x t + 1 , x t + 2 , . . . , x n x_{t+1},x_{t+2},...,x_n xt+1,xt+2,...,xn的概率。

那么,我们现在开始逐步计算:

  1. β 5 ( 0 ) \beta_5(0) β5(0)表示,假设第5个状态为0,得到6到最后观测的概率,因为一共5个状态,那么这个概率为1;同理 β 5 ( 1 ) = 1 \beta_5(1)=1 β5(1)=1

  2. β 4 ( 0 ) \beta_4(0) β4(0)表示,假设第4个状态为0,得到5到最后观测(第5个观测为红)的概率,第5个状态可能为0/1,那么我们应该这样计算 β 4 ( 0 ) = A 00 ∗ β 5 ( 0 ) ∗ B 00 + A 01 ∗ β 5 ( 1 ) ∗ B 01 \beta_4(0)=A_{00}*\beta_5(0)*B_{00}+A_{01}*\beta_5(1)*B_{01} β4(0)=A00β5(0)B00+A01β5(1)B01;同理,假设第4个状态为1, β 4 ( 1 ) = A 10 ∗ B 00 ∗ β 5 ( 0 ) + A 11 ∗ B 11 ∗ β 5 ( 1 ) \beta_4(1)=A_{10}*B_{00}*\beta_5(0)+A_{11}*B_{11}*\beta_5(1) β4(1)=A10B00β5(0)+A11B11β5(1)

进一步解释: β 4 ( 0 ) = A 00 ∗ β 5 ( 0 ) ∗ B 00 \beta_4(0)=A_{00}*\beta_5(0)*B_{00} β4(0)=A00β5(0)B00,表示第四个状态为0(\beta_4(0)),到第五个状态为0(A_{00}*\beta_5(0)),然后观测为红球(B_{00})

  1. 依次从后向前计算,最后计算得到 β 1 ( 0 ) \beta_1(0) β1(0) β 1 ( 1 ) \beta_1(1) β1(1),表示假设第1个状态为0或1,得到2到最后观测的概率,也就是得到了下图的马尔科夫链的概率。

  1. 这时,注意到还有第一个观测没有考虑进来,所以我们要再向前推一个,第0个状态(稳态先验)为0或1,得到1到最后观测的概率,第0的状态是不存在在马尔科夫链中的,我们用先验知识(稳态向量 π \pi π)进行猜测,然后相加就得到了最终的概率

附录展示了完整的计算过程!

P ( x ∣ λ ) = π ( 0 ) ∗ B 00 ∗ β 1 ( 0 ) + π ( 1 ) ∗ B 10 ∗ β 1 ( 1 ) P(x|\lambda)=\pi(0)*B_{00}*\beta_1(0)+\pi(1)*B_{10}*\beta_1(1) P(xλ)=π(0)B00β1(0)+π(1)B10β1(1)

对应上面的树状图,前向算法相当于树自顶向下不断分叉,后向算法相当于自底向上不断合并,两个过程都可以得到最终的概率。

总结

现在我们已经掌握了,在给定隐马尔科夫链参数的条件下,如何计算获得当前观测的概率,对应这组观测序列,有很多可能得状态序列,比如:0,1,0,1,0;1,1,1,0,1;1,1,1,1,1等等,哪一条才是最有可能得到这组观测的状态序列呢?

这就是预测问题,我们将在下一篇文章介绍解决这个问题的经典算法-维特比算法

附录

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值