HMM之前向算法(forward algorithms)

    初學HMM,可能會第一次對如此多的數學公式,理論和推理感到頭暈,發現這篇文章,能比較好的理解前向算法,關於HMM的筆記,隨後呈上。

1.窮舉搜索( Exhaustive search for solution)
  給定隱馬爾科夫模型,也就是在模型參數(pi, A, B)已知的情況下,我們想找到觀察序列的概率。還是考慮天氣這個例子,我們有一個用來描述天氣及與它密切相關的海藻溼度狀態的隱馬爾科夫模型(HMM),另外我們還有一個海藻的溼度狀態觀察序列。假設連續3天海藻溼度的觀察結果是(乾燥、溼潤、溼透)——而這三天每一天都可能是晴天、多雲或下雨,對於觀察序列以及隱藏的狀態,可以將其視爲網格:
網格
  網格中的每一列都顯示了可能的的天氣狀態,並且每一列中的每個狀態都與相鄰列中的每一個狀態相連。而其狀態間的轉移都由狀態轉移矩陣提供一個概率。在每一列下面都是某個時間點上的觀察狀態,給定任一個隱藏狀態所得到的觀察狀態的概率由混淆矩陣提供。
  可以看出,一種計算觀察序列概率的方法是找到每一個可能的隱藏狀態,並且將這些隱藏狀態下的觀察序列概率相加。對於上面那個(天氣)例子,將有3^3 = 27種不同的天氣序列可能性,因此,觀察序列的概率是:
   Pr(dry,damp,soggy | HMM) = Pr(dry,damp,soggy | sunny,sunny,sunny) + Pr(dry,damp,soggy | sunny,sunny ,cloudy) + Pr(dry,damp,soggy | sunny,sunny ,rainy) + . . . . Pr(dry,damp,soggy | rainy,rainy ,rainy)
  用這種方式計算觀察序列概率極爲昂貴,特別對於大的模型或較長的序列,因此我們可以利用這些概率的時間不變性來減少問題的複雜度。

2.使用遞歸降低問題複雜度
  給定一個隱馬爾科夫模型(HMM),我們將考慮遞歸地計算一個觀察序列的概率。我們首先定義局部概率(partial probability),它是到達網格中的某個中間狀態時的概率。然後,我們將介紹如何在t=1和t=n(>1)時計算這些局部概率。
  假設一個T-長觀察序列是:
     t-long 序列
  
 2a.局部概率(alpha’s)
  考慮下面這個網格,它顯示的是天氣狀態及對於觀察序列乾燥,溼潤及溼透的一階狀態轉移情況:
   trellis.1
  我們可以將計算到達網格中某個中間狀態的概率作爲所有到達這個狀態的可能路徑的概率求和問題。
  例如,t=2時位於“多雲”狀態的局部概率通過如下路徑計算得出:
   paths.to.cloudy
  我們定義t時刻位於狀態j的局部概率爲at(j)——這個局部概率計算如下:
  alphat ( j )= Pr( 觀察狀態 | 隱藏狀態j ) x Pr(t時刻所有指向j狀態的路徑)
  對於最後的觀察狀態,其局部概率包括了通過所有可能的路徑到達這些狀態的概率——例如,對於上述網格,最終的局部概率通過如下路徑計算得出:
   alphas.at.t_eq_3
  由此可見,對於這些最終局部概率求和等價於對於網格中所有可能的路徑概率求和,也就求出了給定隱馬爾科夫模型(HMM)後的觀察序列概率。
  


計算觀察序列的概率(Finding the probability of an observed sequence)

2b.計算t=1時的局部概率alpha’s
  我們按如下公式計算局部概率:
  alphat ( j )= Pr( 觀察狀態 | 隱藏狀態j ) x Pr(t時刻所有指向j狀態的路徑)
  特別當t=1時,沒有任何指向當前狀態的路徑。故t=1時位於當前狀態的概率是初始概率,即Pr(state|t=1)=P(state),因此,t=1時的局部概率等於當前狀態的初始概率乘以相關的觀察概率:
         5.2_2
  所以初始時刻狀態j的局部概率依賴於此狀態的初始概率及相應時刻我們所見的觀察概率。

2c.計算t>1時的局部概率alpha’s
  我們再次回顧局部概率的計算公式如下:
  alphat ( j )= Pr( 觀察狀態 | 隱藏狀態j ) x Pr(t時刻所有指向j狀態的路徑)
  我們可以假設(遞歸地),乘號左邊項“Pr( 觀察狀態 | 隱藏狀態j )”已經有了,現在考慮其右邊項“Pr(t時刻所有指向j狀態的路徑)”。
  爲了計算到達某個狀態的所有路徑的概率,我們可以計算到達此狀態的每條路徑的概率並對它們求和,例如:
      allpath
  計算alpha所需要的路徑數目隨着觀察序列的增加而指數級遞增,但是t-1時刻alpha’s給出了所有到達此狀態的前一路徑概率,因此,我們可以通過t-1時刻的局部概率定義t時刻的alpha’s,即:
     5.1.2.3_1
  故我們所計算的這個概率等於相應的觀察概率(亦即,t+1時在狀態j所觀察到的符號的概率)與該時刻到達此狀態的概率總和——這來自於上一步每一個局部概率的計算結果與相應的狀態轉移概率乘積後再相加——的乘積。
  注意我們已經有了一個僅利用t時刻局部概率計算t+1時刻局部概率的表達式。
  現在我們就可以遞歸地計算給定隱馬爾科夫模型(HMM)後一個觀察序列的概率了——即通過t=1時刻的局部概率alpha’s計算t=2時刻的alpha’s,通過t=2時刻的alpha’s計算t=3時刻的alpha’s等等直到t=T。給定隱馬爾科夫模型(HMM)的觀察序列的概率就等於t=T時刻的局部概率之和。

2d.降低計算複雜度
  我們可以比較通過窮舉搜索(評估)和通過遞歸前向算法計算觀察序列概率的時間複雜度。
  我們有一個長度爲T的觀察序列O以及一個含有n個隱藏狀態的隱馬爾科夫模型l=(pi,A,B)。
  窮舉搜索將包括計算所有可能的序列:
   5.1.2.4_1
  公式
    5.1.2.4_2
  對我們所觀察到的概率求和——注意其複雜度與T成指數級關係。相反的,使用前向算法我們可以利用上一步計算的信息,相應地,其時間複雜度與T成線性關係。
注:窮舉搜索的時間複雜度是2TN^T,前向算法的時間複雜度是N^2T,其中T指的是觀察序列長度,N指的是隱藏狀態數目。

3.總結
  我們的目標是計算給定隱馬爾科夫模型HMM下的觀察序列的概率——Pr(observations |lamda)。
  我們首先通過計算局部概率(alpha’s)降低計算整個概率的複雜度,局部概率表示的是t時刻到達某個狀態s的概率。
  t=1時,可以利用初始概率(來自於P向量)和觀察概率Pr(observation|state)(來自於混淆矩陣)計算局部概率;而t>1時的局部概率可以利用t-時的局部概率計算。
  因此,這個問題是遞歸定義的,觀察序列的概率就是通過依次計算t=1,2,…,T時的局部概率,並且對於t=T時所有局部概率alpha’s相加得到的。
  注意,用這種方式計算觀察序列概率的時間複雜度遠遠小於計算所有序列的概率並對其相加(窮舉搜索)的時間複雜度。


我們使用前向算法計算T長觀察序列的概率:
     5.2_1
  其中y的每一個是觀察集合之一。局部(中間)概率(alpha’s)是遞歸計算的,首先通過計算t=1時刻所有狀態的局部概率alpha
     5.2_2
  然後在每個時間點,t=2,… ,T時,對於每個狀態的局部概率,由下式計算局部概率alpha:
     5.2_3
  也就是當前狀態相應的觀察概率與所有到達該狀態的路徑概率之積,其遞歸地利用了上一個時間點已經計算好的一些值。
  最後,給定HMM,lamda,觀察序列的概率等於T時刻所有局部概率之和:
     5.2_4
  再重複說明一下,每一個局部概率(t > 2 時)都由前一時刻的結果計算得出。
  對於“天氣”那個例子,下面的圖表顯示了t = 2爲狀態爲多雲時局部概率alpha的計算過程。這是相應的觀察概率b與前一時刻的局部概率與狀態轉移概率a相乘後的總和再求積的結果:
   example.forward

總結(Summary)

  我們使用前向算法來計算給定隱馬爾科夫模型(HMM)後的一個觀察序列的概率。它在計算中利用遞歸避免對網格所有路徑進行窮舉計算。
  給定這種算法,可以直接用來確定對於已知的一個觀察序列,在一些隱馬爾科夫模型(HMMs)中哪一個HMM最好的描述了它——先用前向算法評估每一個(HMM),再選取其中概率最高的一個。

發佈了29 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章