Beam Search 的原理是什么?它和 greedy decoding 有什么区别?相比随机采样有什么优缺点?为什么现代对话模型普遍不用它?
(用户未作答,由 AI 直接讲解。)
用户未给出个人回答,失去了发现自己理解盲区的机会。这道题考察的是对自回归生成解码策略的完整理解,回答时不仅要说出结论,更要能解释背后的机制细节——比如每步 forward pass 输出的是什么、为什么不需要逐 token 拼接、停止条件如何判断等。后续追问涉及概率计算和 KV Cache 机制,说明深入理解这些底层细节对面试准备非常重要。
Beam Search 是一种确定性解码策略,核心思想是每步不是只保留 1 个最优 token(greedy),也不是完全随机采样,而是在整个生成过程中始终维护 Top-B 条候选路径,B 就是 beam size。每次 forward pass,模型同时基于当前所有 B 条路径输出整个词表的概率分布——不需要像 naive 理解那样把每条路径的每个可能下一个 token 逐个拼接再计算,因为 KV Cache 已经缓存了每条路径的历史状态,一次前向传播就能并行得到 B 条路径各自的 logits,再经过 softmax 得到 B × |vocab| 的概率矩阵。对每条路径的每个候选 token,计算其 log 概率并累加到该路径的历史累积得分中,然后从 B × |vocab| 个候选里选出新的 Top-B 路径继续迭代,直到所有路径都遇到 <EOS> 或达到 max_tokens 为止,最终取累积 log 概率最高的那条完整路径作为输出。值得注意的是,当 beam size 等于 1 时,Beam Search 退化为 greedy decoding,所以 greedy 其实是 Beam Search 的一个特例。
与随机采样相比,Beam Search 的优势在于输出质量稳定、数学上能保证在局部搜索空间内找到较优解,适合机器翻译、OCR 纠错这类有"标准答案"的场景。但它的缺点也很明显:缺乏多样性,倾向于生成语法正确但内容保守甚至重复的回答;长文本生成中容易陷入循环(比如连续生成相同的 token);推理延迟随 beam size 线性增长,大 beam 会带来显著的显存和计算开销。
这正是为什么现代对话模型普遍不用 Beam Search。对话本质上没有标准答案,Beam Search 追求的"最优"往往是模型认为最安全、最无聊的回答,无法体现人类对话的自然性和多样性。相反,随机采样配合 temperature 和 top_p 机制,既能保持输出的流畅性和多样性,又能在质量和多样性之间灵活调节——这更符合开放域对话的需求,也因此成为 ChatGPT、Claude 等主流对话模型的标准解码策略。