維特比算法與beam search


  端到端現在越來越火,花了點時間了解。發現端到端的解碼用的都是beam search方法,而這種方法從理論上就不能得到最優解,為什么不能采用維特比算法呢?帶着這個問題,看了數篇網上的介紹文章,結合自己幾年做維特比解碼的理解,簡單整理了一下核心思想。

 

一、維特比算法

而維特比算法的精髓就是,既然知道到第i列所有節點Xi{j=123…}的最短路徑,那么到第i+1列節點的最短路徑就等於到第i列j個節點的最短路徑+第i列j個節點到第i+1列各個節點的距離的最小值。

參考:https://www.zhihu.com/question/20136144

 

二、beam search

舉個例子很容易說清楚:

seq2seq模型的decoder解碼的時候:

1: 生成第1個詞的時候,選擇概率最大的2個詞,假設為a,c,那么當前序列就是a,c
2:生成第2個詞的時候,我們將當前序列a和c,分別與詞表中的所有詞進行組合,得到新的6個序列aa ab ac ca cb cc,然后從其中選擇2個得分最高的,作為當前序列,假如為aa cb
3:后面會不斷重復這個過程,直到遇到結束符為止。最終輸出2個得分最高的序列。

簡單來說,beamsearch是每次選取概率最大的beam width個詞組作為結果,並將它們分別傳入下一個時刻的decode階段進行解碼得到新的組合序列,在從新的序列中選取最大的beam width個詞組,一直循環到結束。

 

三、對比greedy search和維特比算法

greedy search是beamsearch在beam width=1的情況下的特例。相對於greedy search,beamsearch實際上是增加了搜索空間,但也只能做到局部最優解,不一定是全局最優解。因為考慮到seq2seq的inference階段的搜索空間過大而導致的搜索效率降低,所以即使是一個相對的局部優解在工程上也是可接受的。

那么怎么能得到一個全局最優解呢?個人理解只能是beam width等於語料庫的大小時才能找到全局最優,當然這只是理論上,不存在應用上的可能,畢竟語料庫太大,也沒有必要。還有一種算法是可以reach全局最優解的,維特比算法,專為全局最優而生。但他是建立在前后隱狀態獨立的條件下的(維特比算法使用的假設前提是:全局最優解=各分段最優解之和),所以decoder不能用維特比算法的根本原因在於不獨立,隱狀態太大不是不能使用維特比算法的理由。

 

總結一下:維特比算法從理論上能夠得到最優解,beam search不能只能得到局部最后解。理由是維特比算法假設前后狀態之間是相互獨立的。

(viterbi有最優解是因為HMM每一步是條件獨立的!!!獨立!!!獨立!!!重要的事說三遍!既然后面的概率和前面的沒關系,那前面選最大的概率就行了!!!beam search時后面的概率依賴於前面所有的詞,相當於n-gram是滿的,viterbi的n-gram是2!)


作者:馬奔
鏈接:https://www.zhihu.com/question/54356960/answer/556706681
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 

四、關於beam search和維特比算法的時間復雜度

      設建模單元為N, beam size為K,解碼所需時間步驟為T:

      (1) 如果k=1,即為greedy search,時間復雜度為O(NT)

      (2)beam search,時間復雜度為O(KNT),局部最優

      (3)如果K=N,即維特比算法,時間復雜度為O(NNT),全局最優

 

參考:https://blog.csdn.net/pnnngchg/article/details/88082826

      https://blog.csdn.net/Ding_xiaofei/article/details/82287275

           

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM