简介
部分参考简书文章【Beam Search原理及应用】 和 【Beam_search集束搜索】.
一种启发式图搜索算法,通常用在图的解空间比较大的情况下,为了减少搜索所占用的空间和时间,在每一步深度扩展的时候,剪掉一些质量比较差的结点,保留下一些质量较高的结点。
这样减少了空间消耗,并提高了时间效率,但缺点就是有可能存在潜在的最佳方案被丢弃,因此,Beam Search算法是不完全的,一般用于解空间较大的系统中。
步骤
Beam Search的一般步骤为:
1、初始化beam_size个序列,序列均为空,这些序列称之为beam paths;
2、取下一个Frame的前N个候选值(N一般为beam size或者更大,Frame内部侯选值已按照概率倒序排列),与已存在的beam paths组合形成N * beam_size条路径,称之为prob_paths;
3、对prob_paths进行打分,取前beam_size个prob_path作为新的beam paths;
4、若解码结束则完成算法,否则回到步骤2。
总结
经典的beam search算法以最大后验概率作为优化目标函数,每一个time step只保留B个最优的状态(B表示集束宽度),是一种典型的贪心算法。
beam search可以看做是做了约束优化的广度优先搜索,首先使用广度优先策略建立搜索树,树的每层,按照启发代价对节点进行排序,然后仅留下预先确定的个数(Beam width,集束宽度)的节点,仅这些节点在下一层次继续扩展,其他节点被剪切掉。
BS尝试在广度优先基础上进行进行搜索空间的优化(类似于剪枝)达到减少内存消耗的目的。
其中,集束宽度B可以是预先定好的,也可以是变动的,可以先按照一个最小的集束宽度进行搜索,如果没有找到合适的解,再扩大集束宽度再找一遍。
当集束宽度B=1时,该算法退化为传统的贪心算法。
当集束宽度B无穷大,该算法就是广度优先搜索。
应用
这个算法常常被用于解码可选状态数量多的情形,比如生成对话、生成图片描述、机器翻译等,每一步都有词表大小的可选状态集。
多适用于机器翻译,语音识别,当系统的数据集比较大,计算资源受限,而且没有唯一最优解时,该算法能够较快的找到接近最正确的解。
在sequence2sequence模型中,beam search的方法只用在测试的情况,因为在训练过程中,每一个decoder的输出是有正确答案的,也就不需要beam search去加大输出的准确率。