隐马尔可夫模型(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=iq=iq=i 表示状态为第iii 个状态, qt=iq_t=iqt=i表示在 ttt 时刻的状态是第 iii 个状态,yty_tyt 表示第 ttt个时刻的观测。
其中每个状态(当前盒子)都有转移到另一个状态的概率,这些概率可以方便的用矩阵表示,并且这个矩阵一定是方阵,
A=[aij]N∗N A=[a_{ij} ] _ {N*N} A=[aij]N∗N其中,aij=P(q(t+1)=j∣qt=i),i=1,2,...,N;j=1,2,...,Na_{ij} = P(q_{(t+1)} =j|q_t = i), i=1,2,...,N;j=1,2,...,Naij=P(q(t+1)=j∣qt=i),i=1,2,...,N;j=1,2,...,N表示在时刻 t 处于状态 i 的条件下在下一时刻 t+1 转移到状态 j 的概率。
除了状态转移矩阵,要知道还有每个状态下各个观测事件发生的概率,因此也用矩阵B将其表示
B=[bj(k)]N∗MB = [b_j(k)]_{N*M}B=[bj(k)]N∗M其中,bj(k)=P(yt=vk∣qt=j) b_j(k) = P(y_t = v_k|q_t = j) bj(k)=P(yt=vk∣qt=j)表示在状态 jjj 下生成观测vkv_kvk的概率。
π\piπ表示初始状态概率向量
π=(πi),\pi = (\pi_i) , π=(πi),其中,π=P(q1=i)\pi = P(q_1 =i)π=P(q1=i),表示t=1t = 1t=1时刻处于状态 iii 的概率。
状态转移概率矩阵A,观测概率矩阵B和初始状态概率π\piπ构成了隐马尔可夫模型的三要素,常用三元符表示隐马尔可夫模型的参数
λ=(A,B,π)\lambda = (A,B,\pi)λ=(A,B,π) 隐马尔可夫模型有两个非常重要的假设,后面简化算法的推导都是基于这两个假设 - 齐次马尔可夫性假设
即假设隐马尔可夫链在任意时刻ttt的状态只依赖与前一时刻的状态,与其他时刻的装态和观测值无关,也与ttt时刻无关,即得概率简化公式如下
P(qt∣y1,y2,...,yt−1,q1,q2,...,qt−1)=P(qt∣qt−1)P(q_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_{t-1})= P(q_t|q_{t-1})P(qt∣y1,y2,...,yt−1,q1,q2,...,qt−1)=P(qt∣qt−1) - 观测独立性假设
即假设任意时刻的观测只依赖于当前时刻马尔可夫链的状态,而与其他观测和状态无关
P(yt∣y1,y2,...,yt−1,q1,q2,...,qt)=P(yt∣qt)P(y_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_t) = P(y_t|q_t)P(yt∣y1,y2,...,yt−1,q1,q2,...,qt)=P(yt∣qt) 总结一下隐马尔可夫的过程,那么假设λ\lambdaλ的参数已知,生成一个长度为T的时间序列的过程如下:
(1) 按照初始状态概率π\piπ产生一个状态q1q_1q1。
(2)令 t = 1
(3)按照状态qtq_tqt的观测概率矩阵B生成yty_tyt。
(4)安装状态qtq_tqt的状态转移矩阵A产生下一个时刻的状态。
(5)t=t+1t= t +1t=t+1, 如果t<Tt < Tt<T,转至(3),否则结束。
大致明白隐马尔可夫模型是什么之后我们需要考虑它是干嘛的,能做什么。事实上隐马尔可夫模型有三个基本问题,解决这三个基本问题的过程也就是解决不同问题的过程,同时其问题描述也很明确,相信看完问题描述之后便对它能做什么有大致的了解。
- 隐马尔可夫的三个基本问题
(1) 概率计算问题。给定隐马尔可夫模型的参数λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π)和观测序列Y=(y1,y2,...,yt)Y=(y_1,y_2,...,y_t)Y=(y1,y2,...,yt),计算在该模型下观测 序列YYY出现的概率P(Y∣λ)P(Y|\lambda)P(Y∣λ)。
(2) 学习问题。已知观测序列Y=(y1,y2,...,yt)Y= (y_1,y_2,...,y_t)Y=(y1,y2,...,yt),估计模型的参数λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π),使得该模型下的该观测序列发生的概率P(Y∣λ)P(Y|\lambda)P(Y∣λ)最大,即极大似然估计该模型参数。
(3) 预测问题,也称为解码(decoding)问题。已知模型λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π)和观测序列Y=(y1,y2,...,yt)Y=(y_1,y_2,...,y_t)Y=(y1,y2,...,yt),求使给定序列条件下状态序列的概率P(Q∣Y)P(Q|Y)P(Q∣Y)最大的状态序列,即给定观测序列,求最有可能生成该观测序列的状态序列。
后面继续讨论如何计算这些问题以及如何简化这些问题。
2.P(Y∣λ)P(Y|\lambda)P(Y∣λ)概率计算问题
本问题可以通过前向和后向算法进行计算,不过先来看看该问题的直接解法,以及该方法为什么不可行。前面已经说过隐马尔可夫有两个基本假设,其计算基本都是基于它们来化简的,先考虑其基本用法,即一个观测序列可以如何简化表达,以三个观测序列为例P(y1,y2,y3)P(y_1,y_2,y_3)P(y1,y2,y3),其中共有K个状态
P(y1,y2,y3)=∑q3K∑q2K∑q1KP(y1,y2,y3,q1,q2,q3)=∑q3K∑q2K∑q1KP(y3∣y1,y2,q1,q2,q3)⋅P(y1,y2,q1,q2,q3)=∑q3K∑q2K∑q1KP(y3∣q3)⋅P(q3∣y1,y2,q1,q2)⋅P(y1,y2,q1,q2)=∑q3K∑q2K∑q1KP(y3∣q3)⋅P(q3∣q2)⋅P(y1,y2,q1,q2)⋯⋯=∑q3K∑q2K∑q1KP(y3∣q3)⋅P(q3∣q2)⋅P(y2∣q2)⋅P(q2∣q1)⋅P(y1∣q1)⋅P(q1)=∑q3K∑q2K∑q1KP(y3∣q3)⋅P(q3∣q2)⋅P(y2∣q2)⋅P(q2∣q1)⋅P(y1∣q1)⋅π(π1) \begin{aligned} P(y_1,y_2,y_3) = & \sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_1,y_2,y_3,q_1,q_2,q_3)\\ = &\sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_3|y_1,y_2,q_1,q_2,q_3)\cdot P(y_1,y_2,q_1,q_2,q_3)\\ = &\sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_3|q_3)\cdot P(q_3|y_1,y_2,q_1,q_2)\cdot P(y_1,y_2,q_1,q_2)\\ =& \sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_3|q_3) \cdot P(q_3|q_2) \cdot P(y_1,y_2,q_1,q_2)\\ & \cdots \cdots\\ =& \sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_3|q_3) \cdot P(q_3|q_2) \cdot P(y_2|q_2)\cdot P(q_2|q_1) \cdot P(y_1|q_1) \cdot P(q_1)\\ =& \sum_{q_3}^K\sum_{q_2}^K\sum_{q_1}^KP(y_3|q_3) \cdot P(q_3|q_2) \cdot P(y_2|q_2)\cdot P(q_2|q_1) \cdot P(y_1|q_1) \cdot \pi(\pi_1) \end{aligned} P(y1,y2,y3)======q3∑Kq2∑Kq1∑KP(y1,y2,y3,q1,q2,q3)q3∑Kq2∑Kq1∑KP(y3∣y1,y2,q1,q2,q3)⋅P(y1,y2,q1,q2,q3)q3∑Kq2∑Kq1∑KP(y3∣q3)⋅P(q3∣y1,y2,q1,q2)⋅P(y1,y2,q1,q2)q3∑Kq2∑Kq1∑KP(y3∣q3)⋅P(q3∣q2)⋅P(y1,y2,q1,q2)⋯⋯q3∑Kq2∑Kq1∑KP(y3∣q3)⋅P(q3∣q2)⋅P(y2∣q2)⋅P(q2∣q1)⋅P(y1∣q1)⋅P(q1)q3∑Kq2∑Kq1∑KP(y3∣q3)⋅P(q3∣q2)⋅P(y2∣q2)⋅P(q2∣q1)⋅P(y1∣q1)⋅π(π1) 虽然这一方法在直接计算法中没有用到,但是是后面化简都会用到的,所以先写在这儿。
- 直接计算方法
回忆问题,给定模型参数和一个观测序列,计算这个观测序列出现的概率P(Y,λ)P(Y,\lambda)P(Y,λ),若要直接计算,需考虑我们有哪些已知条件。首先初始状态概率π\piπ知道,状态转移概率矩阵A也知道,那么生成和这个观测序列相同长度的状态序列的概率P(Q∣λ)P(Q|\lambda)P(Q∣λ)就能表示出来了
P(Q∣λ)=πq1aq1q2aq2q3⋯aqt−1qtP(Q|\lambda)=\pi_{q_1} a_{q_1q_2}a_{q_2q_3} \cdots a_{q_{t-1}q_{t}}P(Q∣λ)=πq1