Beam Search 技术详解
搜索系列相关文章(置顶)
1.原始信息再加工:一文读懂倒排索引
2.慧眼识词:解析TF-IDF工作原理
3.超越TF-IDF:信息检索之BM25
4.深入浅出 Beam Search:自然语言处理中的高效搜索利器
1. 引言
Beam Search 是一种广泛应用于自然语言处理(NLP)、机器翻译、语音识别等序列生成任务中的启发式搜索方法。本文将详细探讨 Beam Search 的原理、实现步骤、应用场景及其优缺点,并通过具体例子帮助读者更好地理解这一技术。
2. 算法由来
2.1 背景与起源
Beam Search 最初是为了克服标准广度优先搜索(BFS)在大规模搜索空间中计算成本过高的问题而提出的。传统的 BFS 需要遍历所有可能的状态,这对于许多实际应用来说是不现实的。例如,在自动语音识别(ASR)和机器翻译(MT)中,输入输出通常是连续的符号流,这导致了巨大的搜索空间。
2.2 发展历程
早期的 NLP 和 ASR 系统使用贪婪算法逐个选择最有可能的下一个符号,但这往往忽略了全局最优解的可能性。为了解决这个问题,研究者们提出了保留多个候选路径的方法,即所谓的“束”(beam)。随着技术的发展,Beam Search 成为了现代深度学习模型的标准组件之一,尤其是在基于神经网络的语言模型中。
3. Beam Search 的工作原理
3.1 初始化
假设我们有一个初始状态 (S_0) 和一个空的候选列表。Beam Search 会从这个初始状态开始,为每个时间步生成若干个候选状态,并从中挑选出最有可能的几个继续扩展。
3.2 扩展候选路径
- 设定束宽:首先设定一个固定的束宽 (k),即每次迭代时要保留的最佳候选路径数量。
- 生成新候选:对于当前保存的所有路径,在每个路径末端添加新的符号(例如单词或字符),形成新的候选路径。
- 评分与排序:根据某种评分函数(如对数概率)对所有新生成的候选路径进行打分,并按分数降序排列。
- 剪枝:只保留前 (k) 条得分最高的候选路径,其余路径被丢弃。
- 重复上述步骤,直到达到预设的最大长度或者所有候选路径都终止为止。
3.3 终止条件
当满足以下任一条件时,Beam Search 算法终止:
- 达到预定义的最大序列长度;
- 没有更多有效的候选路径可以扩展;
- 所有路径均已到达终止符号(如句号或其他结束标记)。
3.4 输出结果
一旦算法终止,通常会选择得分最高的完整路径作为最终输出。如果需要多个输出,则可以选择前几名的完整路径。
3.5 举几个 🌰🌰🌰
3.5.1 简单的语言模型任务
假设我们正在进行一个简单的语言模型任务,要生成句子“I am a student”。我们的候选词在每个时间步都来自一个有限的词汇表。我们从“I”开始生成序列。
-
第一步:从“I”出发,选择下一个单词。假设当前候选词和它们的概率(或得分)如下:
- “am”(概率 = 0.6)
- “is”(概率 = 0.2)
- “was”(概率 = 0.1)
- “I”(概率 = 0.1)
假设我们选择Beam Width = 2,因此我们保留得分最高的2个候选单词:“am”(得分0.6)和“is”(得分0.2)。
-
第二步:继续生成下一个单词。对于每个序列,我们根据模型的得分选择下一个词。假设得分如下:
- 对于“I am”(从“am”继续):“a”(概率 = 0.5),“the”(概率 = 0.3),“an”(概率 = 0.2)
- 对于“I is”(从“is”继续):“am”(概率 = 0.4),“was”(概率 = 0.3),“a”(概率 = 0.2)
我们再次选择Beam Width = 2,所以保留概率最大的2个候选项:“I am a”(得分0.6 × 0.5 = 0.3)和“I am the”(得分0.6 × 0.3 = 0.18),以及“I is am”(得分0.2 × 0.4 = 0.08)和“I is was”(得分0.2 × 0.3 = 0.06)中的前两个较高者,即“I is am”。
-
第三步:继续为每个候选序列添加下一个单词。假设得分如下:
- 对于“I am a”(从“a”继续):“student”(概率 = 0.7),“teacher”(概率 = 0.2),“doctor”(概率 = 0.1)
- 对于“I am the”(从“the”继续):“student”(概率 = 0.6),“man”(概率 = 0.3),“teacher”(概率 = 0.1)
继续选择Beam Width = 2,保留得分最高的两个候选:“I am a student”(得分0.3 × 0.7 = 0.21)和“I am the student”(得分0.18 × 0.6 = 0.108)。
-
最终选择:假设我们已经达到了序列的结束条件(比如长度或特殊的结束符),最后选择“I am a student”作为最优序列。
3.5.2 简单的语言模型任务机器翻译任务
假设我们有一个简单的英文到中文的机器翻译系统,输入句子为“I am happy”,候选翻译和它们的得分如下:
-
第一步:从“I”出发,选择下一个中文词。假设得分如下:
- “我”(概率 = 0.8)
- “他”(概率 = 0.1)
- 其他(概率 = 0.1)
选择Beam Width = 2,保留“我”(得分0.8)和“他”(得分0.1)。
-
第二步:继续生成下一个中文词。对于每个序列,我们根据模型的得分选择下一个词。假设得分如下:
- 对于“我”(从“I”继续):“是”(概率 = 0.6),“很”(概率 = 0.3)
- 对于“他”(从“I”继续):“是”(概率 = 0.5),“不”(概率 = 0.4)
选择Beam Width = 2,保留“我是”(得分0.8 × 0.6 = 0.48)和“我很”(得分0.8 × 0.3 = 0.24),以及“他是”(得分0.1 × 0.5 = 0.05)和“他不”(得分0.1 × 0.4 = 0.04)中的前两个较高者,即“他是”被舍弃。
-
第三步:继续为每个候选序列添加下一个中文词。假设得分如下:
- 对于“我是”(从“是”继续):“快乐”(概率 = 0.7),“高兴”(概率 = 0.2)
- 对于“我很”(从“很”继续):“高兴”(概率 = 0.6),“快乐”(概率 = 0.3)
选择Beam Width = 2,保留得分最高的两个候选:“我是快乐”(得分0.48 × 0.7 = 0.336)和“我很高兴”(得分0.24 × 0.6 = 0.144)以及“我很快乐”(得分0.24 × 0.3 = 0.072)中的较高者,即“我很快乐”被舍弃。
-
最终选择:假设我们已经达到了序列的结束条件(比如长度或特殊的结束符),最后选择“我是快乐”作为最优翻译,但考虑到中文习惯,“我很高兴”也是合理的翻译,只是在这个例子中,它的得分稍低。
4. 实现细节
4.1 评分函数
Beam Search 的核心在于如何有效地评估每个候选路径的质量。常用的评分函数包括:
4.1.1 负对数似然性 (Negative Log Likelihood, NLL)
对于给定的概率分布 P ( x ) P(x) P(x),计算负对数似然性(NLL):
NLL ( x ) = − log P ( x ) \text{NLL}(x) = -\log P(x) NLL(x)=−logP(x)
较低的 NLL 表示较高的概率。在序列生成任务中,我们通常考虑整个序列 x 1 , x 2 , … , x T x_1, x_2, \dots, x_T x1,x