時間序列(七): 高冷貴族: 隱馬爾可夫模型


高冷貴族: 隱馬爾可夫模型

引言

大家都用過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是一個時序概率模型,描述由一個隱藏的馬爾可夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程.具體請看上圖.

現在咱們一般化地討論一下, 設:

\[(y_1,y_2,\dots,y_n),\qquad (x_1,x_2,\dots,x_n) \]

分別為狀態序列與觀測序列, 因狀態序列是一個馬爾可夫鏈,故 所有變量的聯合概率分布為:

\[P(x_1,y_1,\dots,x_n,y_n) = P(y_1)P(x_1|y_1)\Pi_{i=2}^n P(y_i|y_{i-1})P(x_i| y_i) \]

欲得到聯合概率分布,其需要右邊三個部分,\(P(y_1)P(x_1|y_1)\) 為初始條件; \(P(y_i|y_{i-1})\) 為轉移條件; \(P(x_i| y_i)\) 則為觀測條件. 因此,

設:

Q 是所有可能的狀態集合, V 是所有可能的觀測集合.

\[Q = \{q_1,q_2,\dots,q_N\},\qquad V = \{v_1,v_2,\dots,v_M\} \]

其中,N 是所有可能的狀態數, M 是所有可能的觀測數.

I 是長度為T 的狀態序列, O 是對應的觀測序列:

\[I = \{i_1,i_2,\dots,i_T\}\qquad O = (o_1,o_2,\dots,o_T) \]

A 是狀態轉移概率矩陣:

\[A = [a_{ij}]_{NXN} \]

其中,

\[a_{ij} = P(i_{i+1} = q_j|i_t = q_i),\qquad i =1,2,\dots,N,\quad j = 1,2,\dots,N \]

是在 t 時刻 處於狀態 qi 的條件下在 時間 t+1 轉移到狀態 qj 的概率.

B 是觀測概率矩陣

\[B[b_j(k)]_{NXM} \]

其中

\[b_j(k) = P(o_t = v_k | i_t = q_j),\qquad k =1,2,\dots,M, \quad j = 1,2,\dots,N \]

是在 t 時刻 處於狀態 q_j 的條件下生成觀測數 vk 的概率.

\(\pi\) 是初始狀態概率向量

\[\pi = (\pi_i) \]

其中

\[\pi_i = P(i_1 = q_i), \quad i = 1,2,\dots,N \]

是時刻 t = 1處於狀態 qi 概率.

有了上述准確, HMM就基本上搞定了:

定義

\[\lambda = (A,B,\pi) \]

這就是HMM,其中括號內的三個部分稱為HMM三元素.

基本假設

  1. 齊次馬爾可夫性假設, 即假設 在任意時刻 t 的狀態 只有前一狀態有關,與其他任何狀態,觀測都無關:

    \[P(i_t |i_{t-1},o_{t-1},\dots,i_1,o_1) = P(i_t| i_{t-1}) \]

  2. 觀測獨立性假設, 即假設任意時刻的觀測 只與該時刻的馬爾可夫鏈狀態有關,與其他任何時刻狀態,觀測都無關:

    \[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) \]

基本問題

  1. 概率計算問題, 給定定 \(\lambda = (A, B, \pi)\) 和觀測序列\(O = (o_1,o_2,\dots,o_T)\) , 計算在模型 \(\lambda\) 下 觀測序列 O 出現的概率\(P(O| \lambda)\), 也可說是HMM與觀測的匹配程度.
  2. 學習問題, 給定觀測序列 \(O = (o_1,o_2,\dots,o_T)\) ,估計模型 \(\lambda = (A, B, \pi)\) 使得在該模型下, \(P(O| \lambda)\) 最大.
  3. 預測問題,也稱解碼問題, 給定定 \(\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)\)來表示,其中

\[\alpha_t(j) = P(o_1,o_2,\dots,o_t,i_t = q_j | \lambda);\qquad \beta_t(j) = P(o_{t+1},o_{t+2},\dots,o_T |i_t = q_j, \lambda) \]

這兩個就是我們分別用於前向,后向算法的關鍵因子.

再明確一下,我們的目標是求解 \(P(O| \lambda)\) .

前向算法

  1. 初始狀態 \(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) \]

  2. 當得到 \(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)\) 出發:

\[\begin{array}\\ \alpha_{t+1}(j) &= &P(o_1,o_2,\dots,o_t,o_{t+1},i_{t+1} = q_j | \lambda) \\ & =& \sum_{k = 1}^N P(o_1,o_2,\dots,o_t,o_{t+1},i_{t+1} = q_j ,i_t = q_k| \lambda)\\ & =& \sum_{k = 1}^N P(o_1,o_2,\dots,o_t,i_t = q_j | \lambda)a_{jk}b_j(o_{t+1})\\ & =& \sum_{k = 1}^N \alpha_t(j) a_{jk}b_k(o_{t+1})\\ & =& b_j(o_{t+1}) \sum_{k = 1}^N \alpha_t(j) a_{jk} \end{array} \]

而:

\[P(o_1,o_2,\dots,o_t,o_{t+1}| \lambda) = \sum_{j = 1}^N \alpha_{t+1}(j) \]

  1. 最終:

\[P(O|\lambda ) =\sum_{j = 1}^N \alpha_T(j) \]

這就是前向算法.

后向算法

前向算法是從前向后, 后向算法則是從后向前的. 回顧:

\[\beta_t(j) = P(o_{t+1},o_{t+2},\dots,o_T |i_t = q_j, \lambda) \]

  1. 第一步,由 \(\beta\) 定義,可知 當t = T時,

    \[\beta_T(j) = 1 \]

    也就是說,目前的觀測序列到時刻T,而\(\beta_T\) 則關注的是 T+1 時刻, 這從現有已知條件中,對T+1 時刻沒有任何限制的,即\(o_{T+1}\) 的任何取值都可接受,顯然在這情況下, 上式(概率)值為1.

  2. 當已知 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} \]

  3. 因此:

    \[P(O| \lambda) = \sum_{j = 1}^N \pi_j b_j(o_1) \beta_1(j) \]

舉例計算

現在咱們來計算上面'三個女朋友'的例子,老媽想知道的問題. 現在我們簡化一下問題,你的微信狀態變成'吃,看,吃'. 計算方式一模一樣,只是簡化了一點,方便我行文. 這里要計算的是'吃,看,吃'的概率正常應該是多少(有些人可能要疑惑:這個跟大媽的問題不太一樣啊~,其實是一樣的, 因為我們可以假設這'吃,看,吃'與下周出現的活動組成一個序列,並求出概率,概率最大的情況,就是你下周最有可能的活動:

前向計算

概率上面三個表:

  1. 初始狀態

\[\begin{array}\\ \alpha_1(1) = \pi_1 b_1(o_1) = 0.2 * 0.5 = 0.1\\ \alpha_1(2) = \pi_2 b_2(o_1) = 0.4 * 0.4 = 0.16\\ \alpha_1(3) = \pi_1 b_3(o_1) = 0.4 * 0.7 = 0.28 \end{array} \]

  1. 遞推計算

    \[\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} \]

    同理可算法其他,這里就不全寫了,

  2. 最后

    \[P(O| \lambda) = \sum_{i = 1}^N a_3(i) = 0.13022 \]

后向計算

  1. \(\beta_3(j) = 1\)

  2. 遞推計算:

    \[\beta_2(1) = \sum_{j = 1}^3 a_{i1} b_{i}(o_3) \beta_3(1) = 0.51 \]

    其他同理.

  3. 最終: \(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_t(j) = \max_{i_1,i_2,\dots,i_{t-1}} P(i_t = q_j, i_{t-1},\dots,i_1,o_t,\dots,o_1 | \lambda), \qquad j = 1,2,\dots,N \]

於是

\[\begin{array}\\ \delta_{t+1}(k) &=& \max_{i_1,i_2,\dots,i_{t}} P(i_t = q_j, i_{t-1},\dots,i_1,o_t,\dots,o_1 | \lambda)\\ &=& \max_{1\le j\le N} [\delta_{t}(j)a_{jk}]b_k(o_{t+1}) \end{array} \]

這樣,

  1. 最初狀態:

    \[\delta_1(j) = \pi_jb_j(o_1) \]

  2. 已知 \(\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}) \]

  3. 最后狀態,得到全局最優路徑

    \[path_{best} = \max_{1 \le j \le N}\delta_T(j) \]

  4. 反向推導 最優隱狀態序列, 令在 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) \]

舉例計算

還是'三個女朋友的例子',還是'吃,看,吃',

首先,

\[\delta_1(1) = 0.1,\quad \delta_1(2) = 0.16, \quad \delta_1(3) = 0.28 \]

遞推 t = 2,

\[\delta_2(1) = \max_{1\le j \le3}[\delta_1(j)a_{j1}]b_1(o_2) = 0.028 \]

同理:

\[\delta_2(2) = 0.0504,\quad \delta_2(3) = 0.042\\\delta_3(1) = 0.00756,\quad \delta_3(2) = 0.01008,\quad \delta_3(3) = 0.0147 \]

最終狀態:

\[path_{best} = \max_{1 \le j \le 3} \delta_3(j) = 0.0147 \]

\(i_3 = 3\)

反向推斷:

\[i_2 = \psi_{2+1}(3) = \arg \max_{1\le j \le N} [\delta_2(j)a_{j3}] = 3 \]

最后

\[i_1 = \psi_{1+1}(3) = \arg \max_{1\le j \le N} [\delta_t(j)a_{j3}] = 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).

參考文獻

  1. Artificial Intelligence: A modern approach, 3rd edition, 2010, Stuart Russell and Peter Norvig.

  2. 統計學方法,2012,李航.(注: 文中例子根據本書中例子改編~)

  3. 機器學習, 2016, 周志華.

  4. Pattern Recognition and Machine Learning, 2006 ,Christopher M. Bishop.

  5. HMM, 2017,Wikipedia.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM