Machine Learning系列--隐马尔可夫模型的三大问题及求解方法

本文主要介绍隐马尔可夫模型以及该模型中的三大问题的解决方法。

隐马尔可夫模型的是处理序列问题的统计学模型,描述的过程为:由隐马尔科夫链随机生成不可观测的状态随机序列,然后各个状态分别生成一个观测,从而产生观测随机序列。

在这个过程中,不可观测的序列称为状态序列(state sequence), 由此产生的序列称为观测序列(observation sequence)。

该过程可通过下图描述:

上图中, X1,X2,XT是隐含序列,而O1,O2,..OT是观察序列。

隐马尔可夫模型由三个概率确定:

  1. 初始概率分布,即初始的隐含状态的概率分布,记为π
  2. 状态转移概率分布,即隐含状态间的转移概率分布, 记为A
  3. 观测概率分布,即由隐含状态生成观测状态的概率分布, 记为B

以上的三个概率分布可以说就是隐马尔可夫模型的参数,而根据这三个概率,能够确定一个隐马尔可夫模型λ=(A,B,π)

而隐马尔科夫链的三个基本问题为:

  1. 概率计算问题。即给定模型λ=(A,B,π)和观测序列O,计算在模型λ下观测序列出现的最大概率P(O|λ)
  2. 学习问题。即给定观测序列O,估计模型的参数λ, 使得在该参数下观测序列出现的概率最大,即P(O|λ)最大;
  3. 解码问题。给定模型λ=(A,B,π)和观测序列O,计算最有可能产生这个观测序列的隐含序列X, 即使得概率P(X|O,λ)最大的隐含序列X

 

一、概率计算问题

概率计算问题理论上可通过穷举法来解决,即穷举所有可能的隐含状态序列,然后计算所有可能的隐含序列生成观测序列的概率,假设观测序列的长度为n, 且每个观测状态对应的可能的隐含状态长度为m, 则这种方法的时间复杂度就是O(mn), 这样的时间复杂度显然是无法接受的,因此在实际中往往不采用这种方法,而是采用前向算法和后向算法, 前向算法和后向算法都是通过动态规划来减少计算的时间复杂度,两者的不同点就是计算的方向不同。

1.1 前向算法

前向算法需要先定义前向概率:

前向概率定义为到时刻t为止观测序列为o1,o2,o3ot,且时刻t的隐含状态为所有的隐含状态中的第i个(记为qi),则前向概率可记为
αt(i)=P(o1,o2,o3ot,xt=qi|λ)

定义了前向概率,便可递归地求解前向概率和观测序列的概率P(o1,o2,o3ot|λ)


初始的状态为:
α1(i)=πibi(o1)  i=1,..m
上式中的m表示隐含状态的数目,πi表示各个隐含状态的初始概率,bi(o1)表示第i个隐含状态生成观测状态o1的概率。


则递推的公式为:
αt+1(i)=(j=1Nαt(j)aji)bi(ot+1)  i=1,..m
上式中的aji表示从隐含状态j转移到隐含状态i的状态转移概率。通过下图可较直观地看到前向递推公式的过程:

 

最终计算得到的概率为(其中T为观测序列的长度):
P(O|λ)=i=1mαT(i)

1.2 后向算法

类似前向算法,后向算法也可用于求解这个问题,只是方向是从后到前的。同样的,需要先定义后向概率:

后向概率指时刻t的隐含状态为所有隐含状态中的第i个(记为qi), 且时刻t+1T的观测序列为ot+1,ot+2,.oT的概率,记为:
βt(i)=P(ot+1,ot+2,.oT,xt=qi|λ)

初始状态定义为:
βT(i)=1  i=1,2,m
这里概率为1的原因是本来还需要看看时刻T后面有什么东西,但因为最后一个时刻T后面已经没有时刻,即不需要再观测某个东西,所以随便给个什么状态都可以。

递推公式为:
βt(i)=j=1maijbj(ot+1)βt+1(j)  i=1,2,m

上面的式子中的符号与前向算法中的一致,其过程可通过下图更直观理解:


最终计算得到的概率为:
P(O|λ)=i=1mπibi(o1)β1(i)

分析可知,前向算法和后向算法的时间复杂度均是O(m2T)m为隐含状态的个数,T为序列长度。

二、学习问题

学习问题要根据观测序列来推导模型参数,这一类的问题对应到概率论中的极大似估计问题。但是这里是有隐含变量的极大似然估计,因此直接无法通过直接求导进行求解,而要通过EM算法来求解这一类问题。

EM 算法是一类算法,用于解决有隐含变量的概率模型参数的极大似然估计,具体到隐马尔可夫模型中的具体算法是 Baum-Welch 算法

注:这里采用 EM 算法的前提是问题仅给出了观测序列,假如同时给出了观测序列和隐含序列,可直接通过最大似然估计求解。

这里只给出 Baum-Welch 算法的流程,而省去其推导过程:
1. 初始化模型参数:选取aij(0),bj(0),πi(0), 得到模型π(0)=(A(0),B(0),π(0));
2. E 步,求解两个中间变量γt(i),ξt(i,j),两者的含义如下:
γt(i):给定模型λ和观测序列O,在时刻t的隐含状态为qi的概率, 即γt(i)=P(xt=qi|O,λ);
ξt(i,j):给定模型λ和观测序列O,在时刻t的隐含状态为qi, 时刻t+1的隐含状态为qj的概率, 即ξt(i,j)=P(xt=qi,xt+1=qj|O,λ).

结合前面的前向概率和后向概率的定义,计算这两个中间变量的公式如下(m表示隐含状态的总个数):
γt(i)=αt(i)βt(i)j=1mαt(j)βt(j)
ξt(i,j)=αt(i)aijbj(ot+1)βt+1(j)p=1mq=1mαt(p)apqbq(ot+1)βt+1(q)

3. M步,同时E步求解出的两个中间变量来求解模型的参数,求解公式如下:
aij=t=1Tξt(i,j)t=1Tγt(i)
bj(k)=t=1Tγt(j)I(ot=vk)t=1Tγt(j)
πi=γ1(i)

上式中的I(ot=vk)表示时刻t的观察状态为vk时, I(ot=vk)才为1,否则为0.

迭代进行E步骤和M步,将最终收敛的结果作为模型的参数.

三、解码问题

解码问题理论上也可以通过穷举法来解决,就是穷举所有可能的隐含序列并计算在这个隐含序列下观测序列的概率,并选择概率最大的那个隐含序列,但是穷举所有可能的隐含序列的时间复杂度也是指数级别的,跟第一个问题一样,在实际中往往也是不常用的。
实际中,解码问题通过动态规划来降低时间复杂度,并且已经有了成熟的解决方法,就是著名的维特比算法。

 

转自博文:http://wulc.me/2017/07/14/隐马尔可夫模型的三大问题及求解方法/

posted @   蓝鲸王子  阅读(12409)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示