1. 程式人生 > >隱馬爾科夫模型(HMMs)之五:維特比演算法及前向後向演算法

隱馬爾科夫模型(HMMs)之五:維特比演算法及前向後向演算法

維特比演算法(Viterbi Algorithm)

找到可能性最大的隱藏序列

通常我們都有一個特定的HMM,然後根據一個可觀察序列去找到最可能生成這個可觀察序列的隱藏序列。

1.窮舉搜尋

我們可以在下圖中看到每個狀態和觀察的關係。

re

通過計算所有可能的隱藏序列的概率,我們可以找到一個可能性最大的隱藏序列,這個可能性最大的隱藏序列最大化了Pr(observed sequence | hidden state combination)。比如說,對於上圖中的可觀察序列(dry damp soggy),最可能的隱藏序列就是下面這些概率中最大的:

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的情況下,我們可以考慮遞迴的來尋找最可能的隱藏序列。我們可以先定義一個部分概率d,既是到達某個中間狀態的概率。接下來我們將討論如果計算t = 1和t = n( n > 1)的部分概率。

注意這裡的部分概率和前向演算法中的部分概率是不一樣的,這裡的部分概率表示的是在t時刻最可能到達某個狀態的一條路徑的概率,而不是所有概率之和。

2a.部分概率和部分最優路徑

考慮下面這個圖以及可觀察序列(dry,damp,soggy)的一階轉移

部分概率

對於每一箇中間狀態和終止狀態(t = 3)都有一個最可能的路徑。比如說,在t=3時刻的三個狀態都有一個如下的最可能的路徑:

path

我們可以稱這些路徑為部分最優路徑。這些部分最優路徑都有一個概率,也就是部分概率d。和前向演算法中的部分概率不一樣,這裡的概率只是一個最可能路徑的概率,而不是所有路徑的概率和。

 我們可以用d (i,t)來表示在t時刻,到狀態i的所有可能的序列(路徑)中概率最大的序列的概率,部分最優路徑就是達到這個最大概率的路徑,對於每一個時刻的沒一個狀態都有這樣一個概率和部分最優路徑。

最後,我們通過計算t = T時刻的每一個狀態的最大概率和部分最優路徑,選擇其中概率最大的狀態和它的部分最優路徑來得到全域性的最優路徑。

2b.計算t = 1時刻的部分概率

當t=1時刻的時候,到達某個狀態最大可能的路徑還不存在,但是我們可以直接使用在t=1時刻某個狀態的概率和這個狀態到可觀察序列k1的轉移概率:

t = 1

2c.計算t >1 時刻的部分概率

接下來我們可以根據t - 1時刻的部分概率來求t 時刻的部分概率

t

我們可以計算所有到狀態X的路徑的概率,找到其中最可能的路徑,也就是區域性最優路徑。注意到這裡,到達X的路徑必然會經過t - 1時刻的A、B和C,所以我們可以利用之前的結果。達到X的最可能的路徑就是下面三個之一:

(sequence of states), . . ., A, X(sequence of states), . . ., B, Xor (sequence of states), . . ., C, X

我們需要做的就是找到以AX、BX和CX結尾的路徑中概率最大的那個。

根據一階馬爾科夫的假設,一個狀態的發生之和之前的一個狀態有關係,所以X在某個序列的最後發生的概率只依賴於其之前的一個狀態:

Pr (most probable path to A) . Pr (X | A) . Pr (observation | X)

有個了這個公式,我們就可以利用t - 1時刻的結果和狀態轉移矩陣和混淆矩陣的資料:

alg

將上面這個表示式推廣一下,就可以得到t時刻可觀察狀態為kt的第i個狀態的最大部分概率的計算公式:

gener

其中aji表示從狀態j轉移到狀態i的概率,bikt表示狀態i被觀察成kt的概率。

2d.後向指標

考慮下圖

back

在每一箇中間狀態和結束狀態都有一個部分最優概率d (i,t)。但是我們的目的是找到最可能的隱藏狀態序列,所以我們需要一個方法去記住部分最優路徑的每一個節點。

考慮到要計算t時刻的部分概率,我們只需要知道t-1時刻的部分概率,所以我們只需要記錄那個導致了t時刻最大部分概率的的狀態,也就是說,在任意的時刻,系統都必須處在一個能在下一時刻產生最大部分概率的狀態。我們可以利用一個後向指標f來記錄導致某個狀態最大部分概率的上一個狀態,形式化的描述為:

pointer

這裡argmax表示能最大化後面公式的j值,同樣可以發現這個公式之和t-1時刻的部分概率和轉移概率有關,因為後向指標只是為了找到“我從哪裡來”,這個問題和可觀察沒有關係,所以這裡不需要再乘上混淆因子。

2e.優點

使用viterbi演算法對一個可觀察狀態進行解碼有兩個重要的優點:

  1. 通過使用遞迴來減少複雜度,這點和之前的前想演算法是一樣的
  2. 可以根據可觀察序列找到最優的隱藏序列,這個的計算公式是:

exe

where

exet

這裡就是一個從左往右翻譯的過程,通過前面的翻譯結果得到後面的結果,起始點是初始向量p

2.補充

但在序列某個地方有噪聲干擾的時候,某些方法可能會和正確答案相差的較遠。

但是Viterbi演算法會檢視整個序列來決定最可能的終止狀態,然後通過後向指標來找到之前的狀態,這對忽略孤立的噪聲非常有用。

3.總結

Viterbi演算法提供了一個根據可觀察序列計算隱藏序列的很高效的方法,它利用遞迴來降低計算複雜度,並且使用之前全部的序列來做判斷,可以很好的容忍噪聲。

在計算的過程中,這個演算法計算每一個時刻每一個狀態的部分概率,並且使用一個後向指標來記錄達到當前狀態的最大可能的上一個狀態。最後,最可能的終止狀態就是隱藏序列的最後一個狀態,然後通過後向指標來查詢整個序列的全部狀態。

前向後向演算法(Forward-Backward Algorithm

和隱馬爾科夫模型相關的有趣的問題就是判斷一個模型的實用性(前向演算法)和找到一個隱藏在可觀察序列背後的隱藏序列(Viterbi演算法)。當然,這兩個過程都需要知道HMM的一些資訊,比如轉移矩陣,混淆矩陣以及初始的π向量。

但是在很多實際的情況下,HMM不能被直接的判斷,這就變成了一個學習問題,前向後向演算法可以根據一系列可觀察序列來對HMM進行評測。一個可能的例子就是一個很大的語音處理資料庫,語音序列可能被建模為一個馬爾科夫鏈,可觀察的序列可以被建模為可識別的狀態,但是不能直接獲得一些其他的相關資訊。

前向後向演算法理解起來並不困難,但是卻要比前向演算法和Viterbi演算法要複雜,所以這裡我們不再詳細的介紹。總的來說,這個演算法先對一些引數進行猜測,然後再通過評估這些引數的價值來修改這些引數,使得和給定的訓練資料的誤差變小,這其實是機器學習中的梯度下降的思想。

前向後向演算法的名稱來源於對於每一個狀態,這個演算法既要計算到達這一狀態的前一個狀態的概率,也要計算產生終止狀態的後向狀態的概率,這兩個概率都可以通過遞迴的方法來實現。對HMM引數的調整可以提高中間概率的準確性,並且這些調整是演算法迭代的基礎。

總結(summary)

通常一個特別的模式不是單獨的出現,而是作為某一個時間段下的序列出現。對於以時間為單位的過程有一個假設,一個狀態的出現之和其前N個時間單位的狀態有關係,這樣就是一個N階馬爾科夫鏈,最簡單的情況就是一階馬爾科夫鏈。

很多情況下,真實的狀態序列是不能被直接觀察到的,但是可以在一定概率下被間接觀察到,這個觀察的結果就是另一個可觀察的序列,這樣我們就可以定義一個隱馬爾科夫模型,這個模型在現在的某些領域體現了很大的價值,尤其是語音識別。

這種關於真實序列的模型有三個相關的問題:

  1. 評價:一個給定的模型在多大的概率下能產生某個可觀察的序列,這個問題可以用前向演算法來解決。
  2. 解碼:給定一個模型和某個可觀察序列,最可能的隱藏序列是什麼,這個問題可以用Viterbi演算法來解決。
  3. 學習:給定某個可觀察序列,怎麼知道這個模型的一些引數,這個問題可以用前向後向演算法來解決。

隱馬爾科夫模型在分析真實系統的時候表現出了巨大的價值,但是它也有一些缺點,一個最大的缺點就是由於之前的假設導致的過於簡化——一個狀態只依賴其之間的狀態,而且這種依賴是時間無關的。

參考資料

http://jedlik.phy.bme.hu/~gerjanos/HMM/node2.html

http://blog.csdn.net/eaglex/article/details/6376826(本文轉載出處)

L R Rabiner and B H Juang, `An introduction to HMMs', iEEE ASSP Magazine, 3, 4-16.