隱馬爾可夫模型的Viterbi解碼演算法

超人汪小建發表於2017-09-21

前言

前面在做自然語言處理時涉及到一些詞性標註的工作,一般會使用隱馬爾科夫模型(HMM)來實現詞性標註,而HMM模型的解碼實現演算法一般就會使用Viterbi演算法。

關於窮舉法

HMM模型有多種應用,這裡說的是其中一個常見應用,即根據觀察序列找到最可能的隱含狀態序列。最樸素的想法就是直接窮舉所有可能的隱含狀態序列,並計算出每個組合成的狀態序列的概率,概率最大的那個組合序列即是最可能的隱含狀態序列。舉個水藻和天氣的例子,窮舉出所有可能的隱含狀態序列的概率,如下,
P(dry,damp,soggy | sunny,sunny,sunny), P(dry,damp,soggy | sunny,sunny,cloudy), P(dry,damp,soggy | sunny,sunny,rainy), . . . . P(dry,damp,soggy | rainy,rainy,rainy),最大值對應的序列即為最可能的隱含狀態序列。窮舉的路徑一共有3的t次方條,可以看到隨著序列還有狀態數的增加,計算量是非常大的。

這裡寫圖片描述
這裡寫圖片描述

Viterbi演算法

上面的窮舉法需要的計算量很大,為減少複雜度引入Viterbi演算法,Viterbi演算法要解決的解碼問題就是多步且每步多重選擇的最優選擇的問題。根據下圖就能很清晰看到Viterbi的核心思想,隨著時刻增加,每個節點都儲存了前一時刻所有節點到該節點的最優值的子路徑,如圖中紅色箭頭,當前時刻的某一節點可能的路徑為上一時刻所有節點到該節點的路徑,但我們只保留其中一條最優路徑。依次計算完所有步後,最後通過回溯的方法得到整個過程的最優路徑。

這裡寫圖片描述
這裡寫圖片描述

下面用一個例子說明整個過程,假設有3中狀態,序列為t個時刻,p(a1)表示a1節點的值,p(b1)表示b1節點的值,同理其他的節點也一樣。對於不同時刻,狀態之間的轉換概率是不變的,所以p(aa)表示從a狀態轉移到a狀態的概率,不管是從1時刻到2時刻,還是從2時刻到3時刻,都是相同的。同理還有p(ab)、p(ac)、p(ba)...。

這裡寫圖片描述
這裡寫圖片描述

t+1時刻節點值的計算公式為


其中x,y都屬於a,b,c一種狀態。

我們計算t=2時刻的p(a)的值,它可能從a1到a2、b1到a2或c1到a2,假如a1到a2這條路徑計算出來的p(a)最大,那麼就保留該路徑。同理分別計算p(b)和p(c)的最大值,保留b1到b2的路徑,b1到c2的路徑。接著計算t=3時刻的p(a)、p(b)和p(c),最後到達t時刻,計算該時刻最大的p(a)、p(b)和p(c),選擇出它們最大的值的節點,再根據保留的上一時刻的路徑依次往前回溯,就得到最優的序列。比如ct是最大的節點,那就是


即最可能的序列為bcb...cc。

========廣告時間========

鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。

為什麼寫《Tomcat核心設計剖析》

=========================

歡迎關注:

這裡寫圖片描述
這裡寫圖片描述

相關文章