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,因此这个序列是最终获得的结果。

集束搜索本质上也是贪心的思想,只不过它考虑了更多的候选搜索空间,所以能够获得更多的翻译结果。