一句话定义:束搜索(Beam Search)是一种序列生成的解码策略——每生成一个词,它同时保留若干条当前得分最高的候选序列,走到最后,再从这些候选里挑出整体得分最高的一条作为输出。
为什么不能每步都挑最好的
语言模型每生成一个词,都会给出「下一个词是谁」的概率分布。最朴素的做法是每步只挑概率最高的那个词接上去,这叫贪心解码(Greedy Decoding)。它快,但有个毛病:眼下最顺的那个词,未必通向整句最顺的句子。就像开车只认眼前最近的一个路口右转,很可能绕远路。
想找全局最优,理论上得把所有组合都试一遍。可词表动辄几万个词,句子长十几二十个词,组合数是天文数字,穷举根本算不动。束搜索是这两者之间的折中。
打个比方:选秀海选
想象一场选秀。每一轮,评委只让当前累计得分排前 k 名的人晋级,其余全部淘汰;下一轮,这 k 个人各自再往下发展,重新打分排名,还是只留前 k 名。这里的 k 叫束宽(beam width),通常取一个不大的值,工程上常见的是个位数到十几之间,具体看任务和算力。
对应到生成句子上就是:第一步留下 k 个最优的起始词;每个起始词各自试所有可能的第二个词,得到 k×词表 个候选,只留总分最高的 k 个;如此一步步推进,直到所有候选都生成了结束符。最后把 k 条完整序列按总分排序,取第一名。
代价是:算力大约是贪心解码的 k 倍,因为每步要维护 k 条路径。
打分与长度惩罚
由于概率连乘容易数值下溢,实现上一般转成对数概率相加。又因为连乘天然偏爱短句(乘得少、掉得少),通常会引入长度惩罚(length penalty)做归一化,否则模型容易草草收尾。这两个都是工程细节,具体实现以所用框架的官方文档为准。
和相邻概念的区别
| 策略 | 每步保留多少候选 | 特点 |
|---|---|---|
| 贪心解码 Greedy | 1 条 | 最快,容易卡在局部最优 |
| 束搜索 Beam Search | k 条 | 质量通常更好,算力约 k 倍 |
| 穷举搜索 | 全部 | 理论最优,实际算不起 |
| 随机采样 Sampling | 按概率随机抽 | 多样性好,适合开放创作 |
注意束搜索并不保证全局最优:早期被淘汰的那条路径,后面未必不能翻盘。它是启发式近似。
对从业者的实际意义
任务性质决定选哪个。机器翻译、语音识别、OCR 这类「正确答案相对唯一」的任务,束搜索长期是默认选项,因为你要的就是那句话本身。而到了开放对话、写故事、文案生成,束搜索往往让输出变得平庸、保守、爱重复——它挑的是概率最高的句子,而概率最高的句子常常最没意思。这类场景通常改用采样(top-k、top-p)。
调参上也有个反直觉的点:束宽调大不一定更好。收益递减,成本线性上涨,还可能出现长度偏差。一般做法是先定任务类型,再在小范围内扫一遍。
---
一句话记住:贪心是只留一个尖子生,穷举是全班都升学,束搜索是每次只让前 k 名晋级。
