Viterbi Algorithm(維特比)演算法

2022-08-23 15:03:11 字數 2576 閱讀 9170

csdn部落格:皮乾東 

知乎:htrying 

微博:htring的微博 

viterbi-algorithm演算法

維特比演算法是乙個特殊但應用最廣的動態規劃演算法。利用動態規劃,可以解決任何乙個圖中的最短路徑問題。而維特比演算法是針對乙個特殊的圖-籬笆網了(lattice)的有向圖最短路徑問題而提出來的。它之所以重要,是因為凡是使用隱馬爾科夫模型描述的問題都可以用它解碼,包括當前的數字通訊、語音識別、機器翻譯、拼音轉漢字、分詞等。

背景假定使用者(盲打時)輸入的拼音時y1,y2,...,yny1,y2,...,yn,對應的漢字是x1,x2,...,xnx1,x2,...,xn(雖然真正的輸入法產品都是以詞作為輸入單位的,為了便於說明問題及簡單起見,以字為單位來解釋維特比演算法),那麼根據當前介紹的工具:

x1,x2,...,xn=argmaxx∈xp(x1,x2,...,xn|y1,y2,...,yn)=argmaxx∈x∏ni=1p(yi|xi)p(xi|xi−1)x1,x2,...,xn=argmaxx∈x⁡p(x1,x2,...,xn|y1,y2,...,yn)=argmaxx∈x⁡∏i=1np(yi|xi)p(xi|xi−1) (1)

輸入的可見序列為y1,y2,...,yny1,y2,...,yn,而產生他們的隱含序列是x1,x2,...,xnx1,x2,...,xn。可以用下圖描述這樣乙個過程: 

這是乙個相對簡單的隱馬爾科夫鏈,沒用狀態跳躍,也沒有自環。p(xi|xi−1)p(xi|xi−1)是狀態之間的轉移概率,p(yi|xi)p(yi|xi)是每個狀態的產生概率。現在,這個馬爾科夫鏈的每個狀態的輸出是固定,但是每個狀態的值可以變化。比如輸出讀音」zhong」的字可以是」中」、」種「等多個字。我們不妨抽象一點,用符號xijxij表示狀態xixi的第jj個可能的值。如果把每個狀態按照不同的值展開,就得到下面這個籬笆網路(lattice):

在上圖中,每個狀態有3個或4個值,當然時間中它們可以有任意個值。

那麼從第乙個狀態到最後乙個狀態的任何一條路徑(path)都可能產生我們觀察到的輸出序列y。當然這些路徑的可能性不一樣,而我們要做的就是找到最可能的這條路徑,並不是很難。但麻煩的是這樣的路徑組合數非常多,會讓序列狀態數的增長呈指數式增長。漢語中每個無聲調的拼音對應13個左右的國標漢字,假定句子長為10個字,那麼這個組合數為1310∼5×10141310∼5×1014這個計算量就相當的大了。因此,需要乙個最好能和狀態數目成正比的演算法,而這個演算法在2023年首次提出,即維特比演算法。

主要內容

維特比演算法基礎

1.如果概率最大的路徑p(或者說是最短路徑)經過某個點,比如下圖中的x22x22,那麼這條路徑上從起始點s到x22x22的這一段路徑q,一定是s到x22x22之間的最短路徑。否則,用s到x22x22的最短路徑r代替q,便構成了一條比p更短的路徑,這就和之前的假設矛盾了。

2.從s到e路徑必定經過第i時刻的某個狀態,假定第i時刻有k個狀態,那麼如果記錄了從s到i個狀態的所有k個節點(所有時刻的所有狀態)的最短路徑,最終的最短路徑必經過其中的一條。這樣,在任何時刻,只要考慮非常有限條候選路徑即可。

3.結合以上兩點,假定當我們從狀態i進入到i+1時,從s到i上各個節點的最短路徑已經找到,並且記錄到這些節點上,那麼在計算出從起點s到第i+1狀態的某個結點的最短路徑時,只要考慮從s到前乙個狀態i所有的k個節點的最短路徑,以及從這k個節點到xi+1,jxi+1,j的距離即可。 

維特比演算法

1.從點s觸發,對於第乙個狀態x1x1的各個節點,不妨假定有n1n1個,計算出s到它們的距離d(s,x1i)d(s,x1i),這裡的x1ix1i表示的是狀態1的節點,因為只有一步,所以這些都是s到它們各自的最短路徑。

2.(演算法的關鍵)對於第二個狀態x2x2的所有節點,要計算s到它們的最短距離,我們知道,對於特定的節點x2ix2i,可以經過狀態1的n1n1中的任何乙個節點x1ix1i,當然,對應的路徑長度就是d(s,x2i)=d(s,x1j)+d(x1j,x2i)d(s,x2i)=d(s,x1j)+d(x1j,x2i)。由於j有n1n1種可能性,我們要一一計算,然後找出最小值。即

d(s,x2i)=mini=1,n1d(s,x1j)+d(x1j,x2i)d(s,x2i)=mini=1,n1d(s,x1j)+d(x1j,x2i)

這樣對於第二個狀態的每個節點,需要進行n1n1次乘法計算。假定這個狀態有n2n2個節點,把s這些節點的距離都計算一遍,就有o(n1⋅n2)o(n1⋅n2)次計算。

接下來,類似地按照上述方法從第二個狀態走到第三個狀態,一直走到最好乙個狀態,就得到了整個網格從頭到尾的最短路徑。每一步計算的複雜度都和相鄰兩個狀態sisi和si+1si+1各自的節點數目ni,ni+1ni,ni+1的乘積成正比,即o(ni⋅ni+1)o(ni⋅ni+1)。如果假定這個在這個隱含馬爾可夫鏈中節點最多的狀態有d個節點,也就是說整個網格的寬度為d,那麼任何一步的複雜度不超過o(d2)o(d2),由於網格長度是n,所以整個維特比演算法的複雜度是o(n⋅d2)o(n⋅d2).

回到最初的問題中,計算量基本上是13×13×10=1690≈10313×13×10=1690≈103,這樣就降低了很大的計算量。

總的來說,無論在語音識別、輸入法打字中,輸入都是按照流(stream)的方式進行的,只要處理每個狀態的時間比講話,或者打字速度,那麼無論輸入有多長,解碼過程永遠就是實時的。 

--------------------- 

原文: 

維特比演算法

維特比演算法在機器學習中非常重要,在求解隱馬爾科夫和條件隨機場的 問題中均用到了維特比演算法。實際上,維特比演算法不僅是很多自然語言處理的解碼演算法,也是現代數字通訊中使用最頻繁的演算法。以乙個簡單的隱馬爾科夫模型為例,n 為觀測符號,y y1,y2,y n 為隱狀態序列,要求的 問題為 y 1,y...

維特比演算法

維特比演算法主要用來解決籬笆網路,老實講我第一次聽到這個名字是發懵的,網路我是知道的,說白了就是圖 迪傑特斯拉演算法 但是,籬笆網路是值下面這種一列一列的圖,只會前面連線到後面,而且不會跳層連線,可以說是一種非常特殊且友好的圖了 正常的圖能逼死強迫症 x max xx x x x xma x x 這...

維特比演算法 python 維特比演算法實現分詞

維特比演算法原理可以參考以下文章,講解的非常詳細,那麼接下來將講解維特比演算法如何應用到分詞演算法中,並如何用python 實現。如何通俗地講解 viterbi 演算法?www.zhihu.com 一 過程分析 句子 經常有意見分歧 詞典 經常 經 有 有意見 意見 分歧 見 意 見分歧 分 概率 ...