1. 程式人生 > >自然語言處理之維特比(Viterbi)演算法

自然語言處理之維特比(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] 統計學習方法,李航

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


歡迎關注公眾號學習