隐马尔可夫模型及其典型应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
隐马尔可夫模型及其典型应⽤
【原】隐马尔可夫模型及其典型应⽤
----by stackupdown ⽬录
前⾔
本⽂要介绍的是隐马尔可夫模型及其应⽤。
我们从⼀个史学家开始,假设他在看某国的史料时,⾟⾟苦苦地统计了上下数年,发现了粮⾷的增长和下降的⼀段,他会结合历史去分析⼀些问题。
但是如果史书的其他记载得太少,他就找不到问题的所在,所以⽆从下⼿。
⼜⽐如,⼀个⼈出去旅⾏,相信民间的传说,海藻的湿度跟未来的天⽓有关,未来不同天⽓,海藻的湿度不⼀样,但是海藻有⼀定概率是错的。
尽管如此,他还是想要根据这个来估计明天天⽓的可能性[1]。
这两个问题是跟时间相关的问题,有些这样的问题是解决不了的,有些则不然,我们在接下来的⽂章⾥会讲到相关问题的数学抽象和解决⽅法。
正⽂
⼀、随机过程
我们在⾃然世界中会遇到各种不确定的过程,它们的发⽣是不确定的,这种过程称为随机过程。
像花粉的布朗运动、股票市值、天⽓变化都是随机过程[2]。
马尔科夫随机过程是⼀类随机过程。
它的原始模型马尔可夫链,由俄国数学家A.A.马尔可夫于1907年提出。
该过程有以下的性质:指定⼀个时间点,则未来时间的状态只与现在有关,跟它的过去没有关系。
在现实⽣活中的马尔科夫过程是我们⼈为抽象进⾏简化的,如果我们认为⼀个事物的未来跟过去的变化没有太⼤关系,那么我们就可以把它抽象成马尔科夫过程[2]。
⽐如我们的天⽓,很不严谨地说,可以抽象成马尔科夫过程,从今天晴天转移到明天多云、下⾬的转移只取决于今天的天⽓,⽽跟前天的天⽓⽆关。
如下图,这样我们按照概率的知识就可以得到今天下⾬,明天放晴的概率:
P(明天晴|今天⾬)=0.4
这就当做是我们最简单的⼀个模型了[3]。
马尔科夫过程的假设很简单,就是概率不依赖于之前的序列,写成公式:
就好像⼀条鱼不知道⾃⼰之前的运动轨迹,只知道⾃⼰在哪⾥,接着它就会按照现在的位置随机选择⼀个⽅向去游动了。
鱼的前前后后的运动形成了⼀条链。
在⼀个马尔科夫模型中,我们可以利⽤它来计算概率,⽽且由于它是单个状态的转移,我们看起来它就像是⼀条链⼀样,状态从头到尾移动。
跟时间有关的序列往往可以抽象成马尔科夫过程,像浏览⽹页这种简单的⾏为乃⾄写诗、谱曲这种复杂过程都可以⽤马尔科夫过程分析。
⼆、隐马尔科夫模型的假设
马尔科夫模型可以⽤来抽象⼀些问题,但是更多的情况下我们不能直接看到⼀些想要的序列,只能间接地通过其他序列来反推结果,这就是⼀类隐随机过程。
类似地,我们有隐马尔科夫模型(Hidden Markov Model, HMM) 。
它是由学者Baum和其他⼈在60年代提出来的。
我们不能这么随意地把将隐随机过程等同为隐马尔科夫。
为了实⽤性⽽提出的隐马尔科夫模型,必须满⾜如下的假设:
隐变量的状态转移概率必须是固定的,这样才有⼀个确定的概率转移矩阵。
即使我们知道某个过程没有固定的状态转移概率,我们也可以把它看作⼀个近似。
从隐变量H到观测变量W的概率必须是确定的,也就是说P(W=b|H=a)是⼀个固定值,这样我们才能⽤到后⾯的各个算法。
缺少以上两点假设,会让实际中因为⽆法确定转移概率⽽⽆法计算序列的概率,或者根据观察序列⽆法得到可能的状态转移概率(因为⼀直在变化)。
注意到概率的已知和未知,我们要解决以下的问题。
三、隐马尔科夫模型的三个基本问题:
1.解码问题
在⼀个HMM模型⾥,假设我们已经观察到了⼀个序列O,⽽且我们有模型的参数:转移概率矩阵M,表现概率矩阵P,从观察到的序列O⾥可以看到各个状态,我们想知道最有可能的隐藏状态序列。
解决这个问题要⽤到Viterbi算法, 它由安德鲁·维特⽐在1967年提出。
我们把这个问题通俗地讲⼀遍。
⽐如你今天在⼀个地⽅见到了扎克伯格,⽐如在⼀家酒吧好了,你想知道他今天的⼼情是郁闷还是开⼼。
当然我们不管他看起来是开⼼还是郁闷还是⼀般,反正我们知道在他⼼情为i的时候来酒吧的概率是P(i,1),去公园的时候是P(i,2), 去公司的概率是P(i,3)。
以此类推。
我们在5天⾥看到了他的序列:酒吧->酒吧->公园->公园->公司,我们希望知道他这五天⾥的⼼情是什么样的。
在这个问题下,转移概率和表现概率必须是清楚的。
为了解决这个问题,我们假设概率转移矩阵如下:
表现矩阵(事实上叫做混淆矩阵)如下:
但是我们还没有确定初始的各个概率π,
那么就这样P(good) = 0.5, P(bad) = 0.2, P(normal) = 0.3,
即π = (0.5, 0.3, 0.2)
现在我们可以根据序列求他的⼼情了。
我们⽤H i表⽰第i+1天扎克伯格的⼼情(i从0开始计数), P表⽰产⽣序列的概率;
第⼀天: 酒吧: P=P(bar|H0)*P(H0), H0最可能是bad,因为概率是0.6*0.2 = 0.12, 在三种⼼情⾥可能性最⼤。
第⼆天:酒吧->酒吧要计算这个序列的概率,序列的概率为:
P = P(H0)*P(bar|H0) * P(H1|H0) * P(bar|H1),
我们看到必须确认H0和H1,以使得该概率最⼤,但是这样是不是就说明第⼀天得到的H0的结果没⽤了呢?
并不是。
我们⽤Pr(t, H k)表⽰在序列的概率,这个序列就是时刻t的序列,H k代表不同的⼼情。
我们可以看到,当t-1的取各个可能的值H t-1,得到概率Pr(t-1,H t-1),意味着Pr(t-1)各个取值已经计算过,这时Pr(t)的结果⼀定可以⽤到Pr(t-1)的计算结果,这样以后都不⽤每次都计算之前的序列概率了。
⽐如,我们可以得到Pr(t, H t)=Pr(t-1,H t-1)*P(H t|H t-1)*P(O t|H t),我们只需要依次计算后⾯跟H t相关的结果,就可以得到最好的概率了。
这⾥t=1, O t为bar,可以求P=Pr(0,H0)*P(H1|H0)*P(bar|H1),只需求最后两项和各个H0取值下P(H0)*P(bar|H0)的相乘结果, 得到H1=bad, P = 0.2 * 0.6 * 0.375 * 0.6为最⼤。
依次类推,我们就可以得到最终最可能的隐藏序列H0,H1,...。
这就是我们解决的问题。
以上我们⽤到的算法叫做Viterbi算法,虽然最初是为了解决信道通信的问题,但是它在语⾳识别中也是⾮常经典和重要的⼀个算法[1]。
2.评估问题
由扎克伯格的例⼦我们已经想到了⼀个问题,假如我们没有见到扎克伯格,我也不知道他想⼲什么,但是我突然很闲,想先去⼀下酒吧,然后去⼀下公园云云,最后看看我这个活动轨迹跟扎克伯格⼀样的概率是多少,要怎么办?
事实上这个问题⽐上个问题简单⼀些,⽽且它⼀般并不是⽤来看你跟名⼈的相似度的。
严谨地说,我们知道了⼀个模型的参数,想要知道⼀个已知序列出现的概率。
这可以⽤来判断模型是否出错,⽐如跟实际产⽣的序列频率相差太⼤,或者实际中出现了什么异常,⽐如某个⼈在赌场⾥偷换了骰⼦,出⽼千等等。
解决这个问题可以⽤穷举的⽅法。
说⽩了,我们不需要知道最可能的隐藏序列,但是要把可能产⽣该序列的所有情况的概率加起来得到结果。
当然了,这种⽅法在计算上是⾏不通的,因为它⽤的是简单的穷举⽅法,计算时间呈指数增长。
我们在计算概率的时候有很多是重复计算的,通过合理的⽅法可以⼤量地减少计算时间,解决这个问题采⽤的是前向算法[1]。
我们分两步,第⼀步是计算:
这⾥S是H0的可能状态。
第⼆步:
我们计算第t步(t>1)的总概率怎么算呢?事实是现在的前⾯的序列为
o0o1o2...o t-1,我们⽤Pr(t, x)表⽰最⼤标号为t⽽且实际状态为x的序列的概率, 则从Pr(t-1,i)到Pr(t, j),我们⽤求和的公式可以得到
为什么公式是这样的?
因为前⼀个序列发⽣的概率,我们的第t个状态只取决于前⼀个状态t-1,但是第t-1个状态不确定, 所以要计算:单个隐藏状态下的序列概率X 隐藏状态转移概率X表现概率,再把所有状态下的概率都加起来。
每⼀次迭代的时候我们要计算所有状态j下的)并且把结果写下来(在计算机⾥是保存下来,这样到下⼀步才能⽤来计算,最后得到最终的概率。
当然,最后⼀步我们求出所有状态j的概率后需要将它们求和。
得到概率之后,你就可以⽤它来判断数据的观察序列出现的概率,如果数据够多,你可以推测这个序列是否正常,并且进⾏进⼀步的研究。
3.学习问题
隐马尔科夫模型的三个基本问题中,第三个HMM参数学习的问题是最难的。
参数学习是通过推导和计算得到模型参数的近似值。
在HMM 模型⾥,参数由{π,M,P}组成,其中π是初始的状态概率,M,P是我们在1中讲到的两个概率矩阵。
我们之前知道转移概率,表现概率(混淆矩阵),但是现在没有了,这也是事实上现实中遇到的最多的问题。
我们需要直接通过观察序列来得到模型的参数,来使得P(O|λ)最⼤。
P(O|)这个概率看起来有点抽象,但是其实就是我们之前求过的,整个序列的出现概率。
注意我们需要根据序列O1O2...O t寻找所有的M,P;模型中隐藏变量的种类是清楚的。
对于给定的观察序列O,没有⼀种⽅法可以精确地找到⼀组隐马尔科夫模型参数使概率P(O|λ)最⼤。
因⽽,学者们退⽽求其次。
不能使P(O|λ)全局最优,就寻求使其局部最优的解决⽅法,⽽前向-后向算法(⼜称之为Baum-Welch算法)就成了隐马尔科夫模型学习问题的⼀种替代(近似)解决⽅法[4]。
Baum-Welch算法本质上是EM算法的⼀个特例。
不妨说⼀下EM算法,它是通过迭代修改模型参数,来得到近似的最优解,尽管它不能保证得到全局的参数最优[5]。
所谓迭代修改,可以近似理解成,我们先把现在的结果当成事实模型,⽤来看它的效果,如果有误差,通过⼀个⽅法修改参数,再把参数代⼊原模型。
如此往复,直到参数最后接近不变(收敛)[5]。
我们在这⾥不做详细的推导,⼀⽅⾯也是因为它的理解有些困难。
假设在我们的模型⾥,观察序列下标为0~T, 状态的所有下标为1到N。
简单来说:这个算法设计了⼏个变量,最基础的两个是⼀个前向变量,⼀个后向变量。
计算序列为O0O1...O t、t时刻状态为i的序列概率;⽽计算序列O t+1O t+2...O T在t时刻状态为i的序列概率。
我们之前在前向算法中其实就⽤到了。
.
接着,算法设计了另外两个变量,
这两个参数在模型中可以更新模型的参数,反过来⼜被影响产⽣变化,这样就可以进⾏迭代、更新参数了。
要解释这个⽅法的有效性,应该需要⽤到更多的数学理论。
四、隐马尔科夫模型应⽤举例
1.⾃然语⾔处理
隐马尔科夫模型本来就是为了处理语⾳和语⾔问题,所以我们先看⼀下语⾳问题中⽤到这个模型的地⽅。
语⾳识别
语⾳识别我们现在知道的不少了,对普通的⼤众来说,语⾳识别是最直接接触到⼈⼯智能的领域之⼀。
从⼿机软件的语⾳拨号,到科⼤讯飞的语⾳识别系统,再到苹果助理Siri,对话机器⼈,都或多或少地⽤到了语⾳识别的功能。
语⾳识别并没有想象的那么容易,它会遇到很多问题。
事实上它不是⼀个简单的对录下来的声⾳进⾏分析的过程,单单是声⾳信号的保存就要⽤到很多的数学处理。
我们保存的声⾳信号是⽐特的数字信号。
信号有波形,有频率,它的形状保存下来变成了振幅和频率的数字信号。
第⼀种想法,我们可以⽤⽤波形匹配字符吗?这种想法是因为波形相似,则发⾳是⼀样的。
不过同⼀个发⾳,实际字符经常是不同的,同⼀个字符也可能发⾳不准确。
尽管如此,我们还是考虑到语⾳识别中的两个序列了,⼀个是字符序列,⼀个是我们的声⾳序列,从声⾳序列分析得到字符序列我们就可以进⾏后续的句⼦含义分析了。
这就是第⼆种想法。
根据我们之前的介绍,隐马尔可夫模型是可以分析观察序列得到隐含序列的。
但是单纯地使⽤马尔科夫模型是不对的,我们并不知道马尔科夫模型⾥的概率,也即⼀个声⾳怎么就对应到汉字"西湖",怎么就对应到英⽂"Moon River"了。
应对这个问题,学者们不打算⽤⼀蹴⽽就的⽅法,能够根据⼀个简单的概率估计就算出四海皆准的概率表,⽽是通过⼤量的数据进⾏统计并且通过其他⽅法修正。
这种数据的⽅法体现的是⼀种经验法则,但是在实际应⽤中有它的⽤武之地。
因此,我们⽤马尔科夫模型进⾏语⾳识别之前,要使⽤字符串-语⾳对应的数据库,在对模型进⾏训练之后才将其应⽤到识别之中。
实际的学术界中,通常把通过数据进⾏模型参数修正的⽅法称为训练。
数据库从哪⼉来?在《数学之美》中讲到了这件事,语⾔学家马库斯认识到建⽴标准语料库(corpus)对语⾔研究的重要性。
建⽴语料库,可以类似这样:从《华尔街⽇报》中选取⼀些真实的英语语句,进⾏词性标注,再加⼊语法树构建。
有了⽂字语料库,还可以继续添加语⾳,机器翻译的语料库,供世界上的学者研究[6]。
在隐马尔科夫模型中,我们提到了三种概率的参数,⽽获得概率的⽅法当然不是全靠猜的,这⾥⾯要⽤到⼀些概率估计的⽅法。
在上世纪90年代,其核⼼框架就是⽤隐马尔科模型对语⾳的时序进⾏建模,⽽⽤⾼斯混合模型(GMM)对语⾳的概率进⾏建模。
⽽在2006年著名学者⾟顿提出深度神经⽹络(DNN)的模型之后,⼈们普遍采⽤了DNN来替换GMM,以提⾼模型的效果[7]。
语⾳处理过程[7]
其他语⾔处理问题
在⽂本的处理中给词语进⾏词性标注、命名实体(⼈名、地名、机构名)的标注,这个可以⽤来给计算机对输⼊语句的含义分析,从⽽可以让电脑拥有更加智能的表现,⽐如对话系统或者问答系统的实现。
同样地,这些问题也是可以由隐马尔科夫模型参与解决的。
还有⼀些打字软件为了追求好的效果也会⽤到隐马尔可夫模型。
2.蛋⽩质序列观测
序列分析
⽣物中⽤到⼤量数据的地⽅有很多,因此也就有了⽣物信息学。
对于蛋⽩质的功能研究来说,⽣物信息是结合得很紧密的。
在⽬前的⽣物信息学研究中,我们根据蛋⽩质序列得到的不仅仅是蛋⽩质的结构,⽽且还跟遗传学的亲源关系,蛋⽩质功能的研究有很⼤的关系。
如果你学过⽣物学,那么你应该知道⽣物的⼤分⼦蛋⽩质是由⼀些更⼩的分⼦合成的,氨基酸的组成成分和顺序是合成⼤分⼦蛋⽩质的必要条件。
当然除此之外还有空间结构问题,⼀个相同序列的蛋⽩质可能有完全不同的性质,原因就是它的空间结构不⼀样。
蛋⽩质有空间结构,还分成⾄少三级的空间结构(可能有四级)[8],低级的通过折叠形成⾼级的结构。
因此,根据蛋⽩质的序列研究并不是理所当然的。
蛋⽩质的四级结构[9]
蛋⽩质数据库
蛋⽩质的氨基酸序列是⼀个观测序列,对于不同的蛋⽩质来说,它的产⽣概率显然不是固定的。
在⽣物学内部,对蛋⽩质会有⼀个标准的蛋⽩质表⽰⽅法,也就是⽤⼀个氨基酸序列来表⽰它。
场景应⽤
我们设想两个场景。
场景⼀,⼀个⽣物系的教授现在有了⼀种蛋⽩酶的样本,他通过各种⼿段得到了蛋⽩质的序列,但是想知道它的结构长得什么样。
⾄于为什么要看它的结构,⽣物知识告诉我们,酶是⼀种受体,它作⽤的物质跟它的结构⼀般要能"互补"。
利⽤隐马尔科夫模型在数据集上训练得到的结果,我们可以预测该蛋⽩质的结构。
场景⼆,医⽣发现,在⼀个病⼈体内产⽣很多不常见的蛋⽩质,他猜测是因为某些未知的病理导致蛋⽩质发⽣异常,但是他没办法猜测蛋⽩质的种类,看到空间结构也没⽤。
于是他把问题交给研究员。
研究员利⽤数据库多次对⽐,查到了跟它相似的⼀些蛋⽩质,并且知道了它的可能病变过程。
这就是蛋⽩质序列的两个应⽤HMM的场景:结构预测和多序列结构对⽐[10]。
有些⼈可能还会想到⽤HMM来进⾏新药的研制。
具体的应⽤可能是多种多样,但是不管怎样,我们应该也没办法⽤HMM造出⼀只恐龙的所有蛋⽩。
其他⽣物信息问题
除了蛋⽩质,还有DNA、RNA可以分析。
⽽且并不像表⾯上看的那样简单,DNA、RNA由于突变的问题跟蛋⽩质有⼀定的区别。
3.其他⽅⾯的应⽤
量化交易
⼀部分⾦融界的⼈会采⽤HMM辅助预测量化交易的趋势,当然,他们⽤到的HMM往往复杂度并不在问题的抽象,⽽在数学处理上,⽤到的模型还经常混合了其他的模型。
⼈脸识别、⼿势识别
在计算机视觉中当然也可以⽤到HMM, ⽐如⼀张⼈脸照⽚让你识别它的表情,⼀个⼿势的动作让你识别它的含义等等,这些也都是被称作模式识别的⼀些应⽤。
结语
我们通过扎克伯格介绍了隐马尔科夫模型的基本问题,举了⼏个简单的例⼦并且讲解了隐马尔科夫模型的应⽤,了解到该模型的强⼤。
⽤这个模型作为近似,能帮我们有效地解决⼀些问题,⽽且如果在未来使⽤语⾳识别系统的时候,也不要忘了有HMM的功劳。
当然这不意味着隐马尔科夫模型是万能的。
每个模型只是⼀些现象的抽象,要解决问题还是得具体问题具体分析。
由于问题的多种多样,有时候问题本⾝就⽐模型有趣得多。
参考⽂献
[1] 隐马尔可夫模型(HMM)攻略
[2]关于马尔科夫随机场MRF 的思考
[3] 如何⽤简单易懂的例⼦解释隐马尔可夫模型?
[4] HMM学习最佳范例七:前向-后向算法4
[5] HMM进阶(6)——Baum-Welch算法
[6] 吴军.数学之美[M]北京:⼈民邮电出版社,2012:198,199
[7] 语⾳识别系统及科⼤讯飞最新实践
[8] Protein primary structure
[9] ⼘东波,陈翔,王志勇.蛋⽩质结构预测⽅法综述
[10]崔岩, 黄积涛. 蛋⽩质拓扑结构Alignment与相似性打分的算法[J]. 天津理⼯⼤学学报, 2000, 16(2):35-39.。