隱馬爾可夫模型(Hidden Markov Model, HMM)是一個重要的機器學習模型。直觀地說,它能夠解決一類這樣的問題:有某樣事物存在必定的狀態,但咱們沒法得知某個時刻(或位置)它所處在的狀態,可是咱們有一個參照事物,咱們知道這個參照事物在某個時刻(或位置)的狀態並認爲參照事物的狀態和原事物的狀態存在聯繫,那麼咱們可使用機器學習來推測原事物最有可能在一個時刻(或位置)處在什麼樣的狀態。也就是說,這是一個基於機率統計的模型。算法
舉一個直觀的例子吧。好比你要預測某市連續\(n\)天內的天氣是冷仍是熱,可是你不知道這個城市的氣溫,你只知道某市某天冰淇淋的總銷量,那麼咱們能夠訓練隱馬爾可夫模型來用上述數據推測城市的某天的天氣最有多是冷仍是熱。這裏,咱們要預測的事物是天氣,有 {冷,熱} 兩個狀態,參照事物是冰淇淋銷量,有\(\{1, 2, …\}\)等若干種有限的狀態,要預測的結果是\(t\)時刻最有可能的天氣狀態。數組
下面咱們給出隱馬爾可夫模型的嚴格數學定義。機器學習
要介紹隱馬爾可夫模型,必須先介紹馬爾可夫鏈的基本概念。不嚴格地說,馬爾可夫鏈是一個描述隨機過程的數學模型。隨機過程是指一個事物有一組狀態,會隨着時間的流逝按照必定機率隨機變化的一個過程。馬爾可夫鏈有兩個重要假設,一是在\(t\)時刻事物狀態變化的機率只與\(t\)時刻自己事物的狀態有關,不與\(t-1\)時刻及以前的事物狀態有關,二是從\(i\)狀態改變到\(j\)狀態的機率只與\(i\)與\(j\)狀態自己有關,與時間\(t\)的值無關。這些假設能夠大大簡化咱們對這個隨機過程的研究,並且依然能夠解釋現實世界中的不少現象。函數
好比說,假如一個呼叫中心要接聽電話,有兩個狀態:{沒電話,有電話}。沒電話時,下一秒有電話來的機率爲\(p\),沒電話來的機率爲\(1-p\);正在打電話時,電話接着打的機率爲\(q\),電話掛斷的機率爲\(1-q\)。這就構成了一個最簡單的具備兩個狀態的以秒爲離散時間單位的馬爾可夫鏈。學習
下面咱們給出馬爾可夫鏈的一個嚴格數學定義。spa
考察一個離散時間的隨機過程\(X_n\),這個\(X_n\)在一組有限狀態集合\(S=\{1, 2,…, N \}\)上取值,那麼對每一個時刻\(t\),若是\(X_1=i_1, …, X_{t-1}=i_{t-1},X_t=i, \mbox{ and } i_1, i_2,…,i_{t-1},i\in S\),咱們定義\(t+1\)時刻\(X_{t+1}=j\)的機率code
\[ P_{ij}=P\{X_{t+1}|X_t=i, X_{t-1}=i_{t-1},…,X_1=i_1\} \]數學
咱們假設\(P_{ij}=P\{X_{t+1}|X_t=i\}\)。知足這個條件,就稱此隨機過程知足馬爾可夫性。it
咱們再假設在任意\(t\)時刻,任意狀態\(i\)到狀態\(j\)的變化機率\(P_{ij}=p(i, j)\)(與\(t\)無關),\(p\)是\(S\times S \rightarrow [0,1]\)的函數。知足這個條件,就稱此隨機過程知足時齊馬爾可夫性。io
因而咱們能夠將\(p(i, j)\)寫成一個\(N \times N\)矩陣\(A=\{a_{ij}\}\),\(a_{ij}=p(i,j)\)。這個矩陣就是馬爾可夫鏈的轉移機率矩陣。
給定初始機率分佈\(\phi(i)=P\{X_0=i\}\),那麼就能獲得任意一個具體的狀態轉移鏈的發生機率
\[ P\{X_0=i_0,X_2=i_2,...,X_n=i_n\}=\phi(i_0)p(i_0,i_1)p(i_1,i_2)...p(i_{n-1},i_n) \]
咱們還能夠證實,\(n\)步轉移機率\(p_n(i,j)\)就是矩陣\(A^n\)在\((i,j)\)位置上的元素,即\(P\{X_{n+1}=j|X_n=i\}=A^n_{ij}.\)
咱們用一個圖模型就能描述馬爾可夫鏈。令全部的狀態\(S=\{1,2,…, {N }\}\)爲頂點集合,轉移機率矩陣\(A\)描述圖上的邊,再定義特殊的開始狀態和結束狀態\(q_0,q_F\),矩陣第\(0\)行表示初始機率分佈和初始的邊便可。在以後的討論中,咱們將頻繁地用圖來描述馬爾可夫鏈。
隱馬爾科夫模型(HMM)是馬爾可夫鏈的一個拓展。一個HMM含有以下元素:
對HMM而言以前談的馬爾可夫鏈的兩個假設依然是必要的。
對於一個HMM,有三個根本性的問題須要解決:
Likelihood:給定一個HMM的\(A\)和\(B\),\(\lambda=(A,B)\)和觀察序列\(O\),判斷觀察到這個\(O\)的機率\(P(O|\lambda )\)。
Decoding:給定一個HMM的\(A\)和\(B\),\(\lambda=(A,B)\)和觀察到的序列\(O\),判斷最有可能的內部狀態序列\(Q\)。
Learning:給定觀察序列\(O\)和狀態集合\(S\),學習HMM的參數\(A\)和\(B\)。
以後將會分別討論解決這三個問題的算法,第三個會用到前兩個的重要結論。
第一個問題的解決方案被稱爲Forward Algorithm,是一種動態規劃算法。其思想是從時刻1開始計算一個時刻的全部狀態下這個觀察序列產出的機率,計算到時刻\(T\)並將全部狀態的機率求和就獲得了咱們的結果。
定義$\alpha_t(j) \(爲\)t\(時刻產生給定觀察序列\)o_1o_2…o_t\(,且內部狀態爲\)j$的機率。也就是
\[ \alpha_t(j)=P\{o_1,o_2,...,o_t,q_t=j|\lambda\} \]
咱們發現這個問題\(\alpha_t(j)\)只與\(t-1\)時刻的狀態有關,由於若是咱們知道了\(t-1\)時刻產生觀察序列\(o_1o_2…o_{t-1}\)而且處於狀態\(i\)的機率,那麼下一時刻處在狀態\(j\)的機率就是以前處在狀態\(i\)的機率乘以從狀態\(i\)轉移到狀態\(j\)的機率再乘以產生觀察\(o_t\)的機率,再將全部的狀態$求和便可。
因此有以下遞推式
\[ \alpha_t(j)=\sum_{i=1}^{N}\alpha_{t-1}(i)a_{ij}b_j(o_t) \]
初始狀態
\[ \alpha_1(j)=a_{0j}b_j(o_1), 1\le j\le N \]
最後結果
\[ P(O|\lambda)=\sum_{i=1}^N\alpha_T(i)a_{iF} \]
這就是動態規劃算法的遞推式。
第二個問題的解決方法和第一個問題很是類似,都是動態規劃算法。
相似地,定義\(v_t(j)\)表示前\(t\)時刻觀察到了\(o_1o_2…o_t\)序列而且通過了最有可能的狀態序列\(q_0q_1…q_{t-1}\),而且在\(t\)時刻處在狀態\(j\)的機率,也就是說
\[ v_t(j)=\max_{q_0,q_1,...,q_t-1}P\{q_0,q_1,...,q_{t-1},o_1,o_2,...,o_t,q_t=j|\lambda\} \]
那麼有以下遞推方程
\[ v_t(j)=\max_{i=1}^{N}v_{t-1}(i)a_{ij}b_j(o_t) \]
初始狀態
\[ v_{1j}=a_{0j}b_j(o_1),1\le j\le N \]
最終的最大機率
\[ P=\max_{i=1}^{N}v_T(i)a_{iF} \]
遞推過程當中設置標記數組記錄每一步選擇了哪一個\(i\)就能在遞推完後恢復出整個路徑。
回顧一下要解決的問題:給定觀察序列\(O\)和狀態集合\(S\),學習HMM的參數\(A\)和\(B\)。若是咱們學習到了這些參數,給定新的觀察序列咱們就能評估出最有可能的內部狀態序列。
這個算法的得出過程比較複雜,須要一些數學推導。
咱們先考慮馬爾可夫鏈的狀況。這個時候觀察序列\(O\)直接與內部狀態序列\(Q\)一一對應,那麼咱們能夠直接估計其轉移機率矩陣。其中從狀態\(i\)轉移到狀態\(j\)的機率\(a_{ij}\),就是從狀態\(i\)轉移到狀態\(j\)的次數,除以從狀態\(i\)轉移到某個狀態的總次數,也就是
\[ a_{ij}=\frac{C(i\rightarrow j)}{\sum_{q\in Q}C(i\rightarrow q)} \]
可是對於HMM,咱們不能從觀察序列直接估計內部狀態序列的機率。所以,算法的思路是先估計一個\(A\)和\(B\),而後不斷從新估計…直到收斂,以完成參數的訓練。而對機率的估計須要用到前向機率\(\alpha_t(i)\)和後向機率\(\beta_t(i)\)(Forward and backward probabilities)。其中
\[ \alpha_t(i)=P\{o_1,o_2,...,o_t,q_t=i|\lambda\}\\ \beta_t(i)=P\{o_{t+1},o_{t+2},...,o_T|q_t=i,\lambda\} \]
\(\alpha_t(i)\)就是第一個算法裏的\(\alpha_t(i)\),\(\beta_t(i)\)與之類似,但注意有所不一樣,如此定義是爲了其從後向前推導的計算過程與第一個算法相似,也就是
\[ \beta_T(i)=a_{iF}, 1 \le i \le N\\ \beta_t(i)=\sum_{j=1}^{N}a_{ij}b_j(o_{t+1})\beta_{t+1}(j), 1\le i\le N,1\le t < T \]
那麼,要怎麼估計\(a_{ij}\)呢?令記號\(\hat{a}_{ij}\)表示對\(a_{ij}\)的估計值,那麼
\[ \hat a_{ij}=\frac{從狀態i到狀態j的指望轉移次數}{從狀態i轉走的指望轉移次數} \]
令\(\xi_t\)爲時刻\(t\)爲狀態\(i\),時刻\(t+1\)時爲狀態\(j\)的機率,即\(\xi_t(i,j)=P\{q_t=i,q_{t+1}=j|O,\lambda\}\).
這個東西不太好求,可是因爲機率論公式
\[ P\{X|Y,Z\}=\frac{P\{X,Y|Z\}}{P\{Y|Z\}} \]
因此
\[ \begin{align} \xi_t(i,j)&=\frac{P\{q_t=i,q_{t+1}=j,O|\lambda\}}{P\{O|\lambda\}}\\ &=\frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{P\{O|\lambda\}} \end{align} \]
分母就是以前動態規劃算法的結果,分子則是用兩個動態規劃算法的遞推矩陣裏的值計算。
那麼
\[ \hat a_{ij}=\frac{\sum_{t=1}^{T-1}\xi_t(i,j)}{\sum_{t=1}^{T-1}\sum_{k=1}^{N}\xi_t(i,k)} \]
因此說只要給定了一個\(B\)的估計值,\(B=\{b_j(o_t)\}\),咱們就能估計一個\(A=\{a_{ij}\}\).
以後咱們有了一個\(A\),咱們還須要一個方法來估計\(B\)。對\(B\)中的每一個元素,在狀態\(j\)觀測到觀察\(v_k\)的機率的估計是\(\hat{b}_j(v_k)\),咱們將其表示爲
\[ \hat{b}_j(v_k)=\frac{狀態j而且觀測到v_k的總數指望}{狀態j出現的總數指望} \]
爲了計算\(\hat b_j(v_k)\),咱們須要知道在時間\(t\)處在狀態\(j\)的機率\(\gamma_t(j)\)
\[ \gamma_t(j)=P\{q_t=j|O,\lambda\}=\frac{P\{q_t=j,O|\lambda\}}{P\{O|\lambda\}}=\frac{\alpha_t(j)\beta_t(j)}{P\{O|\lambda\}} \]
那麼
\[ \hat b_j(v_k)=\frac{\sum_{t=1, s.t. o_t=v_k}^T\gamma_t(j)}{\sum_{t=1}^T\gamma_t(j)} \]
所以,對於算法而言,這是一個EM(Expectation, Maximization)算法,在E階段咱們計算\(\xi\)和\(\gamma\),在M階段咱們估計\(A\)和\(B\)直到收斂。算法僞代碼以下
Forward-Backward(長度爲T的觀察,觀察取值集合V,隱藏狀態取值集合S): 初始化A和B 迭代直到收斂: # E階段 for each t and j: 計算gamma[t][j] for each t, i and j 計算xi[t][i][j] # M階段 計算A[i][j] 計算B[j][v[k]] return A, B