隐马尔可夫模型(HMM)是一种标注模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。其在语音识别,自然语言处理,模式识别等领域有着广泛的应用。
1.基本概念
友好起见,我们以例子来导出马尔可夫的定义
- 盒子与球模型
设有4个盒子,每个盒子里装有红白两种颜色的球。该模型抽取过程定义如下:先等概率选择一个盒子,从中抽取一次得到一个观测结果,然后换盒子,并且换盒子的过程中服从一些概率,比如1号盒子到2、3、4号的概率分别为0.1、0.4、0.5。2号盒子到1、2、3、4号的概率分别为0.3、0.2、0.1、0.4。假设抽取了5次,结果为“红,白,白,红,红”。
总共抽取了5次,那么得到一个时间长度为5的观测序列,这里”红,白,白,红,红“便是最终的观测序列,其中每次抽取是在不同的盒子中进行的,这5次选择的盒子构成了一个状态随机序列,表示是在什么状态下抽取的。注意模型开始假设是等概率选择一个盒子,这个概率叫初始状态概率$\pi$。
设所有可能的状态Q有N种,可能的V观测有M种,为了公式表达方便, 用 $q=i$ 表示状态为第$i$ 个状态, $q_t=i$表示在 $t$ 时刻的状态是第 $i$ 个状态,$y_t$ 表示第 $t$个时刻的观测。
其中每个状态(当前盒子)都有转移到另一个状态的概率,这些概率可以方便的用矩阵表示,并且这个矩阵一定是方阵,
其中,
表示在时刻 t 处于状态 i 的条件下在下一时刻 t+1 转移到状态 j 的概率。
除了状态转移矩阵,要知道还有每个状态下各个观测事件发生的概率,因此也用矩阵B将其表示
其中
表示在状态 $j$ 下生成观测$v_k$的概率。
$\pi$表示初始状态概率向量
其中,$\pi = P(q_1 =i)$,表示$t = 1$时刻处于状态 $i$ 的概率。
状态转移概率矩阵A,观测概率矩阵B和初始状态概率$\pi$构成了隐马尔可夫模型的三要素,常用三元符表示隐马尔可夫模型的参数
1.1 两个重要假设
隐马尔可夫模型有两个非常重要的假设,后面简化算法的推导都是基于这两个假设
- 齐次马尔可夫性假设
即假设隐马尔可夫链在任意时刻$t$的状态只依赖与前一时刻的状态,与其他时刻的装态和观测值无关,也与$t$时刻无关,即得概率简化公式如下 - 观测独立性假设
即假设任意时刻的观测只依赖于当前时刻马尔可夫链的状态,而与其他观测和状态无关 总结一下隐马尔可夫的过程,那么假设$\lambda$的参数已知,生成一个长度为T的时间序列的过程如下:
(1) 按照初始状态概率$\pi$产生一个状态$q_1$。
(2)令 t = 1
(3)按照状态$q_t$的观测概率矩阵B生成$y_t$。
(4)安装状态$q_t$的状态转移矩阵A产生下一个时刻的状态。
(5)$t= t +1$, 如果$t < T$,转至(3),否则结束。
大致明白隐马尔可夫模型是什么之后我们需要考虑它是干嘛的,能做什么。事实上隐马尔可夫模型有三个基本问题,解决这三个基本问题的过程也就是解决不同问题的过程,同时其问题描述也很明确,相信看完问题描述之后便对它能做什么有大致的了解。
- 隐马尔可夫的三个基本问题
(1) 概率计算问题。给定隐马尔可夫模型的参数$\lambda=(A,B,\pi)$和观测序列$Y=(y_1,y_2,…,y_t)$,计算在该模型下观测 序列$Y$出现的概率$P(Y|\lambda)$。
(2) 学习问题。已知观测序列$Y= (y_1,y_2,…,y_t)$,估计模型的参数$\lambda=(A,B,\pi)$,使得该模型下的该观测序列发生的概率$P(Y|\lambda)$最大,即极大似然估计该模型参数。
(3) 预测问题,也称为解码(decoding)问题。已知模型$\lambda=(A,B,\pi)$和观测序列$Y=(y_1,y_2,…,y_t)$,求使给定序列条件下状态序列的概率$P(Q|Y)$最大的状态序列,即给定观测序列,求最有可能生成该观测序列的状态序列。
后面继续讨论如何计算这些问题以及如何简化这些问题。
2. $P(Y|\lambda)$概率计算问题
本问题可以通过前向和后向算法进行计算,不过先来看看该问题的直接解法,以及该方法为什么不可行。前面已经说过隐马尔可夫有两个基本假设,其计算基本都是基于它们来化简的,先考虑其基本用法,即一个观测序列可以如何简化表达,以三个观测序列为例$P(y_1,y_2,y_3)$,其中共有K个状态
虽然这一方法在直接计算法中没有用到,但是是后面化简都会用到的,所以先写在这儿。
2.1 直接计算方法
回忆问题,给定模型参数和一个观测序列,计算这个观测序列出现的概率$P(Y,\lambda)$,若要直接计算,需考虑我们有哪些已知条件。首先初始状态概率$\pi$知道,状态转移概率矩阵A也知道,那么生成和这个观测序列相同长度的状态序列的概率$P(Q|\lambda)$就能表示出来了
$P(Y|\lambda)$不能直接表达的原因是中间还有隐变量——转移状态,在固定状态下的观测概率B是已知的,那么已经得到了一串状态序列的概率,在这串状态序列下的观测是能够表示的,这便得到了
有了这两个概率,隐变量和观测变量的联合概率分布可表示为
对于联合概率分布,可以求解其一个变量的边缘分布的和或积分得到另一个变量的分布,这是机器学习中常见的 手段,应熟练掌握,现对状态序列求和
这个计算量是非常大的,T个观测序列,每个序列有K种可能的状态,且内部还有T个乘积需要计算,相当于T个for循环,每个循环执行K次,每次的复杂度T,那么总复杂度$O(TK^T)$。
2.2 前向算法
为了简化,首先定义了前向概率表达,对于隐马尔可夫模型$\lambda$,定义在时刻 t 的观测序列为$(y_1,y_2,…,y_t)$且状态为$q_t = i$的概率为前向概率$\alpha_t(i)$,即
下面通过这个前向概率推导$P(Y|\lambda)$的递推表达式
这是我之前想的推导方法,但不得不说是比较蠢的,由定义观察式子中少了什么多了什么即可,法2
注意求第二个前向概率的时候,为了化简式子,引入了$q_1$但将它当作边缘概率求和去掉了。这个递推式就这样神奇的得到了 t 时刻状态为 $q = i$ 的概率,得到t 时刻的前向概率的表达式后,根据它的定义$\alpha_T(i) = P(y_1,y_2,…,y_T,q_t = i|\lambda)$可知,计算$P(Y|\lambda)$只需要将 t 时刻的所有状态的概率求和就可以了(边缘概率)
而且这个递推式极大的简化了计算量,因为在计算下一个时刻的前向概率的时候,上一个时刻的前向概率是已经算出来了的,只需做少量乘法,最后的复杂度为$O(KT)$。
2.3 后向算法
明白前向算法的推导过程后,后向算法的思想其实是一样的,并且得到的结果都一样,只不过后向是从后面往前面推,前向可与后向算法组合在一起表达$P(Y|\lambda)$
定义:
给定隐马尔可夫模型$\lambda$,定义在 t 时刻 且状态为$q_t = i$的条件下,从 t + 1 时刻到 T 时刻的观测序列的概率为后向概率,即
注意观测数据是从 t + 1 时刻开始的,并且$\beta_t(i) = 1$,
和上面一样,法2,由定义,补充一个$q_{t+1}$即可
同样,得到后向概率的表达式后,根据其定义$\beta_t(i) = P(y_{t+1},y_{t+2},…,y_T| q_t = i, \lambda)$,所求序列为1-T,但t 至少为1 ,这使得该表达式缺少了第一个观测值的概率,不过这很简单,乘上$\pi_i b_{i}(y_1)$即可,通过后向概率得到$P(Y|\lambda)$
从刚刚这个求和运算中发现后向概率的定义从 t + 1 时刻开始似乎不方便,但是当它和前向概率结合时,就会发现,应当如此!
2.4 通过前向与后向概率表达两个重要概率和三个期望
(1)计算$P(q_t = i|Y,\lambda),Y = (y_1,y_2,…y_T)$时,即计算给定一串序列情况下,其 t 时刻的状态为 i 的几率,记为$\gamma_t(i)$。利用前向与后向概率,先计算t 时刻状态与观测的联合分布
即序列中某个时刻 t 的状态与观测的联合分布可用前向与后向拼接而成,由该联合分布可得观测的分布
再根据条件概率或乘法公式
(2)给定模型参数和观测序列Y,求在时刻 t 处于状态 i 且在时刻 t + 1 处于状态 j 的概率,记为$\xi_t(i,j)$,大概已经找到窍门了,就是通过其联合概率和观测概率
其中,
此过程中应仔细考虑马尔可夫的两个基本假设,确定其中哪些变量是相互独立的,还有哪些是我们之前已经求出来的。这里以 t 和 t + 1 为界将观测量分开,这样时刻 t 和 时刻 t + 1 的状态都只能作用 于其中一边了。带入原式
(3)上面计算出的两个概率求和可以方便的表示一些有用的期望
1> 在观测Y下状态 i 出现的期望
2> 在观测Y下由状态 i 转移的期望,即前 T- 1个时刻有过状态 i
3>在观测Y下由状态 i 转移到状态 j 的期望
3. 学习算法(EM)
对于学习算法,可分为知道状态序列和不知道状态序列,知道状态序列的计算可直接用极大似然估计经验概率。这里就不说了,一般都是不知道状态序列的,这就和上一篇讲的EM算法一致了,即包含隐变量的概率模型的学习。隐马尔可夫的学习算法叫Baum-Welch,不过原理和EM是一致的,只是因为那时候EM算法还未成体系。
- EM估计
在隐马尔可夫中,模型参数是$\lambda= (A,B,\pi)$,观测序列$Y$便是观测数据,而状态转移序列$Q$作为不可观测的隐数据,这样便确立了EM的结构,下面只需按EM算法的步骤计算即可。(按理说初始状态产生的概率也应算作隐变量,但事实上状态序列的第一个已经包含它,并且在后面的计算中状态转移都是依赖于$\pi$的,可同时将其计算出来)
首先,确立完全数据的对数似然函数
E-Step:
E步求对数似然函数关于 隐变量 Q (状态序列)的条件后验概率的期望,但在隐马尔可夫模型中,并未用关于隐变量Q的条件后验概率的期望,而是用 关于 观测序列 Y 和 状态序列的联合后验概率的期望,可以这么做的原因是联合概率等于观测概率 * 隐变量的条件概率——$P(Y,Q|\bar \lambda) = P(Q|Y,\bar \lambda)P(Y|\bar \lambda)$,而$P(Y|\bar \lambda)$是常数,并不影响对似然函数的极大化。至于为什么这么做,当然是为了化简后面的结果——用前面推导出的容易表示的概率和期望。于是Q函数表示为
其中$Q = (q_1,q_2,\cdots ,q_t)$,表示有 t 个求和运算,log前是参数已知的概率,实际要优化的是后面参数未知的$\lambda$,而
于是,
M-Step:
得到Q函数后就可以进行M步求解模型参数
对于这个Q函数,由于$\lambda$的三个参数都是互相分离的,因此可以分开极大化求解
(1)对于第1 项
注意log 函数中只与 状态序列中第一个有关,于是可以提到 第二个状态序列的求和前面,而后面的求和就是常见的边缘概率的求和=1,相当于把那部分变量积分消去了,这时添加$\sum_i\pi_i =1$的约束,利用拉格朗日乘数法计算极大点,这里求偏导时其实就是对每个$\pi_i$求偏导,也就是说有 N 个等式都得为0 ,然后分别求$\pi_i$
$\gamma$带回到上面等式第二步,
其中分母也可用后向概率表示,或是后向与前向组合,注意分子被前面得到的前向后向概率简单的表示出来,这便是开始选择Q函数的时候为什么选择联合概率的原因。
(2) 对于第二项
原理与第一项是一样的,虽是对每个状态变量都要求和,但是当 t 确定时,求和中只有时刻 t 和与它相邻的 t + 1 时刻的状态有关,因此外面的T个求和运算总是只有两个有效,然后添加关于$a_{ij}$的约束$\sum_j a_{ij}= 1$构造拉格朗日即可
代回上式第二步,
(3) 对于第三项
求解方法相同,这里不赘述,只需要注意$b_j(y_t)$偏导时不止要保证 j 相同就不为0,还需保证观测值也相同,可用$I(y_t = k)$表示,结果为
这些结果最后都可以用前向后向的简化而来的期望进行计算和表达。
4.预测算法
隐马尔可夫的预测是指给定模型参数和已知的观测序列,求解最有可能的状态序列,所以也称为解码运算(decoding)。下面介绍用于预测的近似算法和维特比算法(Viterbi algorithm)。
4.1 近似算法
近似算法是不考虑状态之间的互相影响而简化的一种算法,它的基本思想是分别选取每个时刻 t 最有可能出现的状态 $q_i$,从而得到一个状态序列。而前面我们已经将 t 时刻最有可能出现的概率表示出了
于是,t 时刻最有可能的状态是
对 T 个时刻依次求解即可得到状态序列,从求解过程中也可以看到,每个状态只是单独的用观测序列进行估计,并未考虑状态序列之间的整体影响和概率最大情况。但近似算法计算简单,并在有些场景仍可使用。
4.2 维特比算法
维特比算法采用动态规划求解隐马尔可夫模型的状态序列,即从初始时刻开始,依次计算到每个状态的概率,保存到当前时刻的每个状态最大的概率的上一个状态是什么,直到T时刻时,便计算出了所有状态的最大概率,选择概率最大的那个状态,并从该状态回溯,得到其状态序列,那么该序列便是总概率最大的状态序列。其实就是贪心的思想,先求解最优子问题。
根据刚刚的分析,该问题需要计算的有两个,一是当前时刻是状态 i 的最大概率,二是当前时刻是状态 i 的最大概率是由上个时刻哪个状态得到的。
- 定义
(1) . 在时刻 t 状态为 i 的状态序列的概率最大值为(注意 时刻 t 前的序列都已确定)
那么无论是通过定义,还是考虑这是一个递归过程,都能得到
(2) . 在时刻 t 状态为 i 的概率最大的状态序列的上一个时刻的状态为
注意求上一个时刻的状态时不需要乘发射概率,因为当前时刻 t 的状态已确定,与观测无关。
算法过程:
需要计算的量和贪心策略确定后,算法过程也就比较简单了。
(1)初始化
(2)递推,t = 2, 3, … , T
(3)停止
(4)回溯 ,t = T-1,…, 1
算法完成便得到一个状态序列,这个序列对于观测序列来说是概率最大的。