隐马尔科夫模型_统计学习方法_学习笔记

  • 前言

统计学习方法一书中第9章关于EM算法的核心内容,与之前斯坦福CS229学习笔记差不多,因此不再叙述了。但是EM算法作为一个经典且应用很广的算法值得深入探索,因此在之后可能会继续深入EM算法并记下相关学习与思考。

这章笔记将记入书中第10章关于隐马尔科夫模型(Hidden Markov Model,HMM)的学习与思考。隐马尔科夫模型在时序数据中有着广泛的应用,属于生成模型的一种。此章笔记主要由4个部分组成:隐马尔科夫模型基本概念以及隐马尔科夫模型常用来应用的三个方面--概率计算、学习算法、预测算法。


目录

1 隐马尔科夫模型

1.1 建模思想

1.2 三个基本问题

2 概率计算算法

2.1 直接计算法

2.2 前向算法

2.3 后向算法

2.4 有用的计算公式

3 学习算法

3.1 监督学习方法

3.2 Baum-Welch算法

4 预测算法

4.1 近似算法

4.2 Viterbi算法

5 小结


1 隐马尔科夫模型

1.1 建模思想

机器学习算法的第一步便是根据数据特征,在一系列假设之上进行针对性建模。

为了更好地说明HMM,首先介绍马尔科夫链的定义:

马尔可夫链,又称离散时间马尔可夫链,因俄国数学家安德烈-马尔科夫得名,为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。(维基百科)

通俗一点理解,若数据符合马尔科夫性质,那么认为后一个数据仅与当前数据有关,与其余数据无关。例如在时序数据--“I want to eat __ ”这段话中,若其构成马尔科夫链,那么则认为单词“eat”后面出现的单词仅仅与“eat”有关,而与“eat”前面3个单词无关,

隐马尔科夫模型针对于时序数据,首先通过一个例子来引出隐马尔科夫模型。

假设有4个盒子,每个盒子都装有红白两种颜色的球,盒子里的红白球数量由下表给出:

现在进行抽球操作,操作如下:随机选取一个盒子,从里面抽出一个球,记录其颜色,然后放回盒子。

为了便于选择盒子,在选择盒子的时候,假设制定了一些规则:

1. 第一次选择盒子,每个盒子被选中的概率相等,都为 0.25。

2. 若当前选择的盒子是1号,那么下一个盒子一定为2号。

3. 若当前选择的盒子是2号,那么下一次以0.4概率选择1号,以0.6概率选择3号。

4. 若当前选择盒子是3号,那么下一次以0.4概率选择2号,以0.6概率选择4号。

5. 若当前选择盒子是4号,那么下一次以0.5概率继续选择4号,或者以0.5概率选择3号。

可以发现的是,下一个盒子的选择只与当前盒子有关,那么选择盒子的过程便是一个马尔科夫链生成的过程。

重复抽球5次,那么便可以得到一个关于球的颜色观测序列:。

假设我们只能观察到球的颜色,而不知道这个球来自于哪个盒子。那么每次选择哪个盒子被隐藏起来了,这就是“隐马尔科夫”这个名字的由来,即在观察序列之下“隐藏”了一个具备马尔科夫性质的状态链。

以上例子可以注意几个地方:

1.具备一个隐藏着的马尔科夫链(当前选择的盒子)。

2.具备一个可被观察的序列(球的颜色)。

3.隐藏着的马尔科夫链的当前状态影响当前的观察(不同的盒子拿到不同颜色球的概率不同)。

由此给出隐马尔科夫模型的定义:隐马尔科夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫随机生成不可观测的状态随机序列,再由各个状态生成一个观测,这些观测组成一个观测随机序列的过程。其中,每个序列的位置可看做每个时刻。因此,结合上述例子,盒子便是隐藏着的状态随机序列,球的颜色便是可被观测到的观测随机序列,根据选择的盒子不同,球的颜色选择概率也不同,即隐藏着的状态(state)影响着实际的观测(observation)。

也就是说,在隐马尔科夫模型中,可被观测到的序列是由不可被观测到的状态影响甚至决定的,且每个观测只与当前的状态有关,而不可被观测的状态具备马尔科夫性质,即下一个状态只由当前状态决定,与其他状态无关。

从定义可知,隐马尔科夫模型做了以下两个假设:

1.齐次马尔科夫假设:隐藏的马尔科夫链在任意时刻的状态只依赖于前一个时刻。

2.观测独立性假设:任意时刻的观测只依赖于该时刻的马尔科夫链的状态。

由上述定义可知,当确定了初始状态概率分布(初始选择哪一个盒子)、状态转移概率分布(根据当前盒子判断下一个选择哪个盒子)以及状态决定的观测概率分布(根据当前选择的盒子得到选择球颜色的概率)这三点时,那么我们便可以确定了一个隐马尔科夫模型。具体定义如下:

  • 设Q是所有可能的状态的集合,可能的状态数为N;V是所有可能的观测的集合,可能的观测数为M:

在上述例子中,有4个状态取值,状态的集合为:

有2个观测取值,观测的集合为:

  • \mathbb{I} 是生成的状态序列,长度为T;O是其对应的观测序列。一个状态生成一个观测,因此观测序列的长度也为T。

上述例子中,状态序列和观测序列的长度 T = 5;生成的状态随机序列未知(利用建立的模型可对于其进行求解);生成的观测随机序列为:

  • 设A是状态转移矩阵(N*N),其中:

代表的是在 t 时刻且状态为 q_{i} 条件下, t+1 时刻状态为 q_{j} 的概率。

具体地,根据判别规则可写成上述例子的状态转移矩阵:

  • 设B是观测概率矩阵(N*M):

其中:

表示在 t 时刻下,在状态 q_{j} 下,生成观测 v_{k} 的概率。

在上述例子中,由每个盒子中不同颜色球的个数,统计得到观测概率分布矩阵B:

  • 最后,还有初始状态分布。设为初始状态概率向量:

其中:

代表第一个时刻,即 t = 1 时刻,位于状态 q_{i} 的概率。

由于在例子中,第一次取出每个盒子的概率相等,因此得到初始状态概率向量为:

由此,隐马尔科夫模型的建模便完成了。

隐马尔科夫模型由三个核心要素:初始状态概率分布、状态转移概率分布、观测概率分布。前面二者决定了隐藏的状态序列的生成,而最后一个则决定了观测序列的生成。因此,可将一个隐马尔科夫模型 \lambda 用这三个核心要素表示而成,即:

1.2 三个基本问题

由隐马尔科夫模型,我们可以进行如下3个方面的应用,也就是常说的3个基本问题。

1. 概率计算问题。给定模型 \lambda 和一个观测序列 O ,计算该观测序列出现的概率。

2. 学习问题。已知观测序列 O,估计模型 \lambda 参数即初始状态分布、状态转移分布、观测概率分布,使得观测序列 O 出现的概率最大。

3.预测问题。给定模型 \lambda 和观测序列 O,求解最有可能的状态序列(这也是上面例子待解决的问题)。

以下,将分别对于这三个问题的解决算法进行叙述。


2 概率计算算法

明白一个要确定一个隐马尔科夫模型即确定三个要素:初始状态分布、状态转移分布和观测概率分布。

概率计算问题是指当给定模型 \lambda 后,计算某个观测序列 O 出现的概率。

本节介绍解决该问题的三种思路:直接计算法、前向计算法、后向计算法。直接计算法逻辑上可行,但是计算复杂度太高,因此在实际情况中很少使用。以下推导会涉及上一节内容中定义的各种符号,由于符号繁琐,确保明白每个符号代表的意义。

2.1 直接计算法

直接计算法的思路有点像古典概型的思路:将所有可能的隐藏的状态序列都找出来,分别就每个状态序列计算其生成该观测序列 O 的概率,之后将这些概率进行求和便得到观测序列 O 出现的概率。

具体地,某个可能的状态序列 I=(i_{1},i_{2},...,i_{T})出现的概率为:

对于该状态序列,给定的观测序列 O=(o_{1},o_{2},...,o_{T}) 出现的概率为:

那么,该状态序列和观测序列共同出现的概率为:

以上就得到了单个状态序列生成给定观测序列的概率。将所有可能出现的状态序列生成的结果进行求和便得到最终结果,即:

看上去思路简单,其实计算复杂度相当大。因为可能的状态序列的结果最大值为 N^{T} 个(N为状态取值数),每次需要进行 T 个乘法计算,因此计算复杂度为 O(TN^{T}) 阶。实际情况难以计算,因此常采用其他思路(前向算法、后向算法)进行求解。

2.2 前向算法

前向算法采用一种递推的思路进行求解:通过第一个状态的可能初值得到第一个观测的概率;由此推出在第一个状态的可能初值得到第一个观测的概率的情况下,第二个状态可能取值得到第二个观测的概率;接着推出前两个状态的可能初值得到前两个观测的概率的情况下,第三个状态可能取值得到第三个观测的概率;由此递推,直到得到在接前 T-1 个状态的可能初值得到前 T-1 个观测的概率的情况下,第 T 个状态可能取值得到第 T 个观测的概率,即为最终结果。(这里不太好描述,结合下面过程和例子会清晰些)

为了方便阐述,先进行一个概念--前向概率的定义。给定模型 \lambda ,定义到时刻 t 的部分观测序列为 o_{1},o_{2},...,o_{t} 且状态为 q_{i} 的概率为前向概率,用 alpha 表示(与状态转移分布的 a 相区分),记作:

注意以上的符号记法。结合前向概率记法,前向算法求解该观测序列出现概率过程如下:

1. 计算初值:

注意这里 i 代表可能得到的状态。对每一个初始的状态的概率(π_{i})乘以由该状态得到第一个观测的概率(b_{i}(o_{1}))得到第一个时刻该状态的前向概率,由于有 N 个状态取值,每个状态都可能生成观测,因此得计算 N 次。

2.递推,对 t=1,2,...,T-1

结合下图进行理解。这里注意的是t+1 时刻的某个状态的前向概率由 t 时刻的 N 个前向概率转移求和得出。又因为 t+1 时刻的状态取值可能有 N 个,因此想要从 t 时刻的所有前向概率得到 t+1 时刻的所有前向概率需要进行 N*N 次计算。

在 t 时刻 某个状态 j 的前向概率\alpha _{t}(j) 代表的是在前 t 个观测序列 o_{1},o_{2},...,o_{t} 的情况上,t 时刻的状态取值为 q_{j} 的概率。而乘积 \alpha _{t}(j)*a_{ji} 代表的是在 t 时刻的前 t 个观测 o_{1},o_{2},...,o_{t} ,t 时刻状态取值为 q_{j} 情况下,且 t+1 时刻状态转移为 q_{i} 的概率。将这些共 N 个乘积求和再乘以观测概率 b_{i}(o_{t+1}),就得到了 t+1 时刻,状态为 q_{i} 的前向概率。

3. 到达时刻 T ,将时刻 T 得到的各个状态的前向概率求和即得到观测序列 O 的概率为:

为了便于理解,我将前向算法计算流程标注如下所示:

每个时刻需要计算 N 个状态的前向概率。而某个时刻的某个状态的前向概率由上一个时刻的 N 个前向概率通过状态转移求和得到。而每个时刻的前向概率之和为该时刻条件下,观测序列出现的概率。因此,不难得到前向算法的复杂度为 O(TN^{2}) 阶。相比较直接计算法而言,由于当前时刻的计算利用的是上一个时刻的结果,不用考虑前面的全部时刻,因此避免了重复计算,减少计算量。

看个例子会更加清晰一些。同样考虑一个盒子和球的模型,状态集合 Q=\left \{ 1,2,3 \right \},观测集合 V=\left \{ RED,WHITE \right \}(红,白),模型如下所示:

假设要求解概率的观测集合为 O=\left \{ RED,WHITE,RED \right \}(红,白,红),下面利用前向算法计算观测集合出现的概率:

1. 计算初值:

2. 递归计算:

2.1 计算时刻 2 的前向概率:

            \small \alpha _{2}(1)=\left [ \sum_{i=1}^{3}\alpha _{1}(i)a_{i1}\right ]b_{1}(o_{2}) =(0.1*0.5+0.16*0.3+0.28*0.2)*0.5=0.077

            \small \alpha _{2}(2)=\left [ \sum_{i=1}^{3}\alpha _{1}(i)a_{i2}\right ]b_{2}(o_{2}) =(0.1*0.2+0.16*0.5+0.28*0.3)*0.6=0.1104

                        \small \alpha _{2}(3)=\left [ \sum_{i=1}^{3}\alpha _{1}(i)a_{i3}\right ]b_{3}(o_{2}) =(0.1*0.3+0.16*0.2+0.28*0.5)*0.7=0.0606

2.2 与时刻 2 计算过程相似,计算时刻 3 的前向概率:

            \small \alpha _{3}(1)=\left [ \sum_{i=1}^{3}\alpha _{2}(i)a_{i1}\right ]b_{1}(o_{3}) =0.04187

            \small \alpha _{3}(2)=\left [ \sum_{i=1}^{3}\alpha _{2}(i)a_{i2}\right ]b_{2}(o_{3}) =0.03551

            \small \alpha _{3}(3)=\left [ \sum_{i=1}^{3}\alpha _{2}(i)a_{i3}\right ]b_{3}(o_{3}) =0.05284

3. 计算观测序列概率:

2.3 后向算法

理解了前向算法,那么后向算法就很快了。前向算法由第一个时刻推向第 T 个时刻(最后一个时刻),那么后向算法的思路便是从第 T个时刻推向第一个时刻。

类似给出后向概率的定义:在时刻 t 状态为 \small q_{i} 的条件下,从 t+1 时刻到 T 的部分观测序列为 \small o_{t+1},o_{t+2},...,o(T) 的概率为后向概率,记作:

对最终时刻 T 的 N 个状态的后向概率都规定为 1。即:

那么后向算法计算过程如下:

1. 初始化最终时刻:

2. 对时刻 \small t=T-1,T-2,...,1 进行 递推:

3. 由初始状态概率分布和第一个时刻的后向概率的乘积之和,计算得到整个观测序列概率:

同样地,时刻 t 的后向概率由时刻 t+1 的 N 个状态的后向概率共同决定。

2.4 有用的计算公式

这一节,抛开计算观测序列概率问题。看一些有用的推导。理解这些推导对接下来很有帮助。

根据前向概率和后向概率,可以进行一些有用的计算。

1. 给定模型 \small \lambda 和观测 O,计算时刻 t 处于状态 \small q_{i} 的概率。

我们可将此概率记为如下形式:

由条件概率公式,可将上式写作如下形式:

由前向概率、后向概率定义可知:

那么直观上理解,在观察序列给定的条件下,在时刻 t 取某个状态的概率就等于在 t 时刻取该状态与在 t 时刻取所有状态的比值,即:

2. 给定模型和观测,计算时刻 t 处于状态 \small q_{i} 且在时刻 t+1 处于状态 \small q_{j} 的概率。

同样,在此概率记为如下形式:

利用前向、后向概率进行计算:

又因为:

因此,得到计算公式为:

如上所示,利用前向概率、后向概率可以帮助我们简化一些计算。

在此,第一个基本问题--概率计算问题的解决方案--前向-后向计算方法已经给出。接下来继续第二个问题--学习问题的叙述。


3 学习算法

机器学习算法中的学习算法常常也就是求参算法。隐马尔科夫模型的学习算法解决的是:在给定一个观测序列的 O 的情况下,求解模型三个参数:初始状态概率分布、状态转移分布和观测概率分布,使得该观测序列出现的概率最大。

具体可根据隐藏状态是否可知分为监督与非监督两种情况。

3.1 监督学习方法

在观察序列已知的情况下,如果还知道状态序列,那么解决这个问题就很简单了:根据最大似然估计,以每个参数出现的频率作为其概率的估计即可。因此,直接写出估计结果:

1. 转移概率 \small a_{ij} 的估计。其中 \small A_{ij} 代表从状态 i 转移到状态 j 的频数。

2. 观测概率 \small b_{j}(k) 的估计。同样,\small B_{j}(k) 代表从状态 j 得到观测 k 的频数。

3. 初始状态概率 π 的估计。直接统计样本中每个初始状态的频数即可。

3.2 Baum-Welch算法

当状态序列未知的时候,可采用Baum-Welch算法进行非监督参数估计。Baum-Welch算法其实即为EM算法。因为正好状态序列不能被知晓,是一个隐变量,那么用EM算法进行估计正好贴合。

可将此时的隐马尔科夫模型写作如下形式:

参数学习的过程如下所示:

1. 确定完全数据(观测序列 O 和隐含状态链 I)的对数似然函数

设将观测数据写作 \small O = (o_{1},o_{2},...,o_{T}),隐状态数据写作 \small I = (i_{1},i_{2},...,i_{T}),完全数据写作 \small (O,I) = (o_{1},o_{2},...,o_{T},i_{1},i_{2},...,i_{T})。完全数据的对数似然函数为 \small logP(O,I|\lambda )

2. EM算法的E-Step(求期望):求Q函数:\small Q(\lambda, \bar{\lambda })。其中\small \bar{\lambda }代表模型参数的当前估计值。我们知道Q函数为其余条件给定下,完全函数的对数似然函数对于隐变量条件概率的期望,即:

 根据条件概率,可将后面一项如此改写:

可以注意到在E-Step中参数的估计值是固定的,因此分母为一个常数,在接下来的极大化步骤中可以省略。因此,可将Q函数写作如下形式:

借助前向、后向概率有如下式子:

因此,可将Q函数写作如下形式:

为什么要做这些步骤将Q函数进行改写。我们可以发现有许多好吃的。最明显的一点便是将求和变得简单且将三个参数分离不同的三项之中。具体参见这篇博客:https://blog.csdn.net/xmu_jupiter/article/details/50965039,讲得很清楚。 

3. EM算法的M-Step(最大化期望):其实根据Q函数的最终写法,可以发现,已经将模型待求解的三个分别分离于三项之中,单独对于每项进行最大化(求偏导)便可得到最大化的结果了。由于过程较为繁琐,细节查询原书。下面直接给出求解结果。

注意上述结果采用2.4节有关的内容。可以回头重新查阅加深理解。

接下来讨论第三个问题-预测问题。


4 预测算法

预测问题也称为解码问题。即当给定模型 \small \lambda 和观测序列 O 的情况下,求解最有可能的状态序列。主要有两种解决思路:近似算法和 Viterbi 算法,下面将分别讨论。

4.1 近似算法

近似算法的思路较为简单:共有 T 个时刻状态需要求解,那么针对于每个时刻选取该时刻最有可能出现的状态。

根据 2.4节的内容,我们知道在某个时刻 t 处于某个状态 \small q_{i} 的概率为:

将该时刻所有可能状态的概率都求出来,选择一个概率最大的状态作为该时刻状态即可,即:

对于每个时刻都这样选取,最终得到一个状态链便是求解的结果,即:

这种思路简单且很实用,实际效果也不错,但是会存在一个问题,即虽然保证了每个状态是每个时刻最有可能出现的状态,但是不能保证最终得到的状态链是整体最有可能得到的状态链。举一个最简单的例子,第一个最优状态 \small i^{*}_{1} = q_{m},第二个最优状态 \small i^{*}_{2} = q_{n},那么如果 \small a_{mn}=0,即从状态 \small q_{m} 转移到状态 \small q_{n} 的概率为0,那么以上结果便是不正确的。因为每个最优状态都是单独求解的不考虑其他时刻状态,所以这便是近似算法的一个缺陷。

4.2 Viterbi算法

Viterbi 算法思想其实与Dijkstra算法思想是一样的:最优路径的子路径也应该为最优路径。从时刻 t=1 开始,递推地计算在时刻 t 状态为 i 的各条部分路径的最大概率,选取概率最大的状态的路径向前延伸,直到到达终点(时刻 t=T)。结合下面例子来说明 Viterbi 算法。

同样用一个盒子与球的模型,模型参数如下:

已知观测序列为 \small O=(R,W,R),求解最优的状态序列:

1.第一个时刻各个状态概率求解:

(1)初始状态为1且选择红球的概率:0.2*0.5=0.1。

(2)初始状态为2且选择红球的概率:0.4*0.4=0.16。

(3)初始状态为3且选择红球的概率:0.4*0.7=0.28。

2. 第二个时刻各个状态概率求解(在计算时,注意计算完全)

(1)由状态1转移为状态1且选取白球的概率:0.1*0.5*0.5=0.025。

(2)由状态2转移为状态1且选取白球的概率:0.16*0.3*0.5=0.024。

(3)由状态3转移为状态1且选取白球的概率:0.28*0.2*0.5=0.028。

因此,在时刻2处,状态1的概率为0.028,由上一个时刻状态3转移而来。

(4)由状态1转移为状态2且选取白球的概率:0.1*0.2*0.6=0.012。

(5)由状态2转移为状态2且选取白球的概率:0.16*0.5*0.6=0.048。

(6)由状态3转移为状态2且选取白球的概率:0.28*0.3*0.6=0.0504。

因此,在时刻2处,状态2的概率为0.0504,由上一个时刻状态3转移而来。

(7)由状态1转移为状态3且选取白球的概率:0.1*0.3*0.3=0.009。

(8)由状态2转移为状态3且选取白球的概率:0.16*0.2*0.3=0.0096。

(9)由状态3转移为状态3且选取白球的概率:0.28*0.5*0.3=0.042。

因此,在时刻2处,状态3的概率为0.0042,由上一个时刻状态3转移而来。

3. 第三个时刻各个状态概率求解:

(1)由状态1转移为状态1且选取红球的概率:0.028*0.5*0.5=0.007。

(2)由状态2转移为状态1且选取红球的概率:0.0504*0.3*0.5=0.0756。

(3)由状态3转移为状态1且选取红球的概率:0.042*0.2*0.5=0.0042。

因此,在时刻3处,状态1的概率为0.00756,由上一个时刻状态2转移而来。

(4)由状态1转移为状态2且选取红球的概率:0.028*0.2*0.4=0.00224。

(5)由状态2转移为状态2且选取红球的概率:0.0504*0.5*0.4=0.01008。

(6)由状态3转移为状态2且选取红球的概率:0.042*0.3*0.4=0.00504。

因此,在时刻3处,状态2的概率为0.01008,由上一个时刻状态2转移而来。

(7)由状态1转移为状态3且选取红球的概率:0.028*0.3*0.7=0.00588。

(8)由状态2转移为状态3且选取红球的概率:0.0504*0.2*0.7=0.007056。

(9)由状态3转移为状态3且选取红球的概率:0.042*0.5*0.7=0.0147。

因此,在时刻3处,状态3的概率为0.0147,由上一个时刻状态3转移而来。

由上述计算结果,绘制一张图状态概率图便于观察:

由图可知,在时刻 t=3 时,最大可能性的概率为0.0147,由此进行回溯,得到的最大可能性的路径为 \small I=(3,3,3)


5 小结

1.隐马尔科夫模型是针对于时序数据而建模,其认为显示的观测序列由隐藏的状态序列所影响,且隐藏着的状态序列为马尔科夫链。一个观测有且仅被一个隐藏的状态所决定。

2.一个隐马尔科夫模型 \small \lambda 可由三个要素决定:初始状态概率分布、状态转移概率、观测概率,可记为如下三元组表示形式:\small \lambda =(\pi ,A,B)

3.隐马尔科夫模型常用来解决三个问题:

(1)计算概率问题:给定模型,求解某个观测序列 O 出现概率----前向-后向算法。其中前向概率以及后向概率的计算在隐马尔科夫模型的推导中有着许多应用。

(2)学习问题:给定某个观测序列O,在 O 出现概率最大的情况下,求解模型参数----Baunm-Welch算法。

(3)预测问题:给定模型与某个观测序列,求解最有可能的隐藏状态链----近似算法与 Viterbi算法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值