高冷貴族: 隱馬爾可夫模型
引言
大家都用過Siri,Cortana之類的語音助手吧? 當你對着手機說出'我的女朋友溫柔嗎?',Siri 或Cortana就會根據你說的這句話翻譯成一段文字,然后再作應答. 先不管應答部分, 你可曾想過: Siri是如何將你說的話翻譯成一段文字的?嗯,猜對了, 這里就用到了隱馬爾可夫模型(Hiden Markov Model, HMM).
例子
假設你有三個女朋友(嘿~,現實不可以,想想總可以吧~,/躲拖鞋…), 你每周末只能選擇陪其中一位(為了世界和平…). 而作為程序員的你,也沒有什么情調,只會與女朋友做二種事情: 吃飯,看電影, 而因為工作繁忙,你每周也只能做其中一件事,三位美麗的女士也很理解,體諒你,也都很配合,很高興.
那么問題來了, 你是如何選擇周末去陪哪個女朋友呢? 三位女士都很可愛,你不想冷落每一個人,但第一個女朋友(記為A女朋友)有點聒噪,因此你會稍微少去一點她那里. 第二,第三個女朋友去都比較安靜(分別記為B,C). 於是,你在心里默默地(或者是潛意識地)定下了去陪三位女朋友的概率:
女朋友 | A | B | C |
---|---|---|---|
概率 | 0.2 | 0.4 | 0.4 |
比如,陪A女朋友的概率是0.2,可簡單的理解為十次大約有二次會去陪她. 然而這只是你剛開始考慮的事,因為當你周末陪女朋友結束之后,你會根據本次的約會體驗選擇下一周要陪伴的女朋友.之前初始的'選擇'概率就不再起作用了.
那約會結束后你是如何選擇下一周的女士呢? 因為三位女士的性格比較穩定,因此每次的體驗都會差不多,於是你的內心又有了一個下周去哪個女朋友的概率了:
本周陪伴\下周陪伴 | A | B | C |
---|---|---|---|
A | 0.5 | 0.2 | 0.3 |
B | 0.3 | 0.5 | 0.2 |
C | 0.2 | 0.3 | 0.5 |
什么意思呢? 比如你本周陪伴A了,那下周你繼續陪A的概率是0.5, 而下周去陪B的概率則為0.2, 而去陪伴C的為0.3.
還沒完~, 因為每個女朋友的喜好不一樣,因此你們在一起做的事也不一樣: A比較隨意,吃飯,看電影都可沒,沒差; B比較文藝,則喜歡看電影會稍微多一些; C 則是個吃貨,比較喜歡吃飯,但也會看電影.於是,你的心里又有譜了:
女朋友 | 吃飯 | 看電影 |
---|---|---|
A | 0.5 | 0.5 |
B | 0.4 | 0.6 |
C | 0.7 | 0.3 |
也就是說,比如對於C來說, 你們在一起呢,0.7的概率會去吃飯,也即十次大約有7次會去吃飯, 而有約三次會去看電影.
有一天,你在朋友圈發了個狀態: 吃,吃,看,看,吃.
這引起了你朋友圈的三個人的興趣:
你老媽, 你老媽對你的情況比較了解,她知道你對這三位女朋友的想法(即知道上面三張表), 她現在比較感興趣的是,下周她兒子去干嘛(也比較八卦~).
你表姐, 你表姐因為住在另一個城市,所以溝通比較少,因而你對三位女朋友的感覺(上面三張表)她並不知道,只知道你同時和三位女生談戀愛,所以她現在想根據你的發出的狀態判斷出你對三位女生的感覺(上面三張表).
你同事, 你同事也是你的基友,因此對你的事比較了解,沒事你會跟說說三個女生在你心里的感受(上面三張表),但為防止他八卦,你並沒有把每周去哪位女朋友那里告訴他.這下可勾起了他的好奇心,於是想根據你的狀態猜出你每周都是陪伴的誰.
好了,隱馬爾可夫模型講完了~
什么? Are you kidding me ?
沒有,真的,這就是馬爾可夫模型. 下面個圖來表示下.
描述模型
這張圖表示的就是你這五周以來與女朋友們的互動情況. 在隱馬爾可夫模型中, 粉色圈圈那一行代表的是女朋友的情況,從微信狀態的角度,它是一個隱藏在后面的狀態(沒有發在狀態里啊~). 因此稱為(隱)狀態序列(這就是HMM中'隱'字的意思),而且這個狀態鏈呢么是一個馬爾可夫模型或叫做馬爾可夫鏈. 什么是馬爾可夫鏈? 就是說當前狀態只決定於前一個狀態. 在本本例中,你本周去哪個女朋友那里,完全由你上周在哪個女朋友那里來決定. 而綠色框框則被稱為觀測序列, 即別人從朋友圈能看到你什么都做了什么.
上面的三張表,即是描述模型的變量,第一張表我們稱為初始狀態向量,第二張表稱為轉移概率矩陣,第三張表則是觀測概率矩陣.
而后面三個人的想要知道的東西就是HMM的三個基本問題:概率計算問題,學習問題,以及預測問題.
(三個問題的求解方式在后面~~~)
HMM 應用非常廣泛,特別是在自然語言處理,語音識別,信號處理,生物序列分析(DNA, 蛋白質等)等等大放異彩.HMM是時間序列模型,處理時間序列是其本職工作.
PS: 一如既往, 只做了解的,讀到這里就可停下了,想深入一些的,請繼續~
基本概念*
HMM是一個時序概率模型,描述由一個隱藏的馬爾可夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程.具體請看上圖.
現在咱們一般化地討論一下, 設:
分別為狀態序列與觀測序列, 因狀態序列是一個馬爾可夫鏈,故 所有變量的聯合概率分布為:
欲得到聯合概率分布,其需要右邊三個部分,\(P(y_1)P(x_1|y_1)\) 為初始條件; \(P(y_i|y_{i-1})\) 為轉移條件; \(P(x_i| y_i)\) 則為觀測條件. 因此,
設:
Q 是所有可能的狀態集合, V 是所有可能的觀測集合.
其中,N 是所有可能的狀態數, M 是所有可能的觀測數.
I 是長度為T 的狀態序列, O 是對應的觀測序列:
A 是狀態轉移概率矩陣:
其中,
是在 t 時刻 處於狀態 qi 的條件下在 時間 t+1 轉移到狀態 qj 的概率.
B 是觀測概率矩陣
其中
是在 t 時刻 處於狀態 q_j 的條件下生成觀測數 vk 的概率.
\(\pi\) 是初始狀態概率向量
其中
是時刻 t = 1處於狀態 qi 概率.
有了上述准確, HMM就基本上搞定了:
定義
這就是HMM,其中括號內的三個部分稱為HMM三元素.
基本假設
-
齊次馬爾可夫性假設, 即假設 在任意時刻 t 的狀態 只有前一狀態有關,與其他任何狀態,觀測都無關:
\[P(i_t |i_{t-1},o_{t-1},\dots,i_1,o_1) = P(i_t| i_{t-1}) \] -
觀測獨立性假設, 即假設任意時刻的觀測 只與該時刻的馬爾可夫鏈狀態有關,與其他任何時刻狀態,觀測都無關:
\[P(o_t| i_T,o_T,\dot,i_{t+1},o_{t+1},i_{t-1},o_{t-1},\dots,i_1,o_1) = P(o_t|i_t) \]
基本問題
- 概率計算問題, 給定定 \(\lambda = (A, B, \pi)\) 和觀測序列\(O = (o_1,o_2,\dots,o_T)\) , 計算在模型 \(\lambda\) 下 觀測序列 O 出現的概率\(P(O| \lambda)\), 也可說是HMM與觀測的匹配程度.
- 學習問題, 給定觀測序列 \(O = (o_1,o_2,\dots,o_T)\) ,估計模型 \(\lambda = (A, B, \pi)\) 使得在該模型下, \(P(O| \lambda)\) 最大.
- 預測問題,也稱解碼問題, 給定定 \(\lambda = (A, B, \pi)\) 和觀測序列\(O = (o_1,o_2,\dots,o_T)\) , 求使 \(P(O| \lambda)\) 最大的狀態序列 \(I = (i_1,i_2,\dots,i_T)\),即最有可能的狀態序列.
接下來,對於這三個問題,我們將各個擊破.
前向,后向算法
對於第一個問題, 最簡單的方法就是暴力計算,把每種情況都考慮一遍, 不用我說,你也知道這不可行. 倒不是因為復雜,是因為算不起,它的時間復雜度是恐怖的 \(O(TN^T)\) .
不過還真有比較不錯的算法,而且還有兩種!
上圖可表示為一HMM列.左,右兩邊虛線內我們分別用\(\alpha_t(j), \beta_t(j)\)來表示,其中
這兩個就是我們分別用於前向,后向算法的關鍵因子.
再明確一下,我們的目標是求解 \(P(O| \lambda)\) .
前向算法
-
初始狀態 \(o_1\), 考慮出現\(o_1\) 概率:
\[P(o_1| \lambda) = \sum_{j = 1}^N P(o_1,i_1 =q_j|\lambda) = \sum_{j =1}^N \alpha_1(j) = \sum_{j=1}^N \pi_j b_j(o_1) \]
-
當得到 \(P(o_1,o_2,\dots,o_t| \lambda)\) , 現在要求\(P(o_1,o_2,\dots,o_t,o_{t+1}| \lambda)\) ,可以先從\(\alpha_{t+1}(j)\) 出發:
而:
- 最終:
這就是前向算法.
后向算法
前向算法是從前向后, 后向算法則是從后向前的. 回顧:
-
第一步,由 \(\beta\) 定義,可知 當t = T時,
\[\beta_T(j) = 1 \]也就是說,目前的觀測序列到時刻T,而\(\beta_T\) 則關注的是 T+1 時刻, 這從現有已知條件中,對T+1 時刻沒有任何限制的,即\(o_{T+1}\) 的任何取值都可接受,顯然在這情況下, 上式(概率)值為1.
-
當已知 t+1時刻, 推導 t 時刻:
\[\begin{array}\\ \beta_t(j) & = & P(o_{t+1},o_{t+2},\dots,o_T |i_t = q_j, \lambda) \\ & =& \sum_{k =1}^N P(o_{t+2},\dots,o_T |o_t, i_t = q_j,i_{t+1} = q_k, \lambda) \\ &=& \sum_{k = 1}^N P(o_{t+2},\dots,o_T | i_{t+1} = q_k, \lambda) a_{jk} b_k(o_{t+1})\\ & = & \sum_{k = 1}^N a_{jk} b_k(o_{t+1}) \beta_{t+1}(j) \end{array} \] -
因此:
\[P(O| \lambda) = \sum_{j = 1}^N \pi_j b_j(o_1) \beta_1(j) \]
舉例計算
現在咱們來計算上面'三個女朋友'的例子,老媽想知道的問題. 現在我們簡化一下問題,你的微信狀態變成'吃,看,吃'. 計算方式一模一樣,只是簡化了一點,方便我行文. 這里要計算的是'吃,看,吃'的概率正常應該是多少(有些人可能要疑惑:這個跟大媽的問題不太一樣啊~,其實是一樣的, 因為我們可以假設這'吃,看,吃'與下周出現的活動組成一個序列,並求出概率,概率最大的情況,就是你下周最有可能的活動:
前向計算
概率上面三個表:
- 初始狀態
-
遞推計算
\[\begin{array}\\ \alpha_2(1) = \left[ \sum_{i =1}^3 \alpha_1(i)a_{i1}\right]b_1(o_2) = 0.154*0.5 = 0.077 \end{array} \]同理可算法其他,這里就不全寫了,
-
最后
\[P(O| \lambda) = \sum_{i = 1}^N a_3(i) = 0.13022 \]
后向計算
-
\(\beta_3(j) = 1\)
-
遞推計算:
\[\beta_2(1) = \sum_{j = 1}^3 a_{i1} b_{i}(o_3) \beta_3(1) = 0.51 \]其他同理.
-
最終: \(P(O| \lambda) = \sum_{i =1}^3 \pi_ib_i(o_1)\beta_1(i) = 0.13022\)
前向,后向算法結果是一樣的!
至此,第一個問題解決了. 這個問題可以用於時間序列預測問題,應用方式同上.
學習問題
有時我們並不知道HMM模型的具體形態,因此需要一些手段得到它.
在做此類問題時也可大致分為兩種情:
已知觀測序列及隱序列
這里了也必須已知,N 是所有可能的狀態數, M 是所有可能的觀測數.
比如,對於中文分詞,我們手上有數據集, 而且我們可以很容易地定義每個字隱狀態(隱狀態: 起始字,中間字,終止字,及獨立字等等),這樣, 在兩序列已知的情況下,根據大數定律,應用最大似然求出各狀態轉移矩陣,觀測矩陣及一個初始向量.
已知觀測序列
這里了也必須已知,N 是所有可能的狀態數, M 是所有可能的觀測數.
這里的方法就是 EM 算法, 不過因為在HMM中,因此有個別名叫 Baum-Welch 算法.
預測問題
第三個問題是預測問題.預測的是給定觀測序列,背后最有可能的馬爾可夫鏈.
這個問題目前有兩種方法,第一種稱為近似算法.此算法尋找各個時刻的最優解,最后連成一列. 為什么會被稱為近似算法? 因為這樣得到的每個時刻的最優,最終並不一定是整個序列的最優解.
因此目前最好的方法是維特比(Viterbi)算法.
Viterbi 算法
此算法是用動態規划的方式解決HMM的預測問題.即把隱狀態列看成是最優路徑上的每一步,找最大概率路徑,即轉化成尋找最優路徑.
在動態規划中, 最優路徑具有這樣的特性: 最優路徑在 t 時刻通過 結點 i, 那么 這一路徑對於從 i 到 最后的剩余路徑也是最優的.否則必有另一路徑比此更優,這是矛盾的.基於此 Viterbi 算法 遞推的計算在 t 時刻的最優路徑,直至最后.根據最后的最優路徑反向確定最優路徑上的各點隱狀態.
設 t 時刻的最優路徑是
於是
這樣,
-
最初狀態:
\[\delta_1(j) = \pi_jb_j(o_1) \] -
已知 \(\delta_t(j)\) 遞推 \(\delta_{t+1}(k)\)
\[\delta_{t+1}(k) = \max_{1\le j\le N} [\delta_{t}(j)a_{jk}]b_k(o_{t+1}) \] -
最后狀態,得到全局最優路徑
\[path_{best} = \max_{1 \le j \le N}\delta_T(j) \] -
反向推導 最優隱狀態序列, 令在 t+1 時刻 狀態在\(q_k\) 的最優路徑中,第 t 個結點:
\[\psi_{t+1}(k) = \arg \max_{1\le j \le N} [\delta_t(j)a_{jk}] \]於是最終列:
\[k_1^*,k_2^*,\dots,k_T^* \]其中
\[k_t^* = \psi_{t+1}(j) \]
舉例計算
還是'三個女朋友的例子',還是'吃,看,吃',
首先,
遞推 t = 2,
同理:
最終狀態:
即 \(i_3 = 3\)
反向推斷:
最后
因此最終狀態[3,3,3], 也就是說你這三周一直在陪C 女朋友的概率最大.
升華
思考,機器學習的算法哲學是什么? 是根據有限的已知去推斷未知. 這又可分為兩種, 一種是根據知識,對未來給出一個確定性判斷,比如decision tree; 還有一是對未來的不確定性懷敬畏,對未知只做概率性預測,如果一定要給出個結果,那只好用最大化概率法給出. 兩種方法沒有孰優孰劣,只是適用范圍,場景,數據不同而已.
本文分享的HMM 是貝葉斯網絡的一個特例. 在推導過程中用到了一些貝葉斯網絡相關的知識.貝葉斯網絡是用有向無環圖來表示變量間的依賴關系.
貝葉斯網絡則屬於更大范疇的概率圖模型(Probabilistic Graphical Model, PGM). 而概率圖模型則是概率模型的一種具體實現.
概率模型就是上面所說的,對未知進行概率性預測. 其核心是對未知進行概率分布預測,這右可分為兩種: '生成(generative)模型'與'判別(discriminative)模型'.具體地, 可觀測變量集 O, 興趣變量集 Y(即所要求解的變量),其他相關變量 R.
生成式關心的是聯合概率分布: P(Y, R, O); 而 判別式則關注條件概率 P(Y, R | O).
參考文獻
-
Artificial Intelligence: A modern approach, 3rd edition, 2010, Stuart Russell and Peter Norvig.
-
統計學方法,2012,李航.(注: 文中例子根據本書中例子改編~)
-
機器學習, 2016, 周志華.
-
Pattern Recognition and Machine Learning, 2006 ,Christopher M. Bishop.
-
HMM, 2017,Wikipedia.