人工智能AI面试题-6.6如何通俗理解隐马尔可夫模型HMM?
6.6 如何通俗理解隐马尔可夫模型HMM? 隐⻢马尔可夫模型(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。 假设我们开始掷骰⼦子,我们先从三个骰⼦子⾥里挑⼀一个,挑到每⼀一个骰⼦子的概率都是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。 其实对于HMM来说,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可⻅见状态之间的输出概率,做模拟是相当容易的。但是应⽤用HMM模型时候呢,往往是缺失了⼀一部分信息的,有时候你知道骰⼦子有⼏几种,每种骰⼦子是什么,但是不知道掷出来的骰⼦子序列;有时候你只是看到了很多次掷骰⼦子的结果,剩下的什么都不知道。如果应⽤用算法去估计这些缺失的信息,就成了⼀一个很重要的问题 。这些算法我会在下⾯面详细讲。 回到正题,和HMM模型相关的算法主要分为三类,分别解决三种问题: 1) 知道骰⼦子有⼏几种(隐含状态数量),每种骰⼦子是什么(转换概率),根据掷骰⼦子掷出的结果(可⻅见状态链),我想知道每次掷出来的都是哪种骰⼦子(隐含状态链)。这个问题呢,在语⾳音识别领域呢,叫做解码问题。这个问题其实有两种解法,会给出两个不同的答案。每个答案都对,只不过这些答案的意义不一样。 第⼀一种解法求最⼤大似然状态路路径,说通俗点呢,就是我求⼀一个骰⼦子序列,这串骰⼦子序列产⽣生观测结果的概率最⼤大。 第⼆二种解法呢,就不是求⼀一个组骰⼦子序列了,⽽是求每次掷出的骰⼦子分别是某种骰⼦子的概率。⽐比如说我看到结果后,我可以求得第⼀一个掷骰⼦子是D4的概率是0.5,D6的概率是0.3,D8的概率是0.2。 第⼀一种解法我会在下⾯面说到,但是第⼆二种解法我就不写在这⾥里了,如果⼤大家有兴趣,我们另开⼀一个问 题继续写吧。 2) 还是知道骰⼦子有⼏几种(隐含状态数量),每种骰⼦子是什么(转换概率),根据掷骰⼦子掷出的结果(可⻅见状态链),我想知道掷出这个结果的概率。看似这个问题意义不高,因为你掷出来的结果很多时候都对应了⼀一个⽐比较⼤大的概率。问这个问题的⽬目的呢,其实是检测观察到的结果和已知的模型是否吻合。如果很多次结果都对应了⽐比较⼩小的概率,那么就说明我们已知的模型很有可能是错的,有⼈人偷偷把我们的骰⼦子給换了。 3) 知道骰⼦子有⼏几种(隐含状态数量),不知道每种骰⼦子是什么(转换概率),观测到很多次掷骰⼦子的结果(可⻅见状态链),我想反推出每种骰⼦子是什么(转换概率)。这个问题很重要,因为这是最常⻅见的情况。很多时候我们只有可⻅见结果,不知道HMM模型⾥里的参数,我们需要从可⻅见结果估计出这些参数,这是建模的⼀一个必要步骤。 问题阐述完了,下⾯面就开始说解法。(0号问题在上⾯面没有提,只是作为解决上述问题的⼀一个辅助) 0.⼀一个简单问题 其实这个问题实⽤用价值不⾼高。由于对下⾯面较难的问题有帮助,所以先在这⾥里提⼀一下。 知道骰⼦子有⼏几种,每种骰⼦子是什么,每次掷的都是什么骰⼦子,根据掷骰⼦子掷出的结果,求产⽣生这个结 果的概率。 解法⽆无⾮非就是概率相乘: 1.看见不可见的,破解骰⼦序列 这⾥里我说的是第⼀一种解法,解最⼤大似然路路径问题。 举例⼀一来说,我知道我有三个骰⼦,六⾯面骰,四⾯面骰,⼋八⾯面骰。我也知道我掷了⼗次的结果(1 6 3 5 2 7 3 5 2 4),我不知道每次⽤用了那种骰⼦,我想知道最有可能的骰⼦序列。 其实最简单⽽而暴⨆⼒力力的⽅方法就是穷举所有可能的骰⼦序列,然后依照第零个问题的解法把每个序列对应的概率算出来。然后我们从⾥里里把对应最⼤大概率的序列挑出来就⾏行行了了。如果⻢马尔可夫链不⾼长,当然可⾏行行。如果⾼长的话,穷举的数量太⼤大,就很难完成了了。 另外⼀一种 很有名的算法叫做Viterbi algorithm. 要理理解这个算法,我们先看⼏几个简单的列列⼦子。 ⾸首先,如果我们只掷⼀次骰⼦子: 看见结果为1.对应的最⼤大概率骰⼦子序列就是D4,因为D4产⽣生1的概率是1/4,⾼高于1/6和1/8. 把这个情况拓展,我们掷两次骰⼦子: 结果为1,6.这时问题变得复杂起来,我们要计算三个值,分别是第⼆个骰⼦子是D6,D4,D8的最⼤大概率。显然,要取到最⼤大概率,第⼀一个骰⼦子必须为D4。这时,第⼆个骰⼦子取到D6的最⼤大概率是 同上,我们可以计算第三个骰⼦子是D6或D8时的最⼤大概率。我们发现,第三个骰⼦子取到D4的概率最 ⼤大。⽽使这个概率最⼤大时,第⼆个骰⼦子为D6,第⼀一个骰⼦子为D4。所以最⼤大概率骰⼦子序列就是D4 D6 D4。 写到这⾥里,⼤大家应该看出点规律了了。既然掷骰⼦子⼀一⼆三次可以算,掷多少次都可以以此类推。我们发现,我们要求最⼤大概率骰⼦子序列时要做这么⼏几件事情。⾸首先,不管序列⻓长度多少,要从序列⻓长度为1算起, 算序列⻓长度为1时取到每个骰⼦子的最⼤大概率。然后,逐渐增加⻓长度,每增加⻓长度,重新算⼀一遍在这 个⻓长度下最后⼀一个位置取到每个骰⼦子的最⼤大概率。因为上⼀一个⻓长度下的取到每个骰⼦子的最⼤大概率都算过了了,重新计算的话其实不难。当我们算到最后⼀一位时,就知道最后⼀一位是哪个骰⼦子的概率最⼤大了了。 然后,我们要把对应这个最⼤大概率的序列从后往前推出来。