自然語言處理之維特比(Viterbi)算法

維特比算法 (Viterbi algorithm) 是機器學習中應用非常廣泛的動態規劃算法,在求解隱馬爾科夫、條件隨機場的預測以及seq2seq模型概率計算等問題中均用到了該算法。實際上,維特比算法不僅是很多自然語言處理的解碼算法,也是現代數字通信中使用最頻繁的算法。在介紹維特比算法之前,先回顧一下隱馬爾科夫模型,進而介紹維特比算法的計算步驟


以下爲一個簡單的隱馬爾科夫模型,如下圖所示:



其中x = (x1, x2, ..., xN) 爲隱狀態序列,y = (y1, y2, ..., yN) 爲觀測序列,要求的預測問題爲:


依據馬爾科夫假設,上式等價於:


在隱馬爾科夫鏈中,任意時刻t下狀態的值有多個,以拼音轉漢字爲例,輸入拼音爲“yike”可能有的值爲一棵,一刻或者是一顆等待,用符號xij表示狀態xi的第j個可能值,將狀態序列按值展開,就得到了一個籬笆網了,這也就是維特比算法求解最優路徑的圖結構:


隱馬爾科夫的預測問題就是要求圖中的一條路徑,使得該路徑對應的概率值最大。 對應上圖來講,假設每個時刻x可能取的值爲3,如果直接求的話,有3^N的組合數,底數3爲籬笆網絡寬度,指數N爲籬笆網絡的長度,計算量非常大。維特比利用動態規劃的思想來求解概率最大路徑(可理解爲求圖最短路徑),使得複雜度正比於序列長度,複雜度爲O(NDD), N爲長度,D爲寬度,從而很好地解決了問題的求解。


維特比算法的基礎可以概括爲下面三點(來源於吳軍:數學之美): 


1、如果概率最大的路徑經過籬笆網絡的某點,則從開始點到該點的子路徑也一定是從開始到該點路徑中概率最大的。 


2、假定第i時刻有k個狀態,從開始到i時刻的k個狀態有k條最短路徑,而最終的最短路徑必然經過其中的一條。 


3、根據上述性質,在計算第i+1狀態的最短路徑時,只需要考慮從開始到當前的k個狀態值的最短路徑和當前狀態值到第i+1狀態值的最短路徑即可,如求t=3時的最短路徑,等於求t=2時的所有狀態結點x2i的最短路徑加上t=2到t=3的各節點的最短路徑。


爲了紀錄中間變量,引入兩個變量sigma和phi,定義t時刻狀態爲i的所有單個路徑 (i1, i2, ..., it) 中最大概率值(最短路徑)爲(前文小修已經有介紹隱馬爾科夫相關的概念,如果不清楚可以看一下前面的詳解隱馬爾可夫模型 (HMM) ):


其中it表示最短路徑,Ot表示觀測符號,lamda表示模型參數,根據上式可以得出變量sigma的遞推公式:


其中i = 1, 2, ..., N; t = 1, 2, ... , T-1,定義在時刻t狀態爲i的所有單個路徑 (i1, i2, ..., it, i) 中概率最大的路徑的第t-1個結點爲:


根據上面的兩個定義下面給出維特比算法具體內容:

輸入爲模型和觀測狀態分別爲:


輸出爲求出最優路徑:


步驟爲:(1) 初始化各參數:


(2) 根據上式進行遞推,對t=2, 3, ..., T


(3) 最後計算終止狀態:



最優路徑的回溯,對t=T-1, T-2,..., 1


最後求得最優路徑:


以上就是維特比算法的主要過程和內容,下面介紹一個個例子。在自然語言處理技術中的seq2seq模型中,如下圖所示:


其實seq2seq模型的核心就是:


其中e和f就是相應的輸出和輸入序列,在進行解碼的時候,如果詞袋中的個數爲V個,那麼那麼輸出長度爲N的序列,則需要的總共搜索V^N次,如果N的個數非常之大,這樣的搜索非常耗時間,那麼這個時候使用維特比算法就會大大的降低搜索的時間。這裏假設詞袋中只有a和b,而且它們之間的轉變概率爲:



在這時使用維特比算法,其主要的思想爲:


其中s(v,n) 表示的是以v結尾的最大概率的序列的概率,t(i, j, n)爲第n-1步從i跳到第n步的j的概率。根據算法可以得到:



因此最終輸出的序列爲bba,


在這裏最後說一點就是,其實對於seq2seq有相應的算法對整個序列的輸出進行搜索計算 (beam search算法),其思想和維特比算法非常相似,這裏不做介紹,下次有機會給大家介紹。


參考書目:

[1] 統計學習方法,李航

文章來源於微信公衆號:言處理技術,更多內容請訪問該公衆號。


歡迎關注公衆號學習




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章