隐马尔科夫模型基础
?引言
? ? ? 隱馬爾可夫模型(Hidden Markov model, HMM)是用于序列標注的概率圖模型,描述一個隱藏的馬爾科夫鏈生成不可觀測的狀態序列,再由每個狀態生成一個觀測而產生一個觀測序列的過程,是一個生成模型。隱馬爾可夫模型在自然語言處理、語音識別、模式識別等領域都應用廣泛。在自然語言處理中,基于字標注的分詞、詞性標注、句法分析、命名實體識別等領域都可以應用隱馬爾可夫模型。
? ? ? ? 雖然現在深度學習大行其道,HMM(在訓練數據充足的情況下)也不如條件隨機場(Conditional Random Field,CRF)強大,但是HMM依然是經典的統計分析模型,HMM包含的一些基本原理和概念,是學習其他算法的基礎,比如隨機采樣中的馬爾可夫-蒙特卡洛方法(Markov Chain Monte Carlo)用馬爾科夫鏈產生樣本序列,CRF中的隨機場即馬爾可夫隨機場。因此,接下去我們簡單的學習一下隱馬爾科夫模型。
2.??隱馬爾科夫模型的框架
? ? ? ?隱馬爾可夫模型的基礎內容其實非常簡單,總結起來只需要記住“1、2、3”,即1個元組,2個假設,3個問題。
2.1 一個元組
? ? ? ? 1個元組就是隱馬爾可夫模型的參數元組,即組成隱馬爾科夫模型的要素。一般來說是一個三元組??或者一個五元組??。五元組比三元組多了一個可能的狀態集合Q和可能的觀測集合V。Q和V是模型預設而不需要訓練的參數(可認為是兩個超參數),A,B,??是隱馬爾可夫模型需要訓練的參數。
? ? ? ? A表示狀態轉移概率矩陣。假設可能的狀態集合Q總共有N個狀態,則A是一個N*N的方陣,即,表示t時刻從狀態i轉移到t+1時刻狀態j的概率:
??
注意這里包含了一個隱含的約束,從狀態i轉移到所有狀態(包括他自己)的概率和為1即。
? ? ? ? B表示符號發射概率(仿射概率)矩陣。假設可能的狀態集合Q共N個狀態,可能的觀測集合總共由M個觀測,則B是一個N*M的矩陣,即,其中表示t時刻從狀態j生成觀測k的概率:
??
同樣這里包含一個隱含約束條件。
? ? ? ? 是初始狀態概率分布向量,即在初始時刻(t=1)狀態的概率分布,其中。
2.2 兩個假設
? ? ? ? 三元組決定了隱馬爾可夫模型,和A決定了如何從隱藏的馬爾可夫鏈生成狀態序列I,B決定了如何從狀態序列生成觀測序列O。在這個過程中隱馬爾可夫模型做了兩個基本假設:
(1)齊次馬爾可夫性假設。
?????假設隱藏的馬爾科夫鏈在時刻t的狀態只依賴于其前一刻(t-1時刻)的狀態而與其他時刻的狀態及觀測無關,也與時刻t無關:
??
(2)觀測獨立性假設。
?????假設任意時刻的觀測只依賴于該時刻的馬爾科夫鏈的狀態,與其他觀測以及狀態無關:
??
2.3?三個基本問題
? ? ? ? 隱馬爾科夫模型基于以上兩個基本假設,生成一個長度為T的觀測序列的過程如下:
? ? ? ?1)按照初始狀態產生狀態?;
? ? ? ?2)令t=1
? ? ? ?3)按照狀態的仿射概率分布生成觀測;
? ? ? ?4)按照狀態的狀態轉移概率分布產生狀態;
? ? ? ?5)令t=t+1,如果t小于T轉到(3),否則終止;
隱馬爾可夫模型的生成如下圖所示:
? ? ? ?在生成觀測序列時我們需要考慮全局最優策略,而且我們更多的時候關心的不是生成的觀測而是生成觀測的最佳狀態序列,所以隱馬爾可夫模型有三個基本問題:(1)評估問題;(2)學習問題;(3)解碼問題。
2.3.1 評估問題
? ? ? ?評估問題是給定模型μ=(A, B, π)和觀測序列,計算在模型μ下觀測序列O出現的概率P(O | μ)。評估問題是學習問題和解碼問題的基礎,它為學習問題和解碼問題提供了基本要素。先看下面的示意圖:
最直接計算概率P(O | μ)的方式是計算每個時刻可能狀態的轉移概率和生成觀測的概率并將所有可能路徑的概率相加得到概率P(O | μ)。但是顯而易見這種暴力計算的方式計算代價極為高昂,一個包含N個可能狀態的HMM模型生成一個長度為T的狀態序列的計算復雜度為。
? (1)前向概率
? ? ??給定隱馬爾科夫模型μ,定義到時刻t部分觀測序列為且狀態為的概率為前向概率,記作
??
前向概率的計算方式如下圖所示:
t=1時刻狀態i的前向概率為?,t時刻狀態i的前向概率為t-1時刻所有狀態的前向概率轉移到t時刻狀態i的概率之和:
于是可得概率。
? (2)后向概率
給定隱馬爾科夫模型μ,定義在時刻t狀態為的條件下,從t+1到T的部分觀測序列為的概率為后向概率,記作?
初始化后向概率時,模型規定T時刻的,與前向概率相似,t時刻狀態i的后向概率的遞推公式為:
?
遞推公式如下圖所示:
最終概率。
? ? ? ?利用前向概率和后向概率的定義可以將觀測序列概率P(O|μ)統一寫成:
前向概率和后向概率運用動態規劃算法降低了概率計算的復雜度,從暴力計算的降低到了,當T很大時,這個差別將非常大。
2.3.2 學習問題
? ? ? 已知觀測序列,學習模型μ=(A, B, π)的參數,使得該模型下觀測序列概率P(O | μ)最大。學習問題解決的是隱馬爾科夫模型的訓練問題,通過訓練數據得到模型的參數A,B,π。根據訓練數據是否包含觀測序列相應的狀態序列,學習問題可以用監督學習和無監督學習的方式訓練。
? ? ? ?監督學習的方式,是給定訓練數據包含S個長度相同的觀測序列和對應的狀態序列,利用極大似然估計來估計隱馬爾科夫模型的參數:
(1)轉移概率的估計
設樣本中時刻t處于狀態i時刻t+1轉移到狀態j的頻數為,那么狀態轉移概率的估計是:
??
(2)觀測概率的估計
設樣本中狀態為j并觀測為k的頻數,那么狀態為j觀測為k的概率的估計是:
??
(3)初始狀態概率πi的估計為S個樣本中初始狀態為的頻率。
當 給定訓練數據只包含S個長度為T的觀測序列而沒有對應的狀態序列時,那么隱馬爾科夫模型是一個以觀測序列數據為觀測數據O,以狀態序列數據為不可觀測隱數據I的概率模型:
??
此時參數的學習可以使用Baum-Welch算法實現,這是一種期望最大化算法(EM算法)。Baum-Welch算法的輸入輸如下:
輸入:觀測數據
輸出:隱馬爾科夫模型參數 μ = (A, B, π)
令則算法步驟如下:
(1)初始化
對 n=0,選取,得到模型。
(2)遞推。對n=1,2,……,
??
??
??
上面幾式等號右邊以觀測和模型計算。式中
??
??
其中是前向概率,是后向概率。
(3)終止。得到模型參數。
? ? ? ?Baum-Welch算法也叫前向-后向算法,因為其中的參數計算用到了前向概率和后向概率。第二步遞推公式在李航博士的《統計學習方法論》的隱馬爾可夫模型一章給出了詳細的推導,有興趣的讀者可以仔細閱讀。
2.3.3 解碼問題:
? ? ? 已知模型μ=(A, B, π)和觀測序列,求對給定觀測序列條件概率P(I | O)最大的狀態序列,即給定觀測序列,求最有可能的對應的狀態序列。在參數學習完成之后,解碼問題是隱馬爾科夫模型模型實際應用過程中的預測問題。比如在詞性標注中給定由單詞組成的句子(觀測序列),輸出句子單詞相應詞性的序列(狀態序列)。
? ? ? ?解決解碼問題最直覺的方式,是在每個時刻t選擇在該時刻最優可能出現的狀態,從而得到一個狀態序列,將它作為預測的結果。例如,給定隱馬爾科夫模型μ和觀測序列O,在時刻t處于狀態的概率?γ?如上文的等式所定義,在每一時刻t最有可能的狀態是:
??
從而得到狀態序列。這種直接計算的近似算法,計算簡單,但是一種典型的貪心算法,沒有考慮全局最優,所以缺點是不能保證預測的狀態序列整體是最有可能的狀態序列。
? ? ??解決解碼問題最經典的算法是維特比算法。維特比算法也是動態規劃的典型應用。它基于最優路徑的這樣一個特性:如果最優路徑在時刻t通過節點,那么這一路徑從節點到終點的部分路徑,對于從到的所有可能的部分路徑來說,必須是最優的。(至于原因,非常簡單,讀者可以自行思考一下)
? ? ? ?在說明維特比算法之前,我們首先定義維特比變量,為在t時刻狀態為i的所有單個路徑中概率最大值:
??
維特比變量的遞推公式為:
???
? ? ? ?細心的讀者可能已經發現了,維特比變量的遞推公式和前向概率(變量)的遞推公式十分相似,實際上,前向變量是t時刻狀態為i的所有路徑的概率之和,維特比變量是t時刻狀態為i的單個路徑的概率最大值,如下圖所示:
? ? ? ?由上圖可以看出(實際上上圖不是隱馬爾科夫模型,但是比較契合維特比變量和前向概率的直觀比較,我實在找不到合適的圖了),紅色的路徑代表維特比變量的路徑,前向概率的路徑是所以路徑的加和。除了維特比變量,維特比算法定義了在時刻t狀態為i的所有單個路徑中概率最大的路徑的第t-1個節點的變量:
??
于是維特比算法流程如下:
輸入:模型 μ=(A, B, π) 和觀測;
輸出:最優路徑。
(1)初始化
??
??
(2)遞推。對t = 2, 3, …… , T
???
(3)終止
??
??
(4)最優路徑回溯。對t = T-1, T-2, ……, 1
??
求得最優路徑。
3. 總結
? ? ? ?以上就是馬爾可夫模型的基本內容,作為一種簡單的概率圖模型,隱馬爾可夫模型有著廣泛的應用,例如概率上下文文法可以認為是隱馬爾科夫模型模型的一種推廣,動態貝葉斯網絡(dynamic Bayesian network)包含了隱馬爾科夫模型。雖然隱馬爾可夫模型也有著一些缺點,比如過強的獨立性假設以及標記偏置問題,使得隱馬爾可夫模型不像條件隨機場那么強大。
? ? ? ?同時,在具體的實現過程中,前向概率等應用了動態規劃,可以用遞歸算法實現,但是遞歸實現的簡單性往往會掩蓋算法本身的復雜性,當觀測序列很長時,尤其是隱馬爾科夫模型訓練用的是觀測序列的總長度,用遞歸算法往往可能會出現棧溢出的情況,尤其像python這種沒有尾遞歸優化的語言,在實現的時候必須考慮這個問題。總之,隱馬爾科夫模型模型是一個相對簡單的序列標注模型,有興趣的讀者可以自己實現一下。
總結
- 上一篇: linux 密码复杂度,用PAM 搞定L
- 下一篇: exe文件编辑器