人工智能AI面試題-6.6如何通俗理解隱馬爾可夫模型HMM?
6.6 如何通俗理解隱馬爾可夫模型HMM? 隱?馬爾可夫模型(HMM)好講,簡單易懂不好講。我認為 ?? 這個回答沒什么錯誤,不過我想說個更通俗易懂的例子。我希望我的讀者不是專家,而是對這個問題感興趣的入門者,所以我會多闡述數(shù)學思想,少寫公式。霍?金曾經(jīng)說過,你多寫?一個公式,就會少?一半的讀者。所以時間簡史這本關(guān)于物理的書和?麥當娜關(guān)于性的書賣的?一樣好。我會效仿這?一做法,寫最通俗易懂的答案。 ?? 還是用最經(jīng)典的例子,擲骰?子。假設我手里有三個不同的骰?子。 第?一個骰?子是我們平常?見的骰?子(稱這個骰?子為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。 假設我們開始擲骰?子,我們先從三個骰?子?里挑?一個,挑到每?一個骰?子的概率都是1/3。然后我們擲骰?子,得到?一個數(shù)字,1,2,3,4,5,6,7,8中的?一個。不停的重復上述過程,我們會得到?一串數(shù)字,每個數(shù)字都是1,2,3,4,5,6,7,8中的?一個。例如我們可能得到這么?一串數(shù)字(擲骰?子10次):1 6 3 5 2 7 3 5 2 4 這串數(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。這樣設定是為了最開始容易說清楚,但是我們其實是可以隨意設定轉(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)之間的輸出概率,做模擬是相當容易的。但是應?用HMM模型時候呢,往往是缺失了?一部分信息的,有時候你知道骰?子有?幾種,每種骰?子是什么,但是不知道擲出來的骰?子序列;有時候你只是看到了很多次擲骰?子的結(jié)果,剩下的什么都不知道。如果應?用算法去估計這些缺失的信息,就成了?一個很重要的問題 。這些算法我會在下?面詳細講。 回到正題,和HMM模型相關(guān)的算法主要分為三類,分別解決三種問題: 1) 知道骰?子有?幾種(隱含狀態(tài)數(shù)量),每種骰?子是什么(轉(zhuǎn)換概率),根據(jù)擲骰?子擲出的結(jié)果(可?見狀態(tài)鏈),我想知道每次擲出來的都是哪種骰?子(隱含狀態(tài)鏈)。這個問題呢,在語?音識別領域呢,叫做解碼問題。這個問題其實有兩種解法,會給出兩個不同的答案。每個答案都對,只不過這些答案的意義不一樣。 第?一種解法求最?大似然狀態(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é)果很多時候都對應了?一個?比較?大的概率。問這個問題的?目的呢,其實是檢測觀察到的結(jié)果和已知的模型是否吻合。如果很多次結(jié)果都對應了?比較?小的概率,那么就說明我們已知的模型很有可能是錯的,有?人偷偷把我們的骰?子給換了。 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),我不知道每次?用了那種骰?,我想知道最有可能的骰?序列。 其實最簡單?而暴??力力的?方法就是窮舉所有可能的骰?序列,然后依照第零個問題的解法把每個序列對應的概率算出來。然后我們從?里里把對應最?大概率的序列挑出來就?行行了了。如果?馬爾可夫鏈不?長,當然可?行行。如果?長的話,窮舉的數(shù)量太?大,就很難完成了了。 另外?一種 很有名的算法叫做Viterbi algorithm. 要理理解這個算法,我們先看?幾個簡單的列列?子。 ?首先,如果我們只擲?次骰?子: 看見結(jié)果為1.對應的最?大概率骰?子序列就是D4,因為D4產(chǎn)?生1的概率是1/4,?高于1/6和1/8.??把這個情況拓展,我們擲兩次骰?子: 結(jié)果為1,6.這時問題變得復雜起來,我們要計算三個值,分別是第?個骰?子是D6,D4,D8的最?大概率。顯然,要取到最?大概率,第?一個骰?子必須為D4。這時,第?個骰?子取到D6的最?大概率是 同上,我們可以計算第三個骰?子是D6或D8時的最?大概率。我們發(fā)現(xiàn),第三個骰?子取到D4的概率最 ?大。?使這個概率最?大時,第?個骰?子為D6,第?一個骰?子為D4。所以最?大概率骰?子序列就是D4 D6 D4。 寫到這?里,?大家應該看出點規(guī)律了了。既然擲骰?子?一?三次可以算,擲多少次都可以以此類推。我們發(fā)現(xiàn),我們要求最?大概率骰?子序列時要做這么?幾件事情。?首先,不管序列?長度多少,要從序列?長度為1算起, 算序列?長度為1時取到每個骰?子的最?大概率。然后,逐漸增加?長度,每增加?長度,重新算?一遍在這???個?長度下最后?一個位置取到每個骰?子的最?大概率。因為上?一個?長度下的取到每個骰?子的最?大概率都算過了了,重新計算的話其實不難。當我們算到最后?一位時,就知道最后?一位是哪個骰?子的概率最?大了了。 然后,我們要把對應這個最?大概率的序列從后往前推出來。