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

定义

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

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

在这里插入图片描述

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

P ( x 1 , y 1 , . . . , x n , y n ) = P ( y 1 ) P ( x 1 ∣ y 1 ) ∏ i = 2 n P ( y i ∣ y i − 1 ) P ( x i ∣ y i ) (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} P(x1,y1,...,xn,yn)=P(y1)P(x1y1)i=2nP(yiyi1)P(xiyi)(1)

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

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

    a i j = P ( y t + 1 = s j ∣ y t = s i ) , 1 ≤ i , j ≤ N a_{ij}=P(y_{t+1}=s_j|y_t=s_i), \quad 1 \le i,j \le N aij=P(yt+1=sjyt=si),1i,jN

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

    b i j = P ( x t = o j ∣ y t = s i ) , 1 ≤ i ≤ N , 1 ≤ j ≤ M b_{ij} = P(x_t=o_j|y_t=s_i), \quad 1 \le i \le N ,1 \le j \le M bij=P(xt=ojyt=si),1iN,1jM

    表示任意时刻 t t t ,若状态为 s i s_i si ,则观测值 o j o_j oj 被获取的概率

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

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

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

观测序列生成

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

  1. 设置 t = 1 t=1 t=1 ,并根据初始状态概率 π \pi π 选择初始状态 y 1 y_1 y1
  2. 根据状态 y t y_t yt 和输出观测概率 B B B 选择观测变量取值 x t x_t xt
  3. 根据状态 y t y_t yt 和状态转移矩阵 A A A 转移模型状态,即确定 y t + 1 y_{t+1} yt+1
  4. t < n t < n t<n ,设置 t = t + 1 t = t+1 t=t+1 ,并转到第2步,否则停止

三个基本问题

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

  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} 的概率 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} ,如何找到与此观测序列最匹配的状态序列 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λ) 最大?换言之,如何训练模型使其能最好地描述观测数据?

概率计算算法

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

直接计算法

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

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

P ( I ∣ λ ) = π i 1 a i 1 i 2 a i 2 i 3 . . . a i T − 1      i T P(I|\lambda) = \pi_{i_1} a_{i_1i_2} a_{i_2i_3}... a_{i_{T-1}\;\;i_T} P(Iλ)=πi1ai1i2ai2i3...aiT1iT

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

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

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

P ( O , I ∣ λ ) = P ( I ∣ λ ) P ( O ∣ I , λ ) = π i 1 b i 1 ( o 1 ) a i 1 i 2 b i 2 ( o 2 ) . . . a i T − 1      i T b i T ( o T ) 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) P(O,Iλ)=P(Iλ)P(OI,λ)=πi1bi1(o1)ai1i2bi2(o2)...aiT1iTbiT(oT)

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

P ( O ∣ λ ) = ∑ I P ( O , I ∣ λ ) = ∑ i 1 , i 2 , . . . i T π i 1 b i 1 ( o 1 ) a i 1 i 2 b i 2 ( o 2 ) . . . a i T − 1      i T b i T ( o T ) 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) P(Oλ)=IP(O,Iλ)=i1,i2,...iTπi1bi1(o1)ai1i2bi2(o2)...aiT1iTbiT(oT)

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

前向算法

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

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

在前向算法中,前向概率:定义时刻 t t t 时隐藏状态为 q i q_i qi, 观测状态的序列为 o 1 , o 2 , . . . o t o_1,o_2,...o_t o1,o2,...ot 的概率为前向概率。记为:

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

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

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

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

在这里插入图片描述

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

总结下前向算法

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

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

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

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

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

α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a j i ] b i ( o t + 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 αt+1(i)=[j=1Nαt(j)aji]bi(ot+1),i=1,2,...N

  1. 计算最终结果:

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

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

后向算法

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

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

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

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

在这里插入图片描述

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

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

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

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

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

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

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

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

β t ( i ) = ∑ j = 1 N a i j b j ( o t + 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 βt(i)=j=1Naijbj(ot+1)βt+1(j),i=1,2,...N

  1. 计算最终结果:

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

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

HMM常用概率的计算

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

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

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

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

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

于是我们得到:

γ t ( i ) = α t ( i ) β t ( i ) ∑ j = 1 N α 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)} γt(i)=j=1Nαt(j)βt(j)αt(i)βt(i)

2)给定模型 λ \lambda λ 和观测序列 O ,在时刻 t 处于状态 q i q_i qi ,且时刻 t+1 处于状态 q j q_j qj 的概率记为:

ξ t ( i , j ) = P ( i t = q i , i t + 1 = q j ∣ O , λ ) = P ( i t = q i , i t + 1 = q j , 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)} ξt(i,j)=P(it=qi,it+1=qjO,λ)=P(Oλ)P(it=qi,it+1=qj,Oλ)

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

P ( i t = q i , i t + 1 = q j , O ∣ λ ) = α t ( i ) a i j b j ( o t + 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) P(it=qi,it+1=qj,Oλ)=αt(i)aijbj(ot+1)βt+1(j)

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

ξ t ( i , j ) = α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) ∑ r = 1 N ∑ s = 1 N α t ( r ) a r s b s ( o t + 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)} ξt(i,j)=r=1Ns=1Nαt(r)arsbs(ot+1)βt+1(s)αt(i)aijbj(ot+1)βt+1(j)

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

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

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

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

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

参考

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值