定义

隐马尔可夫模型是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时序建模,在语音识别、自然语言处理领域有广泛应用。

隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测随机序列的过程。

概率图模型(1)--隐马尔科夫模型(1)

上图中箭头表示了变量间的依赖关系。在任一时刻,观测变量的取值仅依赖于状态变量,即 xtx_tyty_t 确定,与其他状态变量及观测变量的取值无关。同时,tt 时刻的状态 yty_t 仅依赖 t1t-1 时刻的状态 yt1y_{t-1} ,与此前 t2t-2 个状态无关。这就是“马尔科夫链”,即系统下一时刻的状态仅由当前状态决定,不依赖于以往的任何状态。基于这种依赖关系,所有变量的联合概率分布为:

P(x1,y1,...,xn,yn)=P(y1)P(x1y1)i=2nP(yiyi1)P(xiyi)(1)P(x_1,y_1,...,x_n, y_n)=P(y_1)P(x_1|y_1) \prod\limits_{i=2}^n P(y_i|y_{i-1})P(x_i|y_i) \tag{1}

除了结构信息,确定一个隐马尔可夫模型还需要下面三个参数:

  1. 状态转移概率:模型在各个状态间转换的概率,通常记为矩阵 A=[aij]N×NA=[a_{ij}]_{N \times N} ,其中

    aij=P(yt+1=sjyt=si),1i,jNa_{ij}=P(y_{t+1}=s_j|y_t=s_i), \quad 1 \le i,j \le N

  2. 输出观测概率:模型根据当前状态获得各个观测值的概率,通常记为矩阵 B=[bij]N×MB=[b_{ij}]_{N \times M},其中

    bij=P(xt=ojyt=si),1iN,1jMb_{ij} = P(x_t=o_j|y_t=s_i), \quad 1 \le i \le N ,1 \le j \le M

    表示任意时刻 tt ,若状态为 sis_i ,则观测值 ojo_j 被获取的概率

  3. 初始状态概率:模型在初始时刻各状态出现的概率,通常记为 π=(π1,π2,...,πN)\pi = (\pi_1,\pi_2,...,\pi_N) ,其中

    πi=P(y1=si),1iN\pi_i=P(y_1=s_i),\quad 1 \le i \le N

通过指定状态空间、观测空间和上述三组参数就能确定一个隐马尔可夫模型,通常用其参数 λ=[A,b,π]\lambda = [A,b,\pi] 来指代。

观测序列生成

给定隐马尔可夫模型 λ\lambda ,它按照如下过程产生观测序列 x1,x2,...,xn{x_1, x_2,...,x_n}

  1. 设置 t=1t=1 ,并根据初始状态概率 π\pi 选择初始状态 y1y_1
  2. 根据状态 yty_t 和输出观测概率 BB 选择观测变量取值 xtx_t
  3. 根据状态 yty_t 和状态转移矩阵 AA 转移模型状态,即确定 yt+1y_{t+1}
  4. t<nt < n ,设置 t=t+1t = t+1 ,并转到第2步,否则停止

三个基本问题

在实际应用中,人们常关注隐马尔可夫模型的三个基本问题

  1. 给定模型 λ=[A,B,π]\lambda =[A,B,\pi] ,如何有效计算其产生的观测序列 x={x1,x2,...,xn}x=\{x_1,x_2,...,x_n\} 的概率 P(xλ)P(x | \lambda) ?换言之,如何评估模型与观测序列之间的匹配程度?
  2. 给定模型 λ=[A,B,π]\lambda =[A,B,\pi] 和观测序列 x={x1,x2,...,xn}x=\{x_1,x_2,...,x_n\} ,如何找到与此观测序列最匹配的状态序列 y={y1,y2,...,yn}y=\{y_1,y_2,...,y_n\} ?换言之,如何根据观测序列推断隐藏的模型状态?
  3. 给定观测序列 x={x1,x2,...,xn}x=\{x_1,x_2,...,x_n\} ,如何调整模型参数 λ=[A,B,π]\lambda =[A,B,\pi] 使得该序列出现的概率 P(xλ)P(x | \lambda) 最大?换言之,如何训练模型使其能最好地描述观测数据?

概率计算算法

如何计算观测序列概率 P(Oλ)P(O|\lambda) 呢?

直接计算法

我们可以列举出所有可能出现的长度为 TT 的隐藏序列 I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\} ,分布求出这些隐藏序列与观测序列 O={o1,o2,...oT}O =\{o_1,o_2,...o_T\} 的联合概率分布 P(O,Iλ)P(O,I|\lambda) ,这样我们就可以很容易的求出边缘分布 P(Oλ)P(O|\lambda) 了。

首先,任意一个隐藏序列 I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\} 出现的概率是:

P(Iλ)=πi1ai1i2ai2i3...aiT1    iTP(I|\lambda) = \pi_{i_1} a_{i_1i_2} a_{i_2i_3}... a_{i_{T-1}\;\;i_T}

对于固定的状态序列 I={i1,i2,...,iT}I = \{i_1,i_2,...,i_T\},我们要求的观察序列 O={o1,o2,...oT}O =\{o_1,o_2,...o_T\} 出现的概率是:

P(OI,λ)=bi1(o1)bi2(o2)...biT(oT)P(O|I, \lambda) = b_{i_1}(o_1)b_{i_2}(o_2)...b_{i_T}(o_T)

则 $O $ 和 II 联合出现的概率是:

P(O,Iλ)=P(Iλ)P(OI,λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT1    iTbiT(oT)P(O,I|\lambda) = P(I|\lambda)P(O|I, \lambda) = \pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)

然后求边缘概率分布,即可得到观测序列 OO 在模型 λ\lambda 下出现的条件概率 P(Oλ)P(O|\lambda)

P(Oλ)=IP(O,Iλ)=i1,i2,...iTπi1bi1(o1)ai1i2bi2(o2)...aiT1    iTbiT(oT)P(O|\lambda) = \sum\limits_{I}P(O,I|\lambda) = \sum\limits_{i_1,i_2,...i_T}\pi_{i_1}b_{i_1}(o_1)a_{i_1i_2}b_{i_2}(o_2)...a_{i_{T-1}\;\;i_T}b_{i_T}(o_T)

虽然上述方法有效,但是如果我们的隐藏状态数 N 非常多的那就麻烦了,此时我们预测状态有 NTN^T 种组合,算法的时间复杂度是 O(TNT)O(TN^T) 阶的。因此对于一些隐藏状态数极少的模型,我们可以用暴力求解法来得到观测序列出现的概率,但是如果隐藏状态多,则上述算法太耗时,我们需要寻找其他简洁的算法。

前向算法

前向后向算法是前向算法和后向算法的统称,这两个算法都可以用来求HMM观测序列的概率。我们先来看看前向算法是如何求解这个问题的。

前向算法本质上属于动态规划的算法,也就是我们要通过找到局部状态递推的公式,这样一步步的从子问题的最优解拓展到整个问题的最优解。

在前向算法中,前向概率:定义时刻 tt 时隐藏状态为 qiq_i, 观测状态的序列为 o1,o2,...oto_1,o_2,...o_t 的概率为前向概率。记为:

αt(i)=P(o1,o2,...ot,it=qiλ)\alpha_t(i) = P(o_1,o_2,...o_t, i_t =q_i | \lambda)

可以递推地求得前向概率 αt(i)\alpha_t(i) 及观测序列概率 P(Oλ)P(O|\lambda)

从下图可以看出,我们可以基于时刻 tt 时各个隐藏状态的前向概率,再乘以对应的状态转移概率,即 αt(j)aji\alpha_t(j)a_{ji} 就是在时刻 t 观测到 o1,o2,...oto_1,o_2,...o_t ,并且时刻 t 隐藏状态 qjq_j, 时刻 t+1t+1 隐藏状态 qiq_i 的概率。如果将想下面所有的线对应的概率求和,即 j=1Nαt(j)aji\sum\limits_{j=1}^N\alpha_t(j)a_{ji} 就是在时刻 t 观测到 o1,o2,...oto_1,o_2,...o_t ,并且时刻 t+1 隐藏状态 qiq_i 的概率。继续一步,由于观测状态 ot+1o_{t+1} 只依赖于 t+1 时刻隐藏状态 qiq_i , 这样 [j=1Nαt(j)aji]bi(ot+1)[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}]b_i(o_{t+1}) 就是在在时刻 t+1 观测到 o1,o2,...ot,ot+1o_1,o_2,...o_t,o_{t+1} ,并且时刻 t+1 隐藏状态 qiq_i 的概率。而这个概率,恰恰就是时刻 t+1 对应的隐藏状态ii的前向概率,这样我们得到了前向概率的递推关系式如下:

αt+1(i)=[j=1Nαt(j)aji]bi(ot+1)\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1})

概率图模型(1)--隐马尔科夫模型(1)

我们的动态规划从时刻1开始,到时刻 T 结束,由于 αT(i)\alpha_T(i) 表示在时刻 T 观测序列为 o1,o2,...oto_1,o_2,...o_t ,并且时刻 T 隐藏状态 qiq_i 的概率,我们只要将所有隐藏状态对应的概率相加,即 i=1NαT(i)\sum\limits_{i=1}^N\alpha_T(i) 就得到了在时刻 T 观测序列为 o1,o2,...oto_1,o_2,...o_t 的概率。

总结下前向算法

输入:HMM模型 λ=(A,B,Π)\lambda = (A, B, \Pi) ,观测序列 O=(o1,o2,...oT)O=(o_1,o_2,...o_T)

输出:观测序列概率 P(Oλ)P(O|\lambda)

  1. 计算时刻1的各个隐藏状态前向概率:

α1(i)=πibi(o1),  i=1,2,...N\alpha_1(i) = \pi_ib_i(o_1),\; i=1,2,...N

  1. 递推时刻 2,3,...T2,3,...T 时刻的前向概率:

αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),  i=1,2,...N\alpha_{t+1}(i) = \Big[\sum\limits_{j=1}^N\alpha_t(j)a_{ji}\Big]b_i(o_{t+1}),\; i=1,2,...N

  1. 计算最终结果:

P(Oλ)=i=1NαT(i)P(O|\lambda) = \sum\limits_{i=1}^N\alpha_T(i)

从递推公式可以看出,我们的算法时间复杂度是 O(TN2)O(TN^2),比暴力解法的时间复杂度 O(TNT)O(TN^T) 少了几个数量级。

后向算法

后向算法和前向算法非常类似,都是用的动态规划,唯一的区别是选择的局部状态不同,后向算法用的是“后向概率”,那么后向概率是如何定义的呢?

定义时刻 t 时隐藏状态为 qiq_i , 从时刻 t+1 到最后时刻 T 的观测状态的序列为 ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T 的概率为后向概率。记为:

βt(i)=P(ot+1,ot+2,...oTit=qi,λ)\beta_t(i) = P(o_{t+1},o_{t+2},...o_T| i_t =q_i , \lambda)

后向概率的动态规划递推公式和前向概率是相反的。现在我们假设我们已经找到了在时刻 t+1 时各个隐藏状态的后向概率 βt+1(j)\beta_{t+1}(j),现在我们需要递推出时刻 t 时各个隐藏状态的后向概率。如下图,我们可以计算出观测状态的序列为 ot+2,ot+3,...oTo_{t+2},o_{t+3},...o_T,t 时隐藏状态为 qiq_i , 时刻 t+1 隐藏状态为 qjq_j 的概率为 aijβt+1(j)a_{ij}\beta_{t+1}(j) , 接着可以得到观测状态的序列为 ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T ,t 时隐藏状态为 qiq_i , 时刻 t+1 隐藏状态为 qjq_j 的概率为 aijbj(ot+1)βt+1(j)a_{ij}b_j(o_{t+1})\beta_{t+1}(j) , 则把下面所有线对应的概率加起来,我们可以得到观测状态的序列为 ot+1,ot+2,...oTo_{t+1},o_{t+2},...o_T,t 时隐藏状态为 qiq_i 的概率为 j=1Naijbj(ot+1)βt+1(j)\sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j) ,这个概率即为时刻 t 的后向概率。

概率图模型(1)--隐马尔科夫模型(1)

这样我们得到了后向概率的递推关系式如下:

βt(i)=j=1Naijbj(ot+1)βt+1(j)\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j)

现在我们总结下后向算法的流程,注意下和前向算法的相同点和不同点:

输入:HMM模型 λ=(A,B,Π)\lambda = (A, B, \Pi) ,观测序列 O=(o1,o2,...oT)O=(o_1,o_2,...o_T)

输出:观测序列概率 P(Oλ)P(O|\lambda)

  1. 初始化时刻 T 的各个隐藏状态后向概率:

βT(i)=1,  i=1,2,...N\beta_T(i) = 1,\; i=1,2,...N

  1. 递推时刻 T1,T2,...1T-1,T-2,...1 时刻的后向概率:

βt(i)=j=1Naijbj(ot+1)βt+1(j),  i=1,2,...N\beta_{t}(i) = \sum\limits_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j),\; i=1,2,...N

  1. 计算最终结果:

P(Oλ)=i=1Nπibi(o1)β1(i)P(O|\lambda) = \sum\limits_{i=1}^N\pi_ib_i(o_1)\beta_1(i)

此时我们的算法时间复杂度仍然是 O(TN2)O(TN^2)

HMM常用概率的计算

利用前向概率和后向概率,我们可以计算出HMM中单个状态和两个状态的概率公式。

1)给定模型 λ\lambda 和观测序列 O ,在时刻 t 处于状态 qiq_i 的概率记为:

γt(i)=P(it=qiO,λ)=P(it=qi,Oλ)P(Oλ)\gamma_t(i) = P(i_t = q_i | O,\lambda) = \frac{P(i_t = q_i ,O|\lambda)}{P(O|\lambda)}

利用前向概率和后向概率的定义可知

P(it=qi,Oλ)=αt(i)βt(i)P(i_t = q_i ,O|\lambda) = \alpha_t(i)\beta_t(i)

于是我们得到:

γt(i)=αt(i)βt(i)j=1Nαt(j)βt(j)\gamma_t(i) = \frac{ \alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N \alpha_t(j)\beta_t(j)}

2)给定模型 λ\lambda 和观测序列 O ,在时刻 t 处于状态 qiq_i ,且时刻 t+1 处于状态 qjq_j 的概率记为:

ξt(i,j)=P(it=qi,it+1=qjO,λ)=P(it=qi,it+1=qj,Oλ)P(Oλ)\xi_t(i,j) = P(i_t = q_i, i_{t+1}=q_j | O,\lambda) = \frac{ P(i_t = q_i, i_{t+1}=q_j , O|\lambda)}{P(O|\lambda)}

P(it=qi,it+1=qj,Oλ)P(i_t = q_i, i_{t+1}=q_j , O|\lambda) 可以由前向后向概率来表示为:

P(it=qi,it+1=qj,Oλ)=αt(i)aijbj(ot+1)βt+1(j)P(i_t = q_i, i_{t+1}=q_j , O|\lambda) = \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)

从而最终我们得到 ξt(i,j)\xi_t(i,j) 的表达式如下:

ξt(i,j)=αt(i)aijbj(ot+1)βt+1(j)r=1Ns=1Nαt(r)arsbs(ot+1)βt+1(s)\xi_t(i,j) = \frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum\limits_{r=1}^N\sum\limits_{s=1}^N\alpha_t(r)a_{rs}b_s(o_{t+1})\beta_{t+1}(s)}

  1. γt(i)\gamma_t(i)ξt(i,j)\xi_t(i,j) 在各个时刻 t 求和,可以得到:

在观测序列 O 下状态ii出现的期望值 t=1Tγt(i)\sum\limits_{t=1}^T\gamma_t(i)

在观测序列 O 下由状态ii转移的期望值 t=1T1γt(i)\sum\limits_{t=1}^{T-1}\gamma_t(i)

在观测序列 O 下由状态ii转移到状态jj的期望值 t=1T1ξt(i,j)\sum\limits_{t=1}^{T-1}\xi_t(i,j)

上面这些常用的概率值在求解HMM问题二,即求解HMM模型参数的时候需要用到。我们在这个系列的第三篇来讨论求解HMM参数的问题和解法。

参考

https://www.cnblogs.com/pinard/p/6955871.html
周志华《机器学习》

相关文章:

  • 2021-09-06
猜你喜欢
  • 2021-09-28
  • 2021-12-29
  • 2021-12-18
  • 2022-01-09
  • 2022-12-23
相关资源
相似解决方案