隐形马尔可夫模型 Hidden Markov Model

作者:Yang Eninala
链接:https://www.zhihu.com/question/20962240/answer/33438846
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

隐马尔可夫(HMM)好讲,简单易懂不好讲。我认为

@者也
的回答没什么错误,不过我想说个更通俗易懂的例子。我希望我的读者不是专家,而是对这个问题感兴趣的入门者,所以我会多阐述数学思想,少写公式。霍金曾经说过,你多写一个公式,就会少一半的读者。所以时间简史这本关于物理的书和麦当娜关于性的书卖的一样好。我会效仿这一做法,写最通俗易懂的答案。

还是用最经典的例子,掷骰子。假设我手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

隐形马尔可夫模型 Hidden Markov Model_第1张图片

假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4

这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8

一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。


隐形马尔可夫模型 Hidden Markov Model_第2张图片
其实对于HMM来说,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的。但是应用HMM模型时候呢,往往是缺失了一部分信息的,有时候你知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子序列;有时候你只是看到了很多次掷骰子的结果,剩下的什么都不知道。如果应用算法去估计这些缺失的信息,就成了一个很重要的问题。这些算法我会在下面详细讲。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
如果你只想看一个简单易懂的例子,就不需要往下看了。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
说两句废话,答主认为呢,要了解一个算法,要做到以下两点:会其意,知其形。答主回答的,其实主要是第一点。但是这一点呢,恰恰是最重要,而且很多书上不会讲的。正如你在追一个姑娘,姑娘对你说“你什么都没做错!”你要是只看姑娘的表达形式呢,认为自己什么都没做错,显然就理解错了。你要理会姑娘的意思,“你赶紧给我道歉!”这样当你看到对应的表达形式呢,赶紧认错,跪地求饶就对了。数学也是一样,你要是不理解意思,光看公式,往往一头雾水。不过呢,数学的表达顶多也就是晦涩了点,姑娘的表达呢,有的时候就完全和本意相反。所以答主一直认为理解姑娘比理解数学难多了。

回到正题,和HMM模型相关的算法主要分为三类,分别解决三种问题:

1)知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。
这个问题呢,在语音识别领域呢,叫做解码问题。这个问题其实有两种解法,会给出两个不同的答案。每个答案都对,只不过这些答案的意义不一样。第一种解法求最大似然状态路径,说通俗点呢,就是我求一串骰子序列,这串骰子序列产生观测结果的概率最大。第二种解法呢,就不是求一组骰子序列了,而是求每次掷出的骰子分别是某种骰子的概率。比如说我看到结果后,我可以求得第一次掷骰子是D4的概率是0.5,D6的概率是0.3,D8的概率是0.2.第一种解法我会在下面说到,但是第二种解法我就不写在这里了,如果大家有兴趣,我们另开一个问题继续写吧。

2)还是知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。
看似这个问题意义不大,因为你掷出来的结果很多时候都对应了一个比较大的概率。问这个问题的目的呢,其实是检测观察到的结果和已知的模型是否吻合。如果很多次结果都对应了比较小的概率,那么就说明我们已知的模型很有可能是错的,有人偷偷把我们的骰子給换了。

3)知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。
这个问题很重要,因为这是最常见的情况。很多时候我们只有可见结果,不知道HMM模型里的参数,我们需要从可见结果估计出这些参数,这是建模的一个必要步骤。

问题阐述完了,下面就开始说解法。(0号问题在上面没有提,只是作为解决上述问题的一个辅助)

0.一个简单问题
其实这个问题实用价值不高。由于对下面较难的问题有帮助,所以先在这里提一下。

知道骰子有几种,每种骰子是什么,每次掷的都是什么骰子,根据掷骰子掷出的结果,求产生这个结果的概率。

隐形马尔可夫模型 Hidden Markov Model_第3张图片
解法无非就是概率相乘:

1.看见不可见的,破解骰子序列
这里我说的是第一种解法,解最大似然路径问题。
举例来说,我知道我有三个骰子,六面骰,四面骰,八面骰。我也知道我掷了十次的结果(1 6 3 5 2 7 3 5 2 4),我不知道每次用了那种骰子,我想知道最有可能的骰子序列。

其实最简单而暴力的方法就是穷举所有可能的骰子序列,然后依照第零个问题的解法把每个序列对应的概率算出来。然后我们从里面把对应最大概率的序列挑出来就行了。如果马尔可夫链不长,当然可行。如果长的话,穷举的数量太大,就很难完成了。

另外一种很有名的算法叫做Viterbi algorithm. 要理解这个算法,我们先看几个简单的列子。

首先,如果我们只掷一次骰子:


看到结果为1.对应的最大概率骰子序列就是D4,因为D4产生1的概率是1/4,高于1/6和1/8.

把这个情况拓展,我们掷两次骰子:

隐形马尔可夫模型 Hidden Markov Model_第4张图片
结果为1,6.这时问题变得复杂起来,我们要计算三个值,分别是第二个骰子是D6,D4,D8的最大概率。显然,要取到最大概率,第一个骰子必须为D4。这时,第二个骰子取到D6的最大概率是


同样的,我们可以计算第二个骰子是D4或D8时的最大概率。我们发现,第二个骰子取到D6的概率最大。而使这个概率最大时,第一个骰子为D4。所以最大概率骰子序列就是D4 D6。

继续拓展,我们掷三次骰子:

隐形马尔可夫模型 Hidden Markov Model_第5张图片
同样,我们计算第三个骰子分别是D6,D4,D8的最大概率。我们再次发现,要取到最大概率,第二个骰子必须为D6。这时,第三个骰子取到D4的最大概率是


同上,我们可以计算第三个骰子是D6或D8时的最大概率。我们发现,第三个骰子取到D4的概率最大。而使这个概率最大时,第二个骰子为D6,第一个骰子为D4。所以最大概率骰子序列就是D4 D6 D4。

写到这里,大家应该看出点规律了。既然掷骰子一二三次可以算,掷多少次都可以以此类推。我们发现,我们要求最大概率骰子序列时要做这么几件事情。首先,不管序列多长,要从序列长度为1算起,算序列长度为1时取到每个骰子的最大概率。然后,逐渐增加长度,每增加一次长度,重新算一遍在这个长度下最后一个位置取到每个骰子的最大概率。因为上一个长度下的取到每个骰子的最大概率都算过了,重新计算的话其实不难。当我们算到最后一位时,就知道最后一位是哪个骰子的概率最大了。然后,我们要把对应这个最大概率的序列从后往前推出来。

2.谁动了我的骰子?
比如说你怀疑自己的六面骰被赌场动过手脚了,有可能被换成另一种六面骰,这种六面骰掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。你怎么办么?答案很简单,算一算正常的三个骰子掷出一段序列的概率,再算一算不正常的六面骰和另外两个正常骰子掷出这段序列的概率。如果前者比后者小,你就要小心了。

比如说掷骰子的结果是:

隐形马尔可夫模型 Hidden Markov Model_第6张图片
要算用正常的三个骰子掷出这个结果的概率,其实就是将所有可能情况的概率进行加和计算。同样,简单而暴力的方法就是把穷举所有的骰子序列,还是计算每个骰子序列对应的概率,但是这回,我们不挑最大值了,而是把所有算出来的概率相加,得到的总概率就是我们要求的结果。这个方法依然不能应用于太长的骰子序列(马尔可夫链)。

我们会应用一个和前一个问题类似的解法,只不过前一个问题关心的是概率最大值,这个问题关心的是概率之和。解决这个问题的算法叫做前向算法(forward algorithm)。

首先,如果我们只掷一次骰子:


看到结果为1.产生这个结果的总概率可以按照如下计算,总概率为0.18:


把这个情况拓展,我们掷两次骰子:

隐形马尔可夫模型 Hidden Markov Model_第7张图片
看到结果为1,6.产生这个结果的总概率可以按照如下计算,总概率为0.05:

隐形马尔可夫模型 Hidden Markov Model_第8张图片

继续拓展,我们掷三次骰子:

隐形马尔可夫模型 Hidden Markov Model_第9张图片
看到结果为1,6,3.产生这个结果的总概率可以按照如下计算,总概率为0.03:

隐形马尔可夫模型 Hidden Markov Model_第10张图片

同样的,我们一步一步的算,有多长算多长,再长的马尔可夫链总能算出来的。用同样的方法,也可以算出不正常的六面骰和另外两个正常骰子掷出这段序列的概率,然后我们比较一下这两个概率大小,就能知道你的骰子是不是被人换了。

3.掷一串骰子出来,让我猜猜你是谁
(答主很懒,还没写,会写一下EM这个号称算法的方法)

上述算法呢,其实用到了递归,逆向推导,循环这些方法,我只不过用很直白的语言写出来了。如果你们去看专业书籍呢,会发现更加严谨和专业的描述。毕竟,我只做了会其意,要知其形,还是要看书的。


前导性推荐阅读资料:

  • 从朴素贝叶斯分类器到贝叶斯网络(上)
  • 从朴素贝叶斯分类器到贝叶斯网络(下)

欢迎关注白马负金羁的博客 http://blog.csdn.net/baimafujinji,为保证公式、图表得以正确显示,强烈建议你从该地址上查看原版博文。本博客主要关注方向包括:数字图像处理、算法设计与分析、数据结构、机器学习、数据挖掘、统计分析方法、自然语言处理。


引言

在之前介绍贝叶斯网络的博文中,我们已经讨论过概率图模型(PGM)的概念了。Russell等在文献【1】中指出:“在统计学中,图模型这个术语指包含贝叶斯网络在内的比较宽泛的一类数据结构。”

 维基百科中更准确地给出了PGM的定义:“A graphical model or probabilistic graphical model is a probabilistic model for which a graph expresses the conditional dependence structure between random variables. ” 如果你已经掌握了贝叶斯网络,那么你一定不会对PGM的概念感到陌生。本文将要向你介绍另外一种类型的PGM,即隐马尔可夫模型(HMM,Hidden Markov Model)。更准确地说,HMM是一种特殊的贝叶斯网络。


一些必备的数学知识

随机过程(Stochastic Process)是一连串随机事件动态关系的定量描述。如果用更为严谨的数学语言来描述,则有:设对每一个 tTX(t,w) 是一个随机变量,称随机变量族 XT={X(t,w),tT} 为一随机过程(或随机函数),其中 T 称为指标集, 是实数集。wΩΩ为样本空间。用映射来表示XT, 

X(t,w)T×Ω

即  X(,)  是定义在  T×Ω  上的二元单值函数。其中  T×Ω    表示  T  和  Ω  的笛卡尔积。

参数 tT    一般表示时间。当 T 取可列集时,通常称 XT 为随机序列。XT (tT)     可能取值的全体集合称为状态空间,状态空间中的元素称为状态。

马尔科夫过程(Markov Process)是本文中我们所要关注的一种随机过程。粗略地说,一个随机过程,若已知现在的 t 状态 Xt, 那么将来状态 Xu (u>t) 取值(或取某些状态)的概率与过去的状态 Xs (s>t) 取值无关;或者更简单地说,已知现在、将来与过去无关(条件独立),则称此过程为马尔科夫过程。

同样,我们给出一个精确的数学定义如下:若随机过程{Xt,tT}对任意 t1<t2<<tn<txi1in    及 A 是  的子集,总有 

P{XtA|Xt1=x1,Xt2=x2,,Xtn=xn}=P{XtA|Xtn=xn}

则称此过程为马尔科夫过程。称 P(s,x;t,A)=P{XtA|Xs=x}  s>t ,   为转移概率函数。 Xt  的全体取值构成集合  S  就是状态空间。对于马尔可夫过程  XT={Xt,tT} ,当 S={1,2,3,}    为可列无限集或有限集时,通常称为马尔科夫链(Markov Chain)。

从时间角度考虑不确定性

在前面给出的贝叶斯网络例子中,每一个随机变量都有唯一的一个固定取值。当我们观察到一个结果或状态时(例如Mary给你打电话),我们的任务是据此推断此时发生地震的概率有多大。而在此过程中,Mary是否给你打过电话这个状态并不会改变,而地震是否已经发生也不会改变。这就说明,我们其实是在一个静态的世界中来进行推理的。

但是我们现在要研究的HMM,其本质则是基于一种动态的情况来进行推理,或者说是根据历史来进行推理。假设要为一个高血压病人提供治疗方案,医生每天为他量一次血压,并根据这个血压的测量值调配用药的剂量。显然,一个人当前的血压情况是跟他过去一段时间里的身体情况、治疗方案,饮食起居等多种因素息息相关的,而当前的血压测量值相等于是对他当时身体情况的一个“估计”,而医生当天开具的处方应该是基于当前血压测量值及过往一段时间里病人的多种情况综合考虑后的结果。为了根据历史情况评价当前状态,并且预测治疗方案的结果,我们就必须对这些动态因素建立数学模型。

而隐马尔科夫模型就是解决这类问题时最常用的一种数学模型,简单来说,HMM是用单一离散随机变量描述过程状态的时序概率模型。HMM的基本模型可用下图来表示,其中涂有阴影的圆圈 yt2,yt1,yt 相当于是观测变量,空白圆圈 xt2,xt1,xt 相当于是隐变量。回到刚刚提及的高血压治疗的例子,你所观测到的状态(例如血压计的读数)相当于是对其真实状态(即病人的身体情况)的一种估计(因为观测的过程中必然存在噪声),用数学语言来表述就是P(yt|xt),这就是模型中的测量模型或测量概率(Measurement Probability)。另外一方面,当前的(真实)状态(即病人的实际身体状况)应该与其上一个观测状态相关,即存在这样的一个分布P(xt|xt1),这就是模型中的转移模型或转移概率(Transition Probability)。当然,HMM中隐变量必须都是离散的,观测变量并无特殊要求。 


隐形马尔可夫模型 Hidden Markov Model_第11张图片 

注意这里我们其实使用了马尔科夫假设:即当前状态只依赖于过去的有限的已出现的历史。我们前面所采用的描述是:“已知现在的  t  状态  Xt , 那么将来状态  Xu(u>t)  取值(或取某些状态)的概率与过去的状态  Xs(s>t)

 取值无关”。两种表述略有差异,但显然本质上是一致的。而且更准确的说,在HMM中,我们认为当前状态紧跟上一个时刻的状态有关,即前面所谓的“有限的已出现的历史”就是指上一个状态。用数学语言来表述就是 

P(xt|xt1,xt2,,x1)=P(xt|xt1)

如果读者已经阅读过本文最开始列出的两篇文章,那么你应该已经意识到,这其实是PGM三种基本的结构单元中的最后一种情况,即条件独立型的结构单元。

再结合HMM的基本图模型(即上图),我们就会得出HMM模型中的两个重要概率的表达式:

  • 离散的转移概率(Transition Probability)“ 
    P(xt|xt1,xt2,,x1,y1,,yt1)=P(xt|xt1)
  • 连续(或离散)的测量概率(Measurement Probability) 
    P(yt|xt,xt1,,x1,y1,,yt1)=P(yt|xt)

一个简单的例子

现在我们已经了解了HMM的基本结构,接下来不妨通过一个实际的例子来考察一下,HMM的转移概率和测量概率到底是什么样的。下图给出了一个用于表示股市动态的概率图模型,更具体的说这是一个马尔科夫模型(Markov Model),因为该图并未涉及隐状态信息。根据之前(以贝叶斯网络为例的)PGM学习,读者应该可以看懂改图所要展示的信息。例如,标记为 1 的圆圈表示的是当前股市正处于牛市,由此出发引出一条指向自身,权值为0.6的箭头,这表示股市(下一时刻)继续为牛市的概率为0.6;由标记为 1 的圆圈引出的一条指向标记为 2 的圆圈的箭头,其权值为0.2,这表示股市(下一时刻)转入熊市的概率是0.2;最后,由标记为 1 的圆圈引出的一条指向标记为 3 的圆圈的箭头,其权值为0.2,这表示股市(下一时刻)保持不变的概率是0.2。显然,从同一状态引出的所有概率之和必须等于1。 


隐形马尔可夫模型 Hidden Markov Model_第12张图片 

所以马尔科夫模型中的各个箭头代表的就是状态之间相互转化的概率。而且,通常我们会把马尔科夫模型中所有的转移概率写成一个矩阵的形式,例如针对本题而已,则有 

隐形马尔可夫模型 Hidden Markov Model_第13张图片


如果马尔科夫模型中有 k 个状态,那么对应的状态转移矩阵的大小就是 k×k    。其中第 m 行,第 n 列所给出的值就是 P(xt=n|xt1=m)。也就给定状态 m 的情况下,下一时刻转换到状态 n 的概率。例如,第2行,第1列的值为 0.5,它的意思就是如果当前状态是标记为 2 的圆圈(熊市),那么下一时刻转向标记为 1 的圆圈(牛市)的概率是 0.5。而且,矩阵中,每一行的所有值之和必须等于1。

至此,我们已经知道可以用一个矩阵 A 来代表 P(xt|xt1),那又该如何表示 P(yt|xt) 呢?当然,由于P(yt|xt)   可能是连续的,也可能是离散的,所以不能一言以蔽之。为了简化,我们当前先仅考虑离散的情况。当引入 P(yt|xt)   之后,我们才真正得到了一个隐马尔科夫模型,上面我们所说的标记为1、2 和 3 的(分别代表牛市、熊市和平稳)三个状态现在就变成了隐状态。当隐状态给定后,股市的表现可能有 l=3 种情况,即当前股市只能处于“上涨”,“下跌”,或者“不变”三种状态之一。完整的HMM如下图所示。 


隐形马尔可夫模型 Hidden Markov Model_第14张图片 

易知,(当测量概率是离散的情况下),HMM中的P(yt|xt) 也可以用一个矩阵 B 来表示。并且B 的大小是 k×l。对于当前这个例子而言,我们有 

隐形马尔可夫模型 Hidden Markov Model_第15张图片

其中第 1 行,第 1 列,就表示  P(yt=1 | xt=1)  ,也就是我们已知当前正处于牛市,股票上升的概率为0.7; 同理,第 1 行,第 2 列,就表示  P(yt=2 | xt=1)  ,也就是我们已知当前正处于牛市,股票下跌的概率为0.1。

再次强调,只有当测量概率是离散的情况下,我们才能用一个矩阵来表示P(yt|xt) 。对于连续的情况,比如我们认为观测变量的取值符合高斯分布,也即是概率 P(yt|xt) 的分布符合高斯分布,那么应该有多少个高斯分布呢?显然有多少个隐状态(例如 k 个),就应该有多少个高斯分布。那么矩阵 B 就应该变成了由 k 个高斯分布的参数,即 σ1,μ1,σ2,μ2,,σk,μk,组成的一个集合。

之前的文章里我们谈过,人类学习的任务是从资料中获得知识,而机器学习的任务是让计算机从数据中获得模型。那模型又是什么呢?回想一下机器学习中比较基础的线性回归模型 y=iwixi,我们最终是希望计算机能够从已有的数据中或者一组最合适的参数 wi,因为一旦 wi 被确定,那么线性回归的模型也就确定了。同样,面对HMM,我们最终的目的也是要获得能够用来确定(数学)模型的各个参数。通过前面的讨论,我们也知道了定义一个HMM,应该包括矩阵 A 和 矩阵 B (如果测量概率是离散情况的话),那只有这些参数能够足以定义个HMM呢?

要回答这个问题,我们不妨来思考一下这样一个问题。假如我们现在已经得到了 矩阵 A 和 矩阵 B ,那么我们能否求出下面这个序列的概率 P(y1=,y2=,y3=)

。注意对于这样一个序列,我们并不知道隐状态的情况,所以采用贝叶斯网络中曾经用过的方法,设法把隐状态加进去,在通过积分的方法将未知的隐状态积分积掉。于是有

隐形马尔可夫模型 Hidden Markov Model_第16张图片

这里就可以运用马尔科夫假设进行简化,所以上式就变成了 

隐形马尔可夫模型 Hidden Markov Model_第17张图片

到这里,我们就很容易发现,上面这个式子中,还有一个未知量,那就是PGM的初始状态,我们将其记为  π  。

于是我们知道,要确定一个HMM模型,我们需要知道三个参数,我们将其记作 λ(A, B, π)

在后续的文章中我们会进一步探讨,如何让机器能够自己学到上面这些参数,以及HMM的具体应用。


参考文献

[1] Stuart Russell and Peter Norvig. Artificial Intelligence: A Modern Approach. 3rd Edition.

[2] 徐伟,赵选民,师义民,秦超英,概率论与数理统计(第2版),西北工业大学出版社

[3] 同时推荐悉尼科大徐亦达博士的机器学习公开课中关于HMM的部分

[4] 关于HMM在NLP中的应用,可以参考Speech and Language Processing. Daniel Jurafsky & James H. Martin, 3rd. Chapter 6



你可能感兴趣的:(自然语言处理)