隱馬爾可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些學者發表在一系列的統計學論文中,隨後在語言識別,天然語言處理以及生物信息等領域體現了很大的價值。平時,常常能接觸到涉及 HMM 的相關文章,一直沒有仔細研究過,都是走馬觀花,所以,想花一點時間梳理下,加深理解,在此特別感謝 52nlp 對 HMM 的詳細介紹。html
考慮下面交通燈的例子,一個序列多是紅-紅/橙-綠-橙-紅。這個序列能夠畫成一個狀態機,不一樣的狀態按照這個狀態機互相交替,每個狀態都只依賴於前一個狀態,若是當前的是綠燈,那麼接下來就是橙燈,這是一個肯定性系統,所以更容易理解和分析,只要這些狀態轉移都是已知的。可是在實際當中還存在許多不肯定性系統。node
在平常生活當中,咱們老是但願根據當前天氣的狀況來預測將來天氣狀況,和上面的交通燈的例子不一樣,咱們不能依靠現有知識肯定天氣狀況的轉移,可是咱們仍是但願能獲得一個天氣的模式。一種辦法就是假設這個模型的每一個狀態都只依賴於前一個的狀態,這個假設被稱爲馬爾科夫假設,這個假設能夠極大簡化這個問題。顯然,這個假設也是一個很是糟糕的假設,致使不少重要的信息都丟失了。jquery
當涉及到天氣的時候,馬爾科夫假設描述爲,假設若是咱們知道以前一些天的天氣信息,那麼咱們就能預測今天的天氣。固然,這個例子也是有些不合實際的。可是,這樣一個簡化的系統能夠有利於咱們的分析,因此咱們一般接受這樣的假設,由於咱們知道這樣的系統能讓咱們得到一些有用的信息,儘管不是十分準確的。算法
談到 HMM,首先簡單介紹一下馬爾可夫過程 (Markov Process),它因俄羅斯數學家安德烈·馬爾可夫而得名,表明數學中具備馬爾可夫性質的離散隨機過程。該過程當中,每一個狀態的轉移只依賴於以前的 n 個狀態,這個過程被稱爲1個 n 階的模型,其中 n 是影響轉移狀態的數目。最簡單的馬爾科夫過程就是一階過程,每個狀態的轉移只依賴於其以前的那一個狀態。注意這和肯定性系統不同,由於這種轉移是有機率的,而不是肯定性的。機器學習
馬爾可夫鏈是隨機變量 X1, … , Xn 的一個數列。這些變量的範圍,即他們全部可能取值的集合,被稱爲「狀態空間」,而 Xn 的值則是在時間 n 的狀態。若是 Xn+1 對於過去狀態的條件機率分佈僅是 Xn 的一個函數,則函數
這裏 x 爲過程當中的某個狀態。上面這個恆等式能夠被看做是馬爾可夫性質。學習
馬爾可夫鏈的在不少應用中發揮了重要做用,例如,谷歌所使用的網頁排序算法(PageRank)就是由馬爾可夫鏈定義的。.net
下圖展現了天氣這個例子中全部可能的一階轉移:翻譯
注意一個含有 N 個狀態的一階過程有 N2 個狀態轉移。每個轉移的機率叫作狀態轉移機率 (state transition probability),就是從一個狀態轉移到另外一個狀態的機率。這全部的 N2 個機率能夠用一個狀態轉移矩陣來表示,其表示形式以下:指針
對該矩陣有以下約束條件:
下面就是海藻例子的狀態轉移矩陣:
這個矩陣表示,若是昨天是晴天,那麼今天有50%的多是晴天,37.5%的機率是陰天,12.5%的機率會下雨,很明顯,矩陣中每一行的和都是1。
爲了初始化這樣一個系統,咱們須要一個初始的機率向量:
這個向量表示第一天是晴天。
到這裏,咱們就爲上面的一階馬爾科夫過程定義瞭如下三個部分:
狀態:晴天、陰天和下雨
初始向量:定義系統在時間爲0的時候的狀態的機率
狀態轉移矩陣:每種天氣轉換的機率
全部的能被這樣描述的系統都是一個馬爾科夫過程。
然而,當馬爾科夫過程不夠強大的時候,咱們又該怎麼辦呢?在某些狀況下,馬爾科夫過程不足以描述咱們但願發現的模式。
例如,一個隱居的人可能不能直觀的觀察到天氣的狀況,可是民間傳說告訴咱們海藻的狀態在某種機率上是和天氣的狀況相關的。在這種狀況下咱們有兩個狀態集合,一個能夠觀察到的狀態集合(海藻的狀態)和一個隱藏的狀態(天氣情況)。咱們但願能找到一個算法能夠根據海藻的情況和馬爾科夫假設來預測天氣的情況。
一個更現實的例子是語音識別,咱們聽到的聲音是聲帶、喉嚨和一塊兒其餘的發音器官共同做用的結果。這些因素相互做用,共同決定了每個單詞的聲音,而一個語音識別系統檢測的聲音(能夠觀察的狀態)是人體內部各類物理變化(隱藏的狀態、引伸一我的真正想表達的意思)產生的。
某些語音識別設備把內部的發音機制做爲一個隱藏的狀態序列,把最後的聲音當作是一個和隱藏的狀態序列十分類似的能夠觀察到的狀態的序列。在這兩個例子中,一個很是重要的地方是隱藏狀態的數目和能夠觀察到的狀態的數目多是不同的。在一個有3種狀態的天氣系統(sunny、cloudy、rainy)中,也許能夠觀察到4種潮溼程度的海藻(dry、dryish、damp、soggy)。在語音識別中,一個簡單的發言也許只須要80個語素來描述,可是一個內部的發音機制能夠產生不到80或者超過80種不一樣的聲音。
在上面的這些狀況下,能夠觀察到的狀態序列和隱藏的狀態序列是機率相關的。因而咱們能夠將這種類型的過程建模爲有一個隱藏的馬爾科夫過程和一個與這個隱藏馬爾科夫過程機率相關的而且能夠觀察到的狀態集合。這就是本文重點介紹的隱馬爾可夫模型。
隱馬爾可夫模型 (Hidden Markov Model) 是一種統計模型,用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中肯定該過程的隱含參數,而後利用這些參數來做進一步的分析。下圖是一個三個狀態的隱馬爾可夫模型狀態轉移圖,其中x 表示隱含狀態,y 表示可觀察的輸出,a 表示狀態轉換機率,b 表示輸出機率。
下圖顯示了天氣的例子中隱藏的狀態和能夠觀察到的狀態之間的關係。咱們假設隱藏的狀態是一個簡單的一階馬爾科夫過程,而且他們兩兩之間均可以相互轉換。
對 HMM 來講,有以下三個重要假設,儘管這些假設是不現實的。
假設1:馬爾可夫假設(狀態構成一階馬爾可夫鏈)
假設2:不動性假設(狀態與具體時間無關)
假設3:輸出獨立性假設(輸出僅與當前狀態有關)
隱藏的狀態和可觀察到的狀態之間有一種機率上的關係,也就是說某種隱藏狀態 H 被認爲是某個能夠觀察的狀態 O1 是有機率的,假設爲 P(O1 | H)。若是能夠觀察的狀態有3種,那麼很顯然 P(O1 | H)+P(O2 | H)+ P(O3 | H) = 1。
這樣,咱們也能夠獲得一個另外一個矩陣,稱爲混淆矩陣 (confusion matrix)。這個矩陣的內容是某個隱藏的狀態被分別觀察成幾種不一樣的能夠觀察的狀態的機率,在天氣的例子中,這個矩陣以下圖:
上邊的圖示都強調了 HMM 的狀態變遷。而下圖則明確的表示出模型的演化,其中綠色的圓圈表示隱藏狀態,紫色圓圈表示可觀察到狀態,箭頭表示狀態之間的依存機率,一個 HMM 可用一個5元組 { N, M, π,A,B } 表示,其中 N 表示隱藏狀態的數量,咱們要麼知道確切的值,要麼猜想該值,M 表示可觀測狀態的數量,能夠經過訓練集得到, π={πi} 爲初始狀態機率,A={aij} 爲隱藏狀態的轉移矩陣 Pr(xt(i) | xt-1(j)),B={bik} 表示某個時刻因隱藏狀態而可觀察的狀態的機率,即混淆矩陣,Pr(ot(i) | xt(j))。在狀態轉移矩陣和混淆矩陣中的每一個機率都是時間無關的,即當系統演化時,這些矩陣並不隨時間改變。對於一個 N 和 M 固定的 HMM 來講,用 λ={ π, A, B } 表示 HMM 參數。
在正常的馬爾可夫模型中,狀態對於觀察者來講是直接可見的。這樣狀態的轉換機率即是所有的參數。而在隱馬爾可夫模型中,狀態並非直接可見的,但受狀態影響的某些變量則是可見的。每個狀態在可能輸出的符號上都有一律率分佈。所以輸出符號的序列可以透露出狀態序列的一些信息。
在 HMM 中有三個典型問題:
(一) 已知模型參數,計算某一給定可觀察狀態序列的機率
假設咱們已經有一個特定的隱馬爾科夫模型 λ 和一個可觀察狀態序列集。咱們也許想知道在全部可能的隱藏狀態序列下,給定的可觀察狀態序列的機率。當給定以下一個隱藏狀態序列:
那麼在 HMM 和這個隱藏狀態序列的條件下,可觀察狀態序列的機率爲:
而隱藏狀態序列在 HMM 條件下的機率爲:
所以,隱藏狀態序列和可觀察狀態序列的聯合機率爲:
那麼全部可能的隱藏狀態序列上,可觀察狀態序列的機率爲:
例如,咱們也許有一個海藻的「Summer」模型和一個「Winter」模型,由於海藻在夏天和冬天的狀態應該是不一樣的,咱們但願根據一個可觀察狀態(海藻的潮溼與否)序列來判斷如今是夏天仍是冬天。
咱們可使用前向算法來計算在某個特定的 HMM 下一個可觀察狀態序列的機率,而後據此找到最可能的模型。
這種類型的應用一般出如今語音設別中,一般咱們會使用不少 HMM,每個針對一個特別的單詞。一個可觀察狀態的序列是從一個能夠聽到的單詞向前獲得的,而後這個單詞就能夠經過找到知足這個可觀察狀態序列的最大機率的 HMM 來識別。
下面介紹一下前向算法 (Forward Algorithm)
如何計算一個可觀察序列的機率?
1. 窮舉搜索
給定一個 HMM,咱們想計算出某個可觀察序列的機率。考慮天氣的例子,咱們知道一個描述天氣和海藻狀態的 HMM,並且咱們還有一個海藻狀態的序列。假設這個狀態中的某三天是(dry,damp,soggy),在這三天中的每一天,天氣均可能是晴朗,多雲或者下雨,咱們能夠用下圖來描述觀察序列和隱藏序列:
在這個圖中的每一列表示天氣的狀態可能,而且每一個狀態都指向相鄰的列的每一個狀態,每一個狀態轉換在狀態轉移矩陣中都有一個機率。每一列的下面是當天的可觀察的海藻的狀態,在每種狀態下出現這種可觀察狀態的機率是由混淆矩陣給出的。
一個可能的計算可觀察機率的方法是找到每個可能的隱藏狀態的序列,這裏有32 = 27種,這個時候的可觀察序列的機率就是 Pr(dry, damp, soggy | HMM)=Pr(dry, damp, soggy | sunny, sunny, sunny) + . . . . + Pr(dry, damp, soggy | rainy, rainy, rainy)。
很顯然,這種計算的效率很是低,尤爲是當模型中的狀態很是多或者序列很長的時候。事實上,咱們能夠利用機率不隨時間變化這個假設來下降時間的開銷。
2. 使用遞歸來下降複雜度
咱們能夠考慮給定 HMM 的狀況下,遞歸的計算一個可觀察序列的機率。咱們能夠首先定義一個部分機率,表示達到某個中間狀態的機率。接下來咱們將看到這些部分機率是如何 在time=1 和 time = n (n > 1) 的時候計算的。
假設一個T時間段的可觀察序列是:
1) 部分機率
下面這張圖表示了一個觀察序列(dry,damp,soggy)的一階轉移
咱們能夠經過計算到達某個狀態的全部路徑的機率和來計算到達某個中間狀態的機率。好比說,t=2時刻,cloudy的機率用三條路徑的機率之和來表示:
咱們用 αt(j) 來表示在 t 時刻是狀態 j 的機率,αt(j)=Pr(觀察狀態 | 隱藏狀態 j ) x Pr(t 時刻到達狀態 j 的全部路徑)。
最後一個觀察狀態的部分機率就表示了整個序列最後達到某個狀態的全部可能的路徑的機率和,好比說在這個例子中,最後一列的部分狀態是經過下列路徑計算獲得的:
由於最後一列的部分機率是全部可能的路徑的機率和,因此就是這個觀察序列在給定 HMM 下的機率了。
2) 計算 t=1時候的部分機率
當 t=1 的時候,沒有路徑到某個狀態,因此這裏是初始機率,Pr(狀態 j | t=0) = π(狀態 j ),這樣咱們就能夠計算 t=1 時候的部分機率爲:
由於在初始的時候,狀態 j 的機率不只和這個狀態自己相關,還和觀察狀態有關,因此這裏用到了混淆矩陣的值,k1 表示第一個觀察狀態,bjk1 表示隱藏狀態是 j,可是觀察成 k1 的機率。
3) 計算 t>1 時候的部分機率
仍是看計算部分機率的公式是:αt(j) = Pr(觀察狀態 | 隱藏狀態 j) x Pr(t 時刻到達狀態 j 的全部路徑)。 這個公式的左邊是從混淆矩陣中已知的,我只須要計算右邊部分,很顯然右邊是全部路徑的和:
須要計算的路徑數是和觀察序列的長度的平方相關的,可是 t 時刻的部分機率已經計算過了以前的全部路徑,因此在 t+1 時刻只須要根據 t 時刻的機率來計算就能夠了:
這裏簡單解釋下,bjk(t+1) 就是在 t+1 時刻的第 j 個隱藏狀態被認爲是當前的觀察狀態的機率,後面一部分是全部t時刻的隱藏狀態到 t+1 時候的隱藏狀態j的轉移的機率的和。這樣咱們每一步的計算均可以利用上一步的結果,節省了不少時間。
4) 公式推導
5) 下降計算複雜度
咱們能夠比較窮舉和遞歸算法的複雜度。假設有一個 HMM,其中有 n 個隱藏狀態,咱們有一個長度爲 T 的觀察序列。
窮舉算法的須要計算全部可能的隱藏序列:
須要計算:
很顯然窮舉算法的時間開銷是和 T 指數相關的,即 NT,而若是採用遞歸算法,因爲咱們每一步均可以利用上一步的結果,因此是和 T 線性相關的,即複雜度是 N2T。
這裏咱們的目的是在某個給定的 HMM 下,計算出某個可觀察序列的機率。咱們經過先計算部分機率的方式遞歸的計算整個序列的全部路徑的機率,大大節省了時間。在 t=1 的時候,使用了初始機率和混淆矩陣的機率,而在t時刻的機率則能夠利用 t-1 時刻的結果。
這樣咱們就能夠用遞歸的方式來計算全部可能的路徑的機率和,最後,全部的部分機率的計算公式爲
使用天氣的例子,計算 t=2 時刻的 cloudy 狀態的機率方法如圖:
咱們使用前向算法在給定的一個 HMM 下計算某個可觀察序列的機率。前向算法主要採用的是遞歸的思想,利用以前的計算結果。有了這個算法,咱們就能夠在一堆 HMM 中,找到一個最知足當前的可觀察序列的模型(前向算法計算出來的機率最大)。
(二) 根據可觀察狀態的序列找到一個最可能的隱藏狀態序列
和上面一個問題類似的而且更有趣的是根據可觀察序列找到隱藏序列。在不少狀況下,咱們對隱藏狀態更有興趣,由於其包含了一些不能被直接觀察到的有價值的信息。好比說在海藻和天氣的例子中,一個隱居的人只能看到海藻的狀態,可是他想知道天氣的狀態。這時候咱們就可使用 Viterbi 算法來根據可觀察序列獲得最優可能的隱藏狀態的序列,固然前提是已經有一個 HMM。
另外一個普遍使用 Viterbi 算法的領域是天然語言處理中的詞性標註。句子中的單詞是能夠觀察到的,詞性是隱藏的狀態。經過根據語句的上下文找到一句話中的單詞序列的最有可能的隱藏狀態序列,咱們就能夠獲得一個單詞的詞性(可能性最大)。這樣咱們就能夠用這種信息來完成其餘一些工做。
下面介紹一下維特比算法 (Viterbi Algorithm)
一.如何找到可能性最大的隱藏狀態序列?
一般咱們都有一個特定的 HMM,而後根據一個可觀察狀態序列去找到最可能生成這個可觀察狀態序列的隱藏狀態序列。
1. 窮舉搜索
咱們能夠在下圖中看到每一個隱藏狀態和可觀察狀態的關係。
經過計算全部可能的隱藏序列的機率,咱們能夠找到一個可能性最大的隱藏序列,這個可能性最大的隱藏序列最大化了 Pr(觀察序列 | 隱藏狀態集)。好比說,對於上圖中的可觀察序列 (dry damp soggy),最可能的隱藏序列就是下面這些機率中最大的:
Pr(dry, damp, soggy | sunny, sunny, sunny), ……,Pr(dry, damp, soggy | rainy, rainy, rainy)
這個方法是可行的,可是計算代價很高。和前向算法同樣,咱們能夠利用轉移機率在時間上的不變性來下降計算的複雜度。
2. 使用遞歸下降複雜度
在給定了一個可觀察序列和HMM的狀況下,咱們能夠考慮遞歸的來尋找最可能的隱藏序列。咱們能夠先定義一個部分機率 δ,即到達某個中間狀態的機率。接下來咱們將討論如何計算 t=1 和 t=n (n>1) 的部分機率。
注意這裏的部分機率和前向算法中的部分機率是不同的,這裏的部分機率表示的是在t時刻最可能到達某個狀態的一條路徑的機率,而不是全部機率之和。
1) 部分機率和部分最優路徑
考慮下面這個圖以及可觀察序列 (dry, damp, soggy) 的一階轉移
對於每個中間狀態和終止狀態 (t=3) 都有一個最可能的路徑。好比說,在 t=3 時刻的三個狀態都有一個以下的最可能的路徑:
咱們能夠稱這些路徑爲部分最優路徑。這些部分最優路徑都有一個機率,也就是部分機率 δ。和前向算法中的部分機率不同,這裏的機率只是一個最可能路徑的機率,而不是全部路徑的機率和。
咱們能夠用 δ(i, t) 來表示在t時刻,到狀態i的全部可能的序列(路徑)中機率最大的序列的機率,部分最優路徑就是達到這個最大機率的路徑,對於每個時刻的每個狀態都有這樣一個機率和部分最優路徑。
最後,咱們經過計算 t=T 時刻的每個狀態的最大機率和部分最優路徑,選擇其中機率最大的狀態和它的部分最優路徑來獲得全局的最優路徑。
2) 計算 t=1 時刻的部分機率
當 t=1 時刻的時候,到達某個狀態最大可能的路徑還不存在,可是咱們能夠直接使用在 t=1 時刻某個狀態的機率和這個狀態到可觀察序列 k1 的轉移機率:
3) 計算 t>1 時刻的部分機率
接下來咱們能夠根據 t-1 時刻的部分機率來求 t 時刻的部分機率
咱們能夠計算全部到狀態 X 的路徑的機率,找到其中最可能的路徑,也就是局部最優路徑。注意到這裏,到達X的路徑必然會通過 t-1 時刻的 A、B 和 C,因此咱們能夠利用以前的結果。達到X的最可能的路徑就是下面三個之一:
(狀態序列),. . .,A,X (狀態序列),. . .,B,X (狀態序列),. . .,C,X
咱們須要作的就是找到以 AX、BX 和 CX 結尾的路徑中機率最大的那個。
根據一階馬爾科夫的假設,一個狀態的發生之和以前的一個狀態有關係,因此X在某個序列的最後發生的機率只依賴於其以前的一個狀態:
Pr (到達A的最優路徑) . Pr (X | A) . Pr (觀察狀態 | X)
有個了這個公式,咱們就能夠利用t-1時刻的結果和狀態轉移矩陣和混淆矩陣的數據:
將上面這個表達式推廣一下,就能夠獲得 t 時刻可觀察狀態爲 kt 的第 i 個狀態的最大部分機率的計算公式:
其中 aji 表示從狀態 j 轉移到狀態 i 的機率,bikt 表示狀態i被觀察成 kt 的機率。
4) 後向指針
考慮下圖
在每個中間狀態和結束狀態都有一個部分最優機率 δ(i, t)。可是咱們的目的是找到最可能的隱藏狀態序列,因此咱們須要一個方法去記住部分最優路徑的每個節點。
考慮到要計算 t 時刻的部分機率,咱們只須要知道 t-1 時刻的部分機率,因此咱們只須要記錄那個致使了 t 時刻最大部分機率的的狀態,也就是說,在任意時刻,系統都必須處在一個能在下一時刻產生最大部分機率的狀態。以下圖所示:
咱們能夠利用一個後向指針 φ 來記錄致使某個狀態最大局部機率的前一個狀態,即
這裏 argmax 表示能最大化後面公式的j值,一樣能夠發現這個公式和 t-1 時刻的部分機率和轉移機率有關,由於後向指針只是爲了找到「我從哪裏來」,這個問題和可觀察狀態沒有關係,因此這裏不須要再乘上混淆矩陣因子。全局的行爲以下圖所示:
5) 優勢
使用 viterbi 算法對一個可觀察狀態進行解碼有兩個重要的優勢:
a) 經過使用遞歸來減小複雜度,這點和以前的前向算法是同樣的
b) 能夠根據可觀察序列找到最優的隱藏序列,這個的計算公式是:
其中
這裏就是一個從左往右翻譯的過程,經過前面的翻譯結果獲得後面的結果,起始點是初始向量 π。
3. 補充
但在序列某個地方有噪聲干擾的時候,某些方法可能會和正確答案相差的較遠。可是 Viterbi 算法會查看整個序列來決定最可能的終止狀態,而後經過後向指針來找到以前的狀態,這對忽略孤立的噪聲很是有用。
Viterbi 算法提供了一個根據可觀察序列計算隱藏序列的很高效的方法,它利用遞歸來下降計算複雜度,而且使用以前所有的序列來作判斷,能夠很好的容忍噪聲。
在計算的過程當中,這個算法計算每個時刻每個狀態的部分機率,而且使用一個後向指針來記錄達到當前狀態的最大可能的上一個狀態。最後,最可能的終止狀態就是隱藏序列的最後一個狀態,而後經過後向指針來查找整個序列的所有狀態。
(三) 根據觀察到的序列集來找到一個最有可能的 HMM。
在不少實際的狀況下,HMM 不能被直接的判斷,這就變成了一個學習問題,由於對於給定的可觀察狀態序列 O 來講,沒有任何一種方法能夠精確地找到一組最優的 HMM 參數 λ 使 P(O | λ) 最大,因而人們尋求使其局部最優的解決辦法,而前向後向算法(也稱爲Baum-Welch算法)就成了 HMM學習問題的一個近似的解決方法。
前向後向算法首先對於 HMM 的參數進行一個初始的估計,但這個極可能是一個錯誤的猜想,而後經過對於給定的數據評估這些參數的的有效性並減小它們所引發的錯誤來更新 HMM 參數,使得和給定的訓練數據的偏差變小,這實際上是機器學習中的梯度降低的思想。
對於網格中的每個狀態,前向後向算法既計算到達此狀態的「前向」機率,又計算生成此模型最終狀態的「後向」機率,這些機率均可以經過前面的介紹利用遞歸進行高效計算。能夠經過利用近似的 HMM 模型參數來提升這些中間機率從而進行調整,而這些調整又造成了前向後向算法迭代的基礎。
另外,前向後向算法是 EM 算法的一個特例,它避免了 EM 算法的暴力計算,而採用動態規劃思想來解決問題,Jelinek 在其書《Statistical Methods for Speech Recognition》中對前向後向算法與 EM 算法的關係進行了詳細描述,有興趣的讀者能夠參考這本書。
相似於上面講到的前向算法,咱們也能夠定義後向變量 βt(i) 來計算給定當前隱藏狀態 i 時,部分觀察序列 ot+1,ot+2,…,oT的機率,即:
與前向算法相似,咱們也能夠經過迭代算法有效計算 βt(i),計算公式以下:
其中
進一步咱們能夠發現
所以
下面開始介紹前向後向算法。
首先咱們須要定義兩個輔助變量,這兩個變量能夠用前文介紹過的前向變量和後向變量進行定義。
第一個變量定義爲 t 時狀態 i 和 t+1 時狀態 j 的機率,即
該變量在網格中所表明的關係以下圖所示:
該等式等價於
利用前向變量和後向變量,上式能夠表示爲
第二個變量定義爲後驗機率,也就是在給定觀察狀態序列和 HMM 的狀況下,t 時狀態 i 的機率,即
利用前向變量和後向變量,上式能夠表示爲
所以,下式爲在任意時刻狀態 i 的指望,也就是從狀態 i 轉移到觀察狀態 o 的指望
一樣,下式也就是從狀態 i 轉移到狀態 j 的指望
咱們能夠發現定義的這兩個變量之間的關係爲
下面介紹前向後向算法的參數學習過程,在學習的過程當中,不斷更新 HMM 的參數,從而使得 P(O | λ) 最大。咱們假設初始的 HMM 參數爲 λ={ π, A, B },首先計算前向變量 α 和後向變量 β,再根據剛剛介紹的公式計算指望 ξ 和 ζ,最後,根據下面的3個重估計公式更新 HMM 參數。
若是咱們定義當前的 HMM 模型爲 λ={ π,A,B },那麼能夠利用該模型計算上面三個式子的右端;咱們再定義從新估計的 HMM 模型爲,那麼上面三個式子的左端就是重估的 HMM 模型參數。Baum 及他的同事在70年代證實了
,所以若是咱們迭代地計算上面三個式子,由此不斷地從新估計 HMM 的參數,那麼在屢次迭代後能夠獲得 HMM 模型的一個最大似然估計。不過須要注意的是,前向後向算法所得的這個最大似然估計是一個局部最優解。
參考資料:
1. http://blog.csdn.net/eaglex/article/details/6376826
2. http://en.wikipedia.org/wiki/Markov_chain
3. http://en.wikipedia.org/wiki/Hidden_Markov_model
4. Lawrence R. Rabiner, A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 77 (2), p. 257–286, February 1989.
5. L. R. Rabiner and B. H. Juang, 「An introduction to HMMs,」 IEEE ASSP Mag., vol. 3, no. 1, pp. 4-16, 1986.
6. http://jedlik.phy.bme.hu/~gerjanos/HMM/node2.html
7. http://www.cs.brown.edu/research/ai/dynamics/tutorial/Documents/HiddenMarkovModels.html
8. 隱馬爾可夫模型簡介,劉羣