beam search 搜索算法

假設一個搜索任務

假設如今有一個簡化版的中文翻譯英文任務,輸入和輸出以下,爲了方便描述搜索算法,限制輸出詞典只有{"I", "H", "U"} 這3個候選詞,限制1個時間步長翻譯1個漢字,1個漢字對應1個英文單詞,這裏總共3個漢字,因此只有3個時間步長。算法

中文輸入:"我" "恨" "你"
英文輸出:"I" "H" "U"

目標:獲得最優的翻譯序列 I-H-U翻譯

exhaustive search(窮舉搜索)

最直觀的方法就是窮舉全部可能的輸出序列,3個時間步長,每一個步長3種選擇,共計 [公式]種排列組合。code

I-I-I
I-I-H
I-I-U
I-H-I
I-H-H
I-H-U
I-U-I
I-U-H
I-U-U

H-I-I
H-I-H
H-I-U
H-H-I
H-H-H
H-H-U
H-U-I
H-U-H
H-U-U

U-I-I
U-I-H
U-I-U
U-H-I
U-H-H
U-H-U
U-U-I
U-U-H
U-U-U

從全部的排列組合中找到輸出條件機率最大的序列。窮舉搜索能保證全局最優,但計算複雜度過高,當輸出詞典稍微大一點根本沒法使用。blog

greedy search(貪心搜索)

貪心算法在翻譯每一個字的時候,直接選擇條件機率最大的候選值做爲當前最優。以下圖因此,class

  • 第1個時間步長:首先翻譯"我",發現候選"I"的條件機率最大爲0.6,因此第一個步長直接翻譯成了"I"。
  • 第2個時間步長:翻譯"我恨",發現II機率0.2,IH機率0.7,IU機率0.1,因此選擇IH做爲當前步長最優翻譯結果。
  • 第3個時間步長:翻譯"我恨你",發現IHI機率0.05,IHH機率0.05,IHU機率0.9,因此選擇IHU做爲最終的翻譯結果。

PS:圖中的機率如何得來的?不一樣的模型有不一樣的算法,我本身隨便填的。效率

greedy search搜索

貪心算法每一步選擇中都採起在當前狀態下最好或最優的選擇,經過這種局部最優策略指望產生全局最優解。可是指望是好的,能不能實現是另一回事了。貪心算法本質上沒有從總體最優上加以考慮,並不能保證最終的結果必定是全局最優的。可是相對窮舉搜索,搜索效率大大提高。方法

beam search(束搜索)

beam search是對greedy search的一個改進算法。相對greedy search擴大了搜索空間,但遠遠不及窮舉搜索指數級的搜索空間,是兩者的一個折中方案。im

beam search有一個超參數beam size(束寬),設爲 [公式] 。第一個時間步長,選取當前條件機率最大的 [公式] 個詞,當作候選輸出序列的第一個詞。以後的每一個時間步長,基於上個步長的輸出序列,挑選出全部組合中條件機率最大的 [公式] 個,做爲該時間步長下的候選輸出序列。始終保持 [公式]個候選。最後從 [公式] 個候選中挑出最優的。top

仍是以上面的任務爲例,假設 [公式] ,咱們走一遍這個搜索流程。

  • 第一個時間步長:以下圖所示,I和H的機率是top2,因此第一個時間步長的輸出的候選是I和H,將I和H加入到候選輸出序列中。

beam search 第一個時間步長

  • 第2個時間步長:以下圖所示,以I開頭有三種候選{II, IH, IU},以H開頭有三種候選{HI, HH, HU}。從這6個候選中挑出條件機率最大的2個,即IH和HI,做爲候選輸出序列。

beam search 第二個時間步長

  • 第3個時間步長:同理,以IH開頭有三種候選{IHI, IHH, IHU},以HI開頭有三種候選{HII, HIH, HIU}。從這6個候選中挑出條件機率最大的2個,即IHH和HIU,做爲候選輸出序列。由於3個步長就結束了,直接從IHH和IHU中挑選出最優值IHU做爲最終的輸出序列。

beam search 第三個時間步長

  • beam search不保證全局最優,可是比greedy search搜索空間更大,通常結果比greedy search要好。
  • greedy search 能夠看作是 beam size = 1時的 beam search。