1. Beam Search算法概述
Beam Search(束搜索)是一种广泛应用于序列生成任务的启发式搜索算法,特别是在自然语言处理领域。它通过维护一个固定大小的候选序列集合(称为beam width或beam size),在每一步扩展时只保留概率最高的几个候选,从而在搜索质量和计算效率之间取得平衡。
提示:Beam Search不是贪婪算法,也不是穷举搜索,而是介于两者之间的折中方案。
我在实际NLP项目中发现,当处理机器翻译、文本摘要、对话生成等任务时,Beam Search相比简单的贪婪解码(greedy decoding)能显著提升生成质量。例如在Transformer模型中,合理的beam size设置可以使BLEU分数提升3-5个点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理深度解析
2.1 基本工作流程
Beam Search的工作流程可以分为以下几个关键步骤:
- 初始化:从起始token(如
<sos>)开始,初始化一个包含k个空序列的集合(k=beam size) - 扩展候选:对当前每个序列,计算下一个token的概率分布
- 选择候选:对所有可能的扩展序列,保留概率最高的k个
- 终止判断:遇到结束token(如
<eos>)时将该序列标记为完成 - 输出结果:当所有序列都完成或达到最大长度时,返回得分最高的序列
python复制# 伪代码示例
def beam_search(model, beam_width=5, max_len=50):
sequences = [[[start_token], 0.0]] # (sequence, score)
for _ in range(max_len):
all_candidates = []
for seq, score in sequences:
if seq[-1] == end_token:
all_candidates.append((seq, score))
continue
next_probs = mod
