首先給出wiki地址:http://en.wikipedia.org/wiki/Beam_search
1.簡介
Beam Search(集束搜索)是一種啟發式圖搜索算法,通常用在圖的解空間比較大的情況下,為了減少搜索所占用的空間和時間,在每一步深度擴展的時候,剪掉一些質量比較差的結點,保留下一些質量較高的結點。這樣減少了空間消耗,並提高了時間效率,但缺點就是有可能存在潛在的最佳方案被丟棄,因此Beam Search算法是不完全的,一般用於解空間較大的系統中。
2.流程
Beam Search(集束搜索)使用廣度優先策略建立搜索樹,在樹的每一層,按照啟發代價對節點進行排序,然后僅留下預先確定的個數(Beam Width-集束寬度)的節點,僅這些節點在下一層次繼續擴展,其他節點就被剪掉了。如果集束寬度無窮大,那該搜索就是寬度優先搜索。
|
集束寬度可以是預先定好的,也可以是變動的,可以先按照一個最小的集束寬度進行搜索,如果沒有找到合適的解,再擴大集束寬度再找一遍。
Ps. 個人認為集束搜索方法其實提供了一種找最優解的思路,就是說在適當的情況下,可以剪掉一些可信度低的路徑,在實際使用中,可以每一層的集束寬度不一致,比如在初始的一些層次中多保留一些結果,在后邊就可以放心大膽的進行剪枝。當然也可以活學活用,可以結合深度優先算法,通過回溯,可以找到最優解。
3.應用
Beam Search(集束搜索)多用在一些大型系統中,比如機器翻譯系統,語音識別系統等,因為這些系統中的數據集可能非常大,而且結果也沒有唯一正確的解,系統用最快的方式找到最接近正確的解才是系統的目標。
解碼是seq2seq模型的常見問題,常用方法有貪心搜索(Greedy Search)集束搜索(Beam Search)。
簡單貪心搜索
From [1]
如圖,Decoder根據Encoder的中間語義編碼向量cc和<s>標簽得到第一個輸出的概率分布[0.1,0.1,0.3,0.4,0.1][0.1,0.1,0.3,0.4,0.1],選擇概率最大的0.4,即moi。
根據隱向量h1h1和moi得到第二個輸出的概率分布[0.1,0.1,0.1,0.1,0.6][0.1,0.1,0.1,0.1,0.6],選擇概率最大的0.6,即suis。
以此類推,直到遇到<\s>標簽,得到最終的序列moi suis étudiant。
集束搜索
上面的貪心搜索只選擇了概率最大的一個,而集束搜索則選擇了概率最大的前k個。這個k值也叫做集束寬度(Beam Width)。
還是以上面的例子作為說明,k值等於2,則集束搜索的過程如下圖:
得到第一個輸出的概率分布[0.1,0.1,0.3,0.4,0.1][0.1,0.1,0.3,0.4,0.1],選擇概率最大的前兩個,0.3和0.4,即Je和moi。
然后Je和moi分別作為Decoder的輸入,得到兩個概率分布,然后再選擇概率和最大的前兩個序列,0.3+0.8和0.4+0.6,即Je suis和moi suis。
以此類推,最終可以得到兩個序列,即Je suis étudiant和moi suis étudiant,很明顯前者的概率和最大,為2.2,所以這個序列是最終得到的結果。
集束搜索本質上也是貪心的思想,只不過它考慮了更多的候選搜索空間,因此可以得到更多的翻譯結果。
References
[1] https://www.tensorflow.org/tutorials/seq2seq
---------------------
作者:加勒比海鮮
來源:CSDN
原文:https://blog.csdn.net/guolindonggld/article/details/79938567
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!