隐马尔科夫模型

讲这种东西就得先搞清 HMM 到底干了什么,初学者很容易对 “ 模型在干嘛 ” 这个问题上犯晕。我个人特别讨厌跟初学者上来就讲 state space/transition matrix/emission probability 云云的讲法 ( 注:比如《统计学习方法》李航博士那种讲法。虽然用来准备面试很方便,但初学者肯定会被符号和几个概念绕晕了;另外,私以为他换掉符号和前人文献不保持一致的做法又会让初学者又多了一道坎去翻。总之,不太厚道 )。因为初学时,对大多非理科出身的人而言,用抽象的名词与符号描述的 “ 语言系统 ” 还没固化在脑袋里。用抽象符号在那儿讲就好比 “ 一群人还没学会走,就逼着他们快点跑 ”。这是不太现实的。

综上,用复杂抽象的语言描述不合适的,这个学习曲线过于陡峭,别人需要时间消化。基于此原因,我发现,对零基础小伙伴们用游戏的例子去类比地解释往往比较容易降低学习难度,比如这样讲 :

我是一战士,修炼出了三种战斗形态,分别为暴怒态,正常状态和防御态。同时我也会三个被动技能,分别是普通平 A,爆击 ( 攻击伤害翻倍 ),吸血 ( 生命汲取 )。我在暴怒状态下打出暴击的概率是 80%, 打出吸血概率为 5%;在平衡形态下,打出暴击的比率为 30%,打出吸血的概率是 20%;在防御形态下,暴击成功概率为 5%,吸血概率为 60%。总结一下,战士在不同状态下能打出技能的概率不一样。

本来,战士这个职业在暴怒态时,身边会有一圈红光环;防御态时,会有一圈蓝光环。但是,现在我正在玩游戏,游戏突然出了个 bug:有个傻 x 程序员改了游戏的代码,他给写崩了,从此战士身边光环都看不见了。那我没法通过看脚下的光环知道战士在爆什么状态了。

话说,现在问题来了:由于看不到脚下光环,我只能估计 “ 战士 ” 在爆什么状态;但我现在打一 boss,砍 10 次,发现 8 次都是暴击,血哗哗地翻倍在掉,你觉得我这战士最可能是爆了什么状态?

( 每次用这个不规范的例子和新手讲,他们立刻就懂了;而且他们接下来还会问:"’ 暴怒状态 ’ 不能总持续吧?这不科学,应该限定个一段时间后,暴怒状态消失的概率为 50%...." 你瞧瞧连状态转换的 transition prob 自己都能假设出来了,都会抢答了都 lol...“HMM 的在干什么 ” 的问题很容易地让他们就理解了 )

综上,一个战士的状态会不断随时间变化;然后他的被动技能发动概率会因为所处不同状态而不同。这就是 HMM 想表达的东西。并且我们还可以通过它回答一些有趣的问题:通过战士发动的技能来推测战士所出的状态。

这个例子只是个感性认识,它其实只是告诉了我们 hmm 比较 “ 像什么东西 ”。显然,我们还需要更规范更严谨地去介绍什么是 HMM,去规范化这个模型。这个例子里的 “ 战士 ” 可以换成其它答案里的天气,换成硬币等等。但无论用什么说法,我们已经能通过这个例子抓住核心问题了:HMM 模型就是这样一个系统 —— 它有一个能不断改变的隐藏的状态(在这个例子里就是战士爆的状态。它会变,而且由于一个码农的缘故,状态变得不可见)在持续地影响它的外在表现(在这个例子里就是战士打出的技能是暴击、平 a、还是吸血的概率)。再重复一遍:HMM 模型就是这样一个系统 —— 它有一个会随时间改变的隐藏的状态,在持续地影响它的外在表现。

现在我们再继续规范一下这个例子,让它更贴近那种严谨描述。因为我们知道战士打人总爆击,角色特别 bug,这没法玩啊。所以我们要限制一下战士爆状态。我们在游戏里做了个限制:我们设定,战士一开始进入游戏世界时是正常状态的。而且,每过一段时间(比如 1 分钟),战士就会自动爆一次状态。最后,每一次爆发还和上一次状态爆的状态是什么有关: 1. 上一次如果是正常状态,那下次变为暴怒的概率比较大。下次转换成暴怒状态,平衡状态或防御状态的概率我们假设分别为 60%,30%,10% 。这保证了战士职业下次能有较大的概率能打出暴击! 2. 同理,若当我们上次在暴怒态时,下次继续保持暴怒态的概率就得限制一下。下次继续保持暴怒的概率就设为 10%,而转换成正常状态的概率是 60%,转换成防御态的概率是 30%; 3. 如果上次是防御态,那么我们也让它下次也尽量变正常。(不然总吸血啊)那他下次转成其它三态的概率 ( 三态和以上对应书写顺序一致 ) 分别为为 10%,60 , 30%。这样服务器就能限制战士的爆暴怒态的次数,让它不那么 imba。

顺便提一下,其实以上的这种限定 —— 让战士下一次爆不同状态的概率只和上次处在什么状态有关系 —— 叫马尔可夫性质(markov property )。经过这样的设定后,不仅仅战士这个职业不会那么 imba,而且,我们可以靠以上这些数字来计算之前只能感性理解的问题了。比如:我这个战士在第一分钟的时候是正常状态,那么我第二分钟赶去死亡谷打一个 boss 能暴击的概率是多少?(这个当作思考题,提示:想想两个问题,上一状态和下一状态间转换的概率是多少?不同状态下发不同技能的概率是多少?)

最后总结一下。以上例子中讲明了 HMM 的五样 “ 要素 ”: 1. 状态和状态间转换的概率 2. 不同状态下,有着不同的外在表现的概率。 3. 最开始设置的初始状态 4. 能转换的所有状态的集合 5. 能观察到外在表现的结合

Hidden 说明的是状态的不可见性;Markov 说明的是状态和状态间是 markov chain。这就是为什么叫 Hidden Markov Model。

我相信你们再去看其它答案里写的就明白多了。

ps: 懂了是什么之后再去看 paper 就好多了。没记错的话去,看《A tutorial on Hidden Markov Models and selected applications in Speech recognition 》。另外,HMM 除了上文提到的 “ 五要素 ”,还有 “ 三个基本问题 ”。这文章将 hmm 的三个基本问题讲得很清楚。