Beam Search(集束搜索/束搜索)

 

首先給出wiki地址:http://en.wikipedia.org/wiki/Beam_search算法

1.簡介post

Beam Search(集束搜索)是一種啓發式圖搜索算法,一般用在圖的解空間比較大的狀況下,爲了減小搜索所佔用的空間和時間,在每一步深度擴展的時候,剪掉一些質量比較差的結點,保留下一些質量較高的結點。這樣減小了空間消耗,並提升了時間效率,但缺點就是有可能存在潛在的最佳方案被丟棄,所以Beam Search算法是不徹底的,通常用於解空間較大的系統中。ui

2.流程編碼

Beam Search(集束搜索)使用廣度優先策略創建搜索樹,在樹的每一層,按照啓發代價對節點進行排序,而後僅留下預先肯定的個數(Beam Width-集束寬度)的節點,僅這些節點在下一層次繼續擴展,其餘節點就被剪掉了。若是集束寬度無窮大,那該搜索就是寬度優先搜索。.net

  • 將初始節點插入到list中,
  • 將給節點出堆,若是該節點是目標節點,則算法結束;
  • 不然擴展該節點,取集束寬度的節點入堆。而後到第二步繼續循環。
  • 算法結束的條件是找到最優解或者堆爲空。

 

集束寬度能夠是預先定好的,也能夠是變更的,能夠先按照一個最小的集束寬度進行搜索,若是沒有找到合適的解,再擴大集束寬度再找一遍。翻譯

Ps. 我的認爲集束搜索方法其實提供了一種找最優解的思路,就是說在適當的狀況下,能夠剪掉一些可信度低的路徑,在實際使用中,能夠每一層的集束寬度不一致,好比在初始的一些層次中多保留一些結果,在後邊就能夠放心大膽的進行剪枝。固然也能夠活學活用,能夠結合深度優先算法,經過回溯,能夠找到最優解。code

3.應用blog

Beam Search(集束搜索)多用在一些大型系統中,好比機器翻譯系統,語音識別系統等,由於這些系統中的數據集可能很是大,並且結果也沒有惟一正確的解,系統用最快的方式找到最接近正確的解纔是系統的目標。排序


 

 

解碼是seq2seq模型的常見問題,經常使用方法有貪心搜索(Greedy Search)集束搜索(Beam Search)。ip

簡單貪心搜索

 

 

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,因此這個序列是最終獲得的結果。

集束搜索本質上也是貪心的思想,只不過它考慮了更多的候選搜索空間,所以能夠獲得更多的翻譯結果。