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。