这篇要讨论的可不是哲学议题,而是希望以一个“数学工具”的角度来看隐马可夫模型(Hidden Markov Model, HMM)是什么,它的背后假设、长处与限制,以理解这样的工具可以拿来做什么用,而不是只与特定的应用绑在一起。
隐马可夫模型?隐藏的马可夫模型?
隐马可夫模型是机器学习(Machine Learning)领域中常常用到的理论模型,从语音识别(Speech Recognition)、手势辨识(gesture recognition),到生物信息学(Bioinformatics)里的种种应用,都可以见到这个工具的身影。
既然名字里有“马可夫”,想当然,这又是一个马可夫模型(Markov model)的延伸。马可夫模型所描述的,是一连串事件接续发生的机率:
马可夫链,通俗地说,就是同类型的事件(不同的状态)依序发生的机率,举例来说,假设天气有三种状态:晴天、阴天跟雨天。如果昨天是雨天,那么今天是雨天的机率,会跟昨天是晴天而今天是雨天的机率有所不同,这是因为我们相信天气现象在时间上有某种连续性,前面发生的状态会影响到后面发生的状态,而马可夫模型就是描述这种前后关系的数学语言。
而隐马可夫模型,顾名思义的,就是有什么东西“隐藏”起来了。我们沿用之前天气的例子,假设我因为脚受伤,必须住在一个房间里,看不到外面的天气(这听起来不太合理,但是大家理解意思就好),但是我可以看到我隔壁房间的室友每天从事的运动:跑步、健身操或是游泳三者之一。
如果把室友每天从事的运动项目记录下来,就是他“运动”这个事件的马可夫链,这是我可以观察的到的现象。然后,我又依照过去的经验,知悉在每种天气状况下,他从事各项运动的机率,那么我是不是可以透过我的观察和知识,去推测每天的天气?
在这个例子里,有两个事件的序列:一个是我观察得到的,室友每天所从事的运动项目;另一个是我看不到的,也就是对我来说是隐藏的,外面每天的天气。由于我知悉这两个马可夫链之间的关系,所以我便可以由其中一个马可夫链的状态,去预测另一个马可夫链的状态。而隐马可夫模型,便是描述这样的两个序列的关系的统计模型。
简单的说,隐马可夫模型提供了一套数学的理论以及工具,让我们可以利用看得到的连续现象去探究、预测另一个看不到的连续现象。
当然,这里的看不到并不表示真的无从观察,以前面所举的例子来说,我在脚没受伤的时候,还是可以到外面去观察天气的,只是在某个特定的条件之下,天气对我来说被隐藏起来了。
柏拉图的洞穴预言(Allegory of Cave),讲的是“我们看到的世界”跟“真实的世界”的关系,恰好可以用来比喻一下隐马可夫模型的作用。
语音识别离不开隐马可夫模型
我们还可以进一步用语音识别当做例子,来说明HMM的用处。
在语言学上,我们可以把人说话发出的声音分成各种音节(syllable),所以理论上,我们如果有一段录音,只要能分辨每一个音节发的音是哪些元音与子音,就能够把这个人讲的话辨识成文字。
任何理论上可行的事情,必然伴随着实务上的困难。这种音节对应的工作看似容易,但是实际上会遇到很多模棱两可的情况。以中文为例,两个三声的字连着念,前面的会读成二声,加上同音字、破声字,同字的语音与读音…等等,都增加了分辨过程的难度。
那么,HMM 是怎么跑进来的呢?试想,语音是一连串的音节,而我们想要辨识成的文字,则是一连串的字;对语音识别系统而言,语音这个音节序列是看得到的讯号,而系统想要做的是推测出与其相对应的,看不到的文字序列,所以正好是 HMM 所模拟的状况。
隐马可夫模型在语音识别的的应用,大抵始于1970年代晚期的 IBM 计划(Jelinek),时至今日,我们生活中可以看到的各种语音识别系统,例如Apple 的siri,Google的voice search,微软前不久在北京展示的中英同步口译,背后都是以HMM作为基础技术。
隐马可夫模型:生物信息学、股票价格预测都有应用
生物信息学(bioinformatics)是另一个大量使用到 HMM 的领域,从DNA 序列的比对到演化历程的推论,只要是跟基因序列有关的,几乎都看得到 HMM 的应用。以DNA定序为例,一段采集到的DNA序列,包含了外显子(exon)和内隐子(intron)两种段落,两者在细胞复制上有不同的功能,但都是由众多的基因(gene,有A、T、C、G 4种)排列成的序列,因此在一串看得到的基因序列中,要如何标记出哪一段是外显子,哪一段又是内隐子,这些看不到的段落,也是HMM可以发挥作用之处。简单的说,外显子和内隐子各自包含 A、T、C、G基因的比例不同,于是我们可以利用 HMM 相关的算法,找出哪一个基因是外显子和内隐子的起点或终点。
现实中,股票的价格变化也是一个序列,这是另一个充满经济诱因的预测目标,想当然耳的,也有不少人把 HMM 运用在预测股价的状态上,不过文献就不如前述两个领域那么丰富了。
隐马可夫模型当然也有它使用上的限制。例如,观测与模拟的现象必须是序列(或者该说是马可夫链),两个序列之间的关系要够明确等等,否则很容易就变成用十字螺丝起子去转六角螺丝:或许可以运作,但是结果不尽然是原本想要的。
如果有这样的数学工具,你会想要用来预测什么看不到的现象呢?