关于 集束搜索(Beam Search Algorithm )的个人思考

最近比较闲啦~是大四上学期 去了研究生导师那里 所以就开始瞎学习了一些知识 打算把一些自己学的记录下来啦~

1.概念

Beam Search(集束搜索):是一种启发式图搜索算法,在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。

 好处:减少了空间消耗,并提高了时间效率。

(补充说明:启发式搜索是利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的)


2.过程

Beam Search(集束搜索):使用广度优先策略建立搜索树在树的每一层,按照启发代价对节点进行排序,然后仅留下预先确定的个数(Beam Width-集束宽度)的节点,仅这些节点在下一层次继续扩展,其他节点就被剪掉了。

(注意:如果集束宽度无穷大,那该搜索就是宽度优先搜索)

步骤如下:

1.将初始节点插入到list中,

2.将给节点出堆,如果该节点是目标节点,则算法结束;

3.否则扩展该节点,取集束宽度的节点入堆。然后到第二步继续循环。

4.算法结束的条件是找到最优解或者堆为空。


3.图解(来自引用)




关于 集束搜索(Beam Search Algorithm )的个人思考_第1张图片

得到第一个输出的概率分布[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,所以这个序列是最终得到的结果。 

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


(贪心思想:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解)

参考来源:https://blog.csdn.net/guolindonggld/article/details/79938567 



4.补充

其他应用:

在seq2seq中在test阶段使用了beam search来寻找解码时最优的结果,我们假设集束宽度为2,词典大小为3 设为(a,b,c),那么其解码过程如下所示:

1.生成第1个词的时候,选择概率最大的2个词,假设为a,c,那么当前序列就是a,c;

2.生成第2个词的时候,我们将当前序列a和c,分别与词表中的所有词进行组合,得到新的6个序列aa ab ac ca cb cc,然后从其中选择2个得分最高的,作为当前序列,加入aa cb

3.后面不断重复这个过程,直到遇到结束符为止。最终输出2个得分最高的序列

参考来源:beam search算法 - wolfrevoda的专栏 - CSDN博客


finally~

 第一篇 希望自己以后可以坚持鸭~

又是不想学习的一天呢~

你可能感兴趣的:(关于 集束搜索(Beam Search Algorithm )的个人思考)