1 概述
1.1 HMM概念理解
首先我们需要对一些看起来比较相似的概念做一个总结和区分:
- 马尔可夫性(Markov Property):无后效性或无记忆性,在已知“现在”的条件下,“将来”与“过去”无关,这种特性就叫强马尔可夫性。如人口增长、电子跃迁、传染病传染人数等;
- 马尔可夫过程(Markov Process):满足马尔可夫性的随机过程;
- 马尔可夫链(Markov Chain):时间和状态都是离散的马尔可夫过程称为马尔可夫链,描述了一种状态序列,其每个状态值取决于前面有限个状态。马尔可夫链是具有马尔可夫性质的随机变量的一个数列;
- 马尔可夫模型(Markov Model):时间的状态只与其在时间的状态有关,即只取决于前面一个状态,比如语言模型中的二元语法模型2-gram就是一个马尔可夫模型。
在马尔可夫模型中,每个状态代表一个时间的可观察事件,比如在2-gram中每个状态就是一个单词,所以马尔可夫模型又称为可视马尔可夫模型(visible Markov Model,VHM)
那么对于状态不可观察的问题呢,我们观察到的不是状态,观察到的事件是状态的随机函数,状态是未知、不可见的,相当于有两层的随机过程,比如经典的掷硬币问题:假如有两个不均匀硬币,掷到正面的概率分别为,小明每次扔一个硬币,我来观察正反面,但我不知道他每次扔的是还是,即状态对我是不可见的,我观察到的正反面是状态的随机函数,这种问题怎么描述呢?显然VHM是行不通了,我们要使用隐马尔可夫模型(hidden Markov Model,HHM),如下图,表示状态,为硬币或,表示观察到的事件,为正面或反面:
1.2 HMM数学表示
HMM的图示简单明了,下面我们从数学的语言来定义一下隐马尔可夫模型:
1)模型变量:
设是所有可能状态的集合,是所有可能观测的集合。
对于一个长度为的序列:为状态序列,为观测序列。
2)模型基本假设:
- 齐次马尔可夫性假设:任意时刻的隐藏状态只依赖于它前一个隐藏状态,即在时刻的隐藏状态是,在时刻的隐藏状态是,从时刻状态到时刻状态的转移概率可以表示为:
- 观测独立性假设:任意时刻的观察状态只依赖于当前时刻的隐藏状态,即时刻观察状态在隐藏状态下生成的概率为:
3)模型参数:
- 状态转移概率分布:状态与状态之间互相转移的概率;
- 观测概率分布:某状态下生成观测的概率;
- 初始概率分布:某状态作为初始时刻状态的概率。
4)模型解决的问题:
我们知道,在HMM中我们观察到的是观测序列,即观测序列肯定是已知的,状态序列和模型参数都有可能是未知的,因为很容易得到HMM的三个基本问题:
- 预测问题:求状态序列,观测序列和模型参数为已知;
- 学习问题:求模型参数,观测序列为已知,状态序列可能已知也可能未知;
- 概率计算问题:求观测序列出现的概率,模型参数为已知。
其中预测问题和学习问题是在应用中最常见的饿两个问题,但是要解决他们,问题三概率计算问题的解决是基础,所以我们接下来先来看看概率计算问题怎么解决。
2 概率计算问题
求观测序列出现的概率,就是计算,将参数综合表示为,即,最直接的方法是使用全概率公式,如果我们能把所有可能的状态都枚举出来,就能以下式计算:
但是状态序列的可能性很多,上式的时间复杂度为,基本上是不可行的。那怎么办呢?我们采用前向算法或后向算法来计算。
2.1 前向计算
前向概率是t时刻状态和t之前(包括t)观测的联合概率:
前向算法流程:
输入:HMM模型,观测序列
输出:观测序列概率
- 计算时刻1的各个隐藏状态前向概率:
- 递推时刻2,3,...T时刻的前向概率:
- 计算最终结果:
2.2 后向计算
后向概率是时刻状态条件下,以后的观测的条件概率,定义时刻时隐藏状态为, 从时刻到最后时刻的观测状态的序列为的概率为后向概率。记为:
使用后向概率来计算仍然是一个动态规划的过程,找到和的关系,从后往前推即可:
后向算法流程:
输入:HMM模型,观测序列
输出:观测序列概率
- 初始化时刻T的各个隐藏状态后向概率:
- 递推时刻T−1,T−2,...1时刻的后向概率:
- 计算最终结果:
2.3 前向后向计算小结
前向后向算法的时间复杂度如何呢?不管是前向后向,都是T次递推,每次递推都有N次循环,最后还有一层N次循环,所以时间复杂度是,比小多了。
看到前向计算和后向计算的定义我们难免有这么个问题:为什么前向概率是联合概率形式,后向概率是条件概率形式呢?
我认为,因为前向计算是要从当前时刻向时刻推的,由得到,又可由得到,也就是说,推是不需要提前知道任何时刻的信息的,作为对比,我们再看看后向的公式为什么用条件概率的形式,后向计算要从后往前推,而HMM是有向的,从不能反向推到,所以我们要得到必须先得到作为条件,所以后向概率要设计成条件概率的形式。
前后向算法帮助我们解决了HMM的概率计算问题,接下来我们来尝试解决预测问题。
3 预测问题
预测问题:求状态序列,观测序列和模型参数为已知。
所谓预测,就是找出最可能出现情况,将其作为我们预测的结果。在HMM中就是要找到使观测序列出现概率最大的状态序列,即:
我们直接能想到的最简单的办法就是把所有可能的状态序列枚举出来,挨个计算,使其取得最大值的状态序列即为我们的预测结果,然而问题还是时间复杂度,维特比算法能够大幅优化这个问题。
维特比算法是基于动态规划的求序列最短路径的方法,不只是用在HMM中,对于维特比算法的具体内容有一篇很好的博客,推荐一波,我就不再拾人牙慧了~链接如下:
小白给小白详解维特比算法(一)
稍微总结一下维特比算法的思路:全部路线下图1,最短路径是从A到D1最短的那条,当我们处于C层,想要到达D1点时,我们必然要选择C1C2C3中的一个(如图2),假设知道了C层前面的所有路线的距离,我们就能结合C到D之间路径的距离决定选择C层的哪个点,一层层依次往前走,我们就能推出一条路来。当然这是倒着想的,正着也是一样的,我们在A层没法决定B层走哪个点,但如果我们看远一点,就可以通过C层的信息决定B层的点,基本上就是这个思路,不清楚的话还是看上面的博客吧。
维特比算法的流程:
输入:HMM模型,观测序列
输出:最可能的状态序列
- 初始化:
- 动态规划递推。对:
- 终止。计算时刻最大的,为最可能状态序列出现的概率;计算时刻最大的,为时刻最可能的状态:
- 最优路径回溯。对于:
即求得最优路径(最可能的状态序列)。
4 学习问题
学习问题:求模型参数,观测序列为已知,状态序列可能已知也可能未知,所以就要分两种情况讨论,第一种是状态序列已知;第二种是状态序列未知。
4.1 状态序列已知:极大似然估计
这种情况比较简单,给定的训练数据中既有观测序列,也有对应的状态序列,直接用极大似然估计可得:
- 状态转移矩阵:
样本从状态转移到的频率计数是,状态转移矩阵为:
- 观测概率矩阵:
样本状态为,观测为的频率计数是,观测概率矩阵为:
- 初始状态概率:
样本中初始状态为的频率计数为,初始状态概率分布为:
不过很多时候我们是无法得到状态序列的,这种情况下怎么学习到模型的参数呢?我们一般使用鲍姆-韦尔奇算法(Baum-Welch)。
4.1 状态序列未知:Baum-Welch算法
训练数据是一批只有观测序列,没有状态序列的数据,要学习参数,可以把HMM模型看做是一个含有隐变量的概率模型:
这种含有隐变量的问题我们用EM算法来解决。
未完待续。。。