如何用簡單易懂的例子解釋隱馬爾可夫模型?

姓名:張藝倫 ? ?學(xué)號:17011210282

轉(zhuǎn)載自:https://www.zhihu.com/question/20962240/answer/33438846,有刪節(jié)

【嵌牛導(dǎo)讀】:隱馬爾可夫(HMM)好講,簡單易懂不好講。霍金曾經(jīng)說過,你多寫一個公式,就會少一半的讀者。我會效仿這一做法,寫最通俗易懂的答案。

【嵌牛鼻子】:隱馬爾科夫模型,簡單,例子。

【嵌牛提問】:怎么看待國家人工智能發(fā)展規(guī)劃?人工智能未來前景如何?

【嵌牛正文】:

還是用最經(jīng)典的例子,擲骰子。假設(shè)我手里有三個不同的骰子。第一個骰子是我們平常見的骰子(稱這個骰子為D6),6個面,每個面(1,2,3,4,5,6)出現(xiàn)的概率是1/6。第二個骰子是個四面體(稱這個骰子為D4),每個面(1,2,3,4)出現(xiàn)的概率是1/4。第三個骰子有八個面(稱這個骰子為D8),每個面(1,2,3,4,5,6,7,8)出現(xiàn)的概率是1/8。

假設(shè)我們開始擲骰子,我們先從三個骰子里挑一個,挑到每一個骰子的概率都是1/3。然后我們擲骰子,得到一個數(shù)字,1,2,3,4,5,6,7,8中的一個。不停的重復(fù)上述過程,我們會得到一串?dāng)?shù)字,每個數(shù)字都是1,2,3,4,5,6,7,8中的一個。例如我們可能得到這么一串?dāng)?shù)字(擲骰子10次):1 6 3 5 2 7 3 5 2 4

這串?dāng)?shù)字叫做可見狀態(tài)鏈。但是在隱馬爾可夫模型中,我們不僅僅有這么一串可見狀態(tài)鏈,還有一串隱含狀態(tài)鏈。在這個例子里,這串隱含狀態(tài)鏈就是你用的骰子的序列。比如,隱含狀態(tài)鏈有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8

一般來說,HMM中說到的馬爾可夫鏈其實是指隱含狀態(tài)鏈,因為隱含狀態(tài)(骰子)之間存在轉(zhuǎn)換概率(transition probability)。在我們這個例子里,D6的下一個狀態(tài)是D4,D6,D8的概率都是1/3。D4,D8的下一個狀態(tài)是D4,D6,D8的轉(zhuǎn)換概率也都一樣是1/3。這樣設(shè)定是為了最開始容易說清楚,但是我們其實是可以隨意設(shè)定轉(zhuǎn)換概率的。比如,我們可以這樣定義,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。這樣就是一個新的HMM。

同樣的,盡管可見狀態(tài)之間沒有轉(zhuǎn)換概率,但是隱含狀態(tài)和可見狀態(tài)之間有一個概率叫做輸出概率(emission probability)。就我們的例子來說,六面骰(D6)產(chǎn)生1的輸出概率是1/6。產(chǎn)生2,3,4,5,6的概率也都是1/6。我們同樣可以對輸出概率進行其他定義。比如,我有一個被賭場動過手腳的六面骰子,擲出來是1的概率更大,是1/2,擲出來是2,3,4,5,6的概率是1/10。


其實對于HMM來說,如果提前知道所有隱含狀態(tài)之間的轉(zhuǎn)換概率和所有隱含狀態(tài)到所有可見狀態(tài)之間的輸出概率,做模擬是相當(dāng)容易的。但是應(yīng)用HMM模型時候呢,往往是缺失了一部分信息的,有時候你知道骰子有幾種,每種骰子是什么,但是不知道擲出來的骰子序列;有時候你只是看到了很多次擲骰子的結(jié)果,剩下的什么都不知道。如果應(yīng)用算法去估計這些缺失的信息,就成了一個很重要的問題。這些算法我會在下面詳細講。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

如果你只想看一個簡單易懂的例子,就不需要往下看了。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

說兩句廢話,答主認為呢,要了解一個算法,要做到以下兩點:會其意,知其形。答主回答的,其實主要是第一點。但是這一點呢,恰恰是最重要,而且很多書上不會講的。正如你在追一個姑娘,姑娘對你說“你什么都沒做錯!”你要是只看姑娘的表達形式呢,認為自己什么都沒做錯,顯然就理解錯了。你要理會姑娘的意思,“你趕緊給我道歉!”這樣當(dāng)你看到對應(yīng)的表達形式呢,趕緊認錯,跪地求饒就對了。數(shù)學(xué)也是一樣,你要是不理解意思,光看公式,往往一頭霧水。不過呢,數(shù)學(xué)的表達頂多也就是晦澀了點,姑娘的表達呢,有的時候就完全和本意相反。所以答主一直認為理解姑娘比理解數(shù)學(xué)難多了。

回到正題,和HMM模型相關(guān)的算法主要分為三類,分別解決三種問題:

1)知道骰子有幾種(隱含狀態(tài)數(shù)量),每種骰子是什么(轉(zhuǎn)換概率),根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈),我想知道每次擲出來的都是哪種骰子(隱含狀態(tài)鏈)。

這個問題呢,在語音識別領(lǐng)域呢,叫做解碼問題。這個問題其實有兩種解法,會給出兩個不同的答案。每個答案都對,只不過這些答案的意義不一樣。第一種解法求最大似然狀態(tài)路徑,說通俗點呢,就是我求一串骰子序列,這串骰子序列產(chǎn)生觀測結(jié)果的概率最大。第二種解法呢,就不是求一組骰子序列了,而是求每次擲出的骰子分別是某種骰子的概率。比如說我看到結(jié)果后,我可以求得第一次擲骰子是D4的概率是0.5,D6的概率是0.3,D8的概率是0.2.第一種解法我會在下面說到,但是第二種解法我就不寫在這里了,如果大家有興趣,我們另開一個問題繼續(xù)寫吧。

2)還是知道骰子有幾種(隱含狀態(tài)數(shù)量),每種骰子是什么(轉(zhuǎn)換概率),根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈),我想知道擲出這個結(jié)果的概率。

看似這個問題意義不大,因為你擲出來的結(jié)果很多時候都對應(yīng)了一個比較大的概率。問這個問題的目的呢,其實是檢測觀察到的結(jié)果和已知的模型是否吻合。如果很多次結(jié)果都對應(yīng)了比較小的概率,那么就說明我們已知的模型很有可能是錯的,有人偷偷把我們的骰子給換了。

3)知道骰子有幾種(隱含狀態(tài)數(shù)量),不知道每種骰子是什么(轉(zhuǎn)換概率),觀測到很多次擲骰子的結(jié)果(可見狀態(tài)鏈),我想反推出每種骰子是什么(轉(zhuǎn)換概率)。

這個問題很重要,因為這是最常見的情況。很多時候我們只有可見結(jié)果,不知道HMM模型里的參數(shù),我們需要從可見結(jié)果估計出這些參數(shù),這是建模的一個必要步驟。

問題闡述完了,下面就開始說解法。(0號問題在上面沒有提,只是作為解決上述問題的一個輔助)

0.一個簡單問題

其實這個問題實用價值不高。由于對下面較難的問題有幫助,所以先在這里提一下。

知道骰子有幾種,每種骰子是什么,每次擲的都是什么骰子,根據(jù)擲骰子擲出的結(jié)果,求產(chǎn)生這個結(jié)果的概率。


解法無非就是概率相乘:解法無非就是概率相乘。

1.看見不可見的,破解骰子序列

這里我說的是第一種解法,解最大似然路徑問題。

舉例來說,我知道我有三個骰子,六面骰,四面骰,八面骰。我也知道我擲了十次的結(jié)果(1 6 3 5 2 7 3 5 2 4),我不知道每次用了那種骰子,我想知道最有可能的骰子序列。

其實最簡單而暴力的方法就是窮舉所有可能的骰子序列,然后依照第零個問題的解法把每個序列對應(yīng)的概率算出來。然后我們從里面把對應(yīng)最大概率的序列挑出來就行了。如果馬爾可夫鏈不長,當(dāng)然可行。如果長的話,窮舉的數(shù)量太大,就很難完成了。

另外一種很有名的算法叫做Viterbi algorithm. 要理解這個算法,我們先看幾個簡單的列子。

首先,如果我們只擲一次骰子:

看到結(jié)果為1.對應(yīng)的最大概率骰子序列就是D4,因為D4產(chǎn)生1的概率是1/4,高于1/6和1/8.

把這個情況拓展,我們擲兩次骰子:

結(jié)果為1,6.這時問題變得復(fù)雜起來,我們要計算三個值,分別是第二個骰子是D6,D4,D8的最大概率。顯然,要取到最大概率,第一個骰子必須為D4。這時,第二個骰子取到D6的最大概率是

同樣的,我們可以計算第二個骰子是D4或D8時的最大概率。我們發(fā)現(xiàn),第二個骰子取到D6的概率最大。而使這個概率最大時,第一個骰子為D4。所以最大概率骰子序列就是D4 D6。

繼續(xù)拓展,我們擲三次骰子:

同樣,我們計算第三個骰子分別是D6,D4,D8的最大概率。我們再次發(fā)現(xiàn),要取到最大概率,第二個骰子必須為D6。這時,第三個骰子取到D4的最大概率是

同上,我們可以計算第三個骰子是D6或D8時的最大概率。我們發(fā)現(xiàn),第三個骰子取到D4的概率最大。而使這個概率最大時,第二個骰子為D6,第一個骰子為D4。所以最大概率骰子序列就是D4 D6 D4。

寫到這里,大家應(yīng)該看出點規(guī)律了。既然擲骰子一二三次可以算,擲多少次都可以以此類推。我們發(fā)現(xiàn),我們要求最大概率骰子序列時要做這么幾件事情。首先,不管序列多長,要從序列長度為1算起,算序列長度為1時取到每個骰子的最大概率。然后,逐漸增加長度,每增加一次長度,重新算一遍在這個長度下最后一個位置取到每個骰子的最大概率。因為上一個長度下的取到每個骰子的最大概率都算過了,重新計算的話其實不難。當(dāng)我們算到最后一位時,就知道最后一位是哪個骰子的概率最大了。然后,我們要把對應(yīng)這個最大概率的序列從后往前推出來。

2.誰動了我的骰子?

比如說你懷疑自己的六面骰被賭場動過手腳了,有可能被換成另一種六面骰,這種六面骰擲出來是1的概率更大,是1/2,擲出來是2,3,4,5,6的概率是1/10。你怎么辦么?答案很簡單,算一算正常的三個骰子擲出一段序列的概率,再算一算不正常的六面骰和另外兩個正常骰子擲出這段序列的概率。如果前者比后者小,你就要小心了。

比如說擲骰子的結(jié)果是:

要算用正常的三個骰子擲出這個結(jié)果的概率,其實就是將所有可能情況的概率進行加和計算。同樣,簡單而暴力的方法就是把窮舉所有的骰子序列,還是計算每個骰子序列對應(yīng)的概率,但是這回,我們不挑最大值了,而是把所有算出來的概率相加,得到的總概率就是我們要求的結(jié)果。這個方法依然不能應(yīng)用于太長的骰子序列(馬爾可夫鏈)。

我們會應(yīng)用一個和前一個問題類似的解法,只不過前一個問題關(guān)心的是概率最大值,這個問題關(guān)心的是概率之和。解決這個問題的算法叫做前向算法(forward algorithm)。

首先,如果我們只擲一次骰子:

看到結(jié)果為1.產(chǎn)生這個結(jié)果的總概率可以按照如下計算,總概率為0.18:

把這個情況拓展,我們擲兩次骰子:

看到結(jié)果為1,6.產(chǎn)生這個結(jié)果的總概率可以按照如下計算,總概率為0.05:

繼續(xù)拓展,我們擲三次骰子:

看到結(jié)果為1,6,3.產(chǎn)生這個結(jié)果的總概率可以按照如下計算,總概率為0.03:


3.擲一串骰子出來,讓我猜猜你是誰

上述算法呢,其實用到了遞歸,逆向推導(dǎo),循環(huán)這些方法,我只不過用很直白的語言寫出來了。如果你們?nèi)タ磳I(yè)書籍呢,會發(fā)現(xiàn)更加嚴(yán)謹(jǐn)和專業(yè)的描述。畢竟,我只做了會其意,要知其形,還是要看書的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容