文章目录
- 1. 前言
- 2. 原理
- 3. 举例
- 4. 参考
1. 前言
Beam Search 是一种启发式图搜索算法,用于在图或树的搜索过程中寻找最有可能的路径。它常用于自然语言处理(NLP)中的序列生成任务,如机器翻译、语音识别和文本生成等。与穷举搜索(如广度优先搜索)不同,Beam Search 通过限制搜索过程中的候选节点数量来提高效率,从而在保证搜索质量的同时减少计算资源的消耗。
2. 原理
Beam Search 的核心思想是维护一个固定大小的候选列表(称为 beam),在每一步中,算法只保留最有可能的几个候选节点,而不是考虑所有可能的节点。这个“最有可能”的判断通常基于节点的累积得分,该得分是节点从起始点到当前节点路径的得分之和。
以下是 Beam Search 的基本步骤:
-
初始化:将起始节点(通常是序列的开始标记)加入到候选列表中,并将其得分设为0。
-
扩展节点:对于候选列表中的每个节点,生成所有可能的后继节点,并计算每个后继节点的得分。
-
选择和更新:根据得分,从所有生成的后继节点中选择得分最高的 beam 个节点,将它们加入到候选列表中,并更新它们的得分。
-
终止条件:重复步骤2和3,直到达到预设的终止条件,例如达到序列的最大长度,或者候选列表中没有新的节点生成。
-
选择最终结果:从候选列表中选择得分最高的节点作为搜索结果。
Beam Search 的关键参数是 beam 的宽度,即在每一步中保留的候选节点数量。beam 的宽度越大,搜索过程越接近穷举搜索,计算成本也越高;beam 的宽度越小,搜索过程越快,但可能丢失一些好的候选节点。
在实际应用中,Beam Search 已被证明是一种有效的搜索策略,特别是在处理具有大量可能输出的复杂序列生成任务时。通过调整 beam 的宽度,可以在搜索质量和计算效率之间取得平衡。
3. 举例
下面是 Beam Search 生成句子的具体例子,从 start
token 开始,最终生成 the green witch arrived
:
Beam Search 不是在每个时间步选择最佳的生成词元,而是在每一步保留 k(束宽 beam width) 个可能的词元,k 可以根据需要调整得更宽或更窄。
在解码的第一步,计算整个词汇表上的 softmax 函数,给每个词分配一个概率。然后从这个 softmax 输出中选择 k 个最佳选项。这些初始的 k 个输出构成了搜索前沿,这 k 个初始词被称为假设 (hypotheses)。一个假设是一个输出序列,即到目前为止的翻译 + 概率。
在后续步骤中,每个最佳假设通过分别传递给不同的解码器而逐步扩展,这些解码器各自在全部词汇表上生成一个 softmax 函数以将假设扩展到每一个可能的下一个词元。
每个这样的 k ∗ V k*V k∗V 个假设都通过 P ( y i ∣ x , y < i ) P(y_i | x, y < i) P(yi∣x,y<i) 来评分:当前词选择的概率乘以导致该路径的概率。然后我们将 k ∗ V k*V k∗V 个假设裁剪到 k 个最佳假设,因此搜索前沿始终不超过 k 个假设,且不会同时存在超过 k 个解码器。
4. 参考
https://stackoverflow.com/questions/22273119/what-does-the-beam-size-represent-in-the-beam-search-algorithm
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
欢迎关注知乎/CSDN:SmallerFL
也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤