假設如今有一個簡化版的中文翻譯英文任務,輸入和輸出以下,爲了方便描述搜索算法,限制輸出詞典只有{"I", "H", "U"} 這3個候選詞,限制1個時間步長翻譯1個漢字,1個漢字對應1個英文單詞,這裏總共3個漢字,因此只有3個時間步長。算法
中文輸入:"我" "恨" "你"
英文輸出:"I" "H" "U"
目標:獲得最優的翻譯序列 I-H-U
翻譯
最直觀的方法就是窮舉全部可能的輸出序列,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
貪心算法在翻譯每一個字的時候,直接選擇條件機率最大的候選值做爲當前最優。以下圖因此,class
PS:圖中的機率如何得來的?不一樣的模型有不一樣的算法,我本身隨便填的。效率
greedy search搜索
貪心算法每一步選擇中都採起在當前狀態下最好或最優的選擇,經過這種局部最優策略指望產生全局最優解。可是指望是好的,能不能實現是另一回事了。貪心算法本質上沒有從總體最優上加以考慮,並不能保證最終的結果必定是全局最優的。可是相對窮舉搜索,搜索效率大大提高。方法
beam search是對greedy search的一個改進算法。相對greedy search擴大了搜索空間,但遠遠不及窮舉搜索指數級的搜索空間,是兩者的一個折中方案。im
beam search有一個超參數beam size(束寬),設爲 。第一個時間步長,選取當前條件機率最大的 個詞,當作候選輸出序列的第一個詞。以後的每一個時間步長,基於上個步長的輸出序列,挑選出全部組合中條件機率最大的 個,做爲該時間步長下的候選輸出序列。始終保持 個候選。最後從 個候選中挑出最優的。top
仍是以上面的任務爲例,假設 ,咱們走一遍這個搜索流程。
beam search 第一個時間步長
beam search 第二個時間步長
beam search 第三個時間步長