对于LLM来说,有好几种采样算法。但是要记住LLM既需要准确性也需要多样性。

前置基础(基于transformers官方库)

大语言模型是自回归生成:逐 token 预测,每一步基于上文输出词表 logits,通过解码算法选出下一个 token,循环直到输出结束符 EOS。
所有解码分为两大体系,由 do_sample 参数划分:

  1. 确定性解码 do_sample=False:无随机数介入,相同输入+相同参数,每次生成结果完全一致;包含贪婪、束搜索、多样束搜索
  2. 随机采样解码 do_sample=True:引入随机采样机制,每次生成文本存在差异;基础为多项式采样(softmax),搭配 Temperature、Top-K、Top-P 做约束优化。

Temperature、Top-K、Top-P 不属于独立解码算法,是概率分布修正工具,仅作用于采样流程。

一、贪婪解码 Greedy Search

原理

每一步拿到词表概率分布后,直接选取当前概率最大的 token 追加到序列。
会完整使用全部上文上下文计算当前分布,仅做局部最优选择,不回溯、不对比多条候选序列。

transformers 参数

num_beams=1, do_sample=Falsemodel.generate() 默认配置。

优缺点

优点:计算最简单、推理速度最快、输出稳定;
缺点:容易出现文本循环重复、局部语义生硬;无法一次性输出多条文本。

二、束搜索 Beam Search

原理

设置束宽 beam_size=K,每一步保留全局累计对数概率最高的 K 条完整候选序列(而非单个 token);
每轮将 K 条序列全部向前扩展,从所有新候选中重新筛选前 K 条高分序列;生成结束后,从全部完整序列里选出全局联合概率最高一条作为输出。
采用对数概率避免小数下溢,工业中常搭配 length_penalty 解决束搜索容易生成短句的缺陷。

transformers 参数

num_beams>1, do_sample=False
拓展:多样束搜索 num_beam_groups>1,可一次性输出多条风格差异明显的最优文本。

优缺点

优点:相比贪心,全局语义连贯性更好,重复问题大幅缓解;
缺点:依旧无随机性,创意类文本单调;算力开销高于贪心。

1. 解决什么问题?

贪心解码每一步只保留1条序列,只看当前最优token,容易陷入局部最优、句子重复、语义断裂。束搜索每一步保留 KKK 条候选序列(KKK 称为束宽 beam_size),在多条路径里全局择优,用少量算力换取整体文本连贯性。

2. 核心数学:序列对数累积概率

自回归序列 [x1,x2,...,xt][x_1,x_2,...,x_t][x1,x2,...,xt] 的联合概率:
P(x1,x2,...,xt)=∏i=1tP(xi∣x1,...,xi−1) P(x_1,x_2,...,x_t)=\prod_{i=1}^t P(x_i|x_1,...,x_{i-1}) P(x1,x2,...,xt)=i=1tP(xix1,...,xi1)
连续乘大量小于1的小数会出现数值下溢,工程统一取对数,乘积变累加:
log⁡P=∑i=1tlog⁡P(xi∣x1:i−1) \log P = \sum_{i=1}^t \log P(x_i|x_{1:i-1}) logP=i=1tlogP(xix1:i1)
束搜索比较的是每条完整序列的对数总分,分数越高代表这条句子整体越符合模型预期。

3. 分步执行流程(beam_size=2 举例)

输入prompt编码得到初始序列 S0S_0S0,初始分数 score=0\text{score}=0score=0

  1. 扩展候选
    对当前所有 KKK 条beam序列,分别走模型推理,得到词表每个token的log概率;
    每条序列生成词表大小 VVV 个新序列,总候选数量:K×VK\times VK×V
  2. 筛选Top-K高分序列
    把全部 K×VK\times VK×V 条扩展后的序列按总分从高到低排序,只保留前 KKK 条作为本轮新beam;丢弃其余低分路径。
  3. 终止判断
    只要某条beam末尾生成 EOS 结束符,就把这条序列存入最终候选池;
  • 若收集满 num_return_sequences 条完整句子,提前停止;
  • 若达到最大长度上限,停止生成。
  1. 最终输出
    从所有完整、以EOS结尾的句子中,选出对数总分最高的1条作为结果;如需多条则取前N条。

4. 标准束搜索固有缺陷

  1. 偏好短句
    短序列累加项少,分数天然更高,模型倾向早早输出EOS,句子残缺。
    解决方案:length_penalty 长度惩罚,对长序列加分、短序列扣分。
    KaTeX parse error: Expected 'EOF', got '_' at position 52: …g P}{(\text{seq_̲len})^\alpha}
    α>1\alpha>1α>1:鼓励长句;α<1\alpha<1α<1:鼓励短句。
  2. 结果同质化严重
    多条beam路径演化后内容高度相似,很难产出风格不同的多版本文本。
  3. 无随机性,输出固定
    相同输入参数每次生成完全一致,不适合小说、对话等创意场景。
  4. 算力开销随K线性上涨
    beam_size越大,并行推理序列越多,显存/速度开销明显上升。

介绍一下束搜索的典型衍生变体(transformers 全部支持)

变体1:多样束搜索 Diverse Beam Search

解决痛点

标准beam的K条候选高度重复,想要一次性输出多条差异大的译文/文案。

核心机制:分组束

新增参数 num_beam_groups = G,将总beam数量均分G组:
KaTeX parse error: Expected 'EOF', got '_' at position 11: \text{beam_̲size} = G \time…

  1. 每组独立执行束搜索,组与组之间增加多样性惩罚项
  2. 筛选序列时,会降低和其他组已选序列相似候选的分数;
  3. 每组产出一条最优句子,最终得到G条语义、措辞差异明显的文本。
参数配置

num_beams>1, num_beam_groups>1, do_sample=False

适用场景

机器翻译多版本输出、多条摘要备选、多条广告文案生成。

变体2:束采样 Beam Sample / Stochastic Beam Search

解决痛点

标准束搜索完全确定性,缺乏创意;纯采样容易语句混乱。束搜索结构+随机采样折中。

核心机制
  1. 依旧维护K条beam候选序列;
  2. 不再按分数argmax择优,而是对K×V候选序列做多项式随机采样选出下一轮K条beam;
  3. 同样支持temperature、top_p调节随机程度。
参数配置

num_beams>1, do_sample=True

特点

兼顾束搜索的全局连贯性与采样的多样性,长文本故事生成常用。

变体3:受限束搜索 Constrained Beam Search

解决痛点

强制生成包含指定关键词、固定句式、实体名词(如产品名、专有名词)。

核心机制

在每一轮筛选beam时增加硬约束:

  • force_words_ids:必须出现指定词语;
  • prefix_allowed_tokens_fn:自定义每一步允许生成的token集合;
  • 不满足约束的序列直接大幅扣分,不会被选入beam。
适用场景

法律文书、固定格式输出、品牌文案、关键词问答。

变体4:块束搜索 Block Beam Search(轻量化优化)

核心改进

不逐token扩展beam,一次生成一整段token块再筛选,减少模型前向传播次数,提速;
多用于离线批量翻译,transformers高层封装较少直接暴露。

变体5:长度可控束搜索(基于length_penalty)

不算独立算法,是标准束搜索的调参增强:

  • length_penalty > 1:新闻、小说、长摘要;
  • length_penalty < 1:短句标题、指令极简回答。

变体6:多候选束输出(num_return_sequences)

标准束搜索扩展用法:
设置 num_return_sequences=N,要求N ≤ beam_size;
生成结束后返回分数最高的N条完整句子,不增加多样性,只是输出多条近似结果。


各类束搜索横向对比

类型 是否随机 多条结果差异性 核心适用场景
标准束搜索 低,内容近似 翻译、摘要、高精度问答
多样束搜索 高,分组差异化 需要多条不同版本文案/译文
束采样 Beam Sample 中高 故事、对话、创意长文本
受限束搜索 可控 强制包含关键词、固定格式生成

束搜索与贪心/采样关键边界区分

  1. num_beams=1:无束结构,只有两种分支
    • do_sample=False → 贪心解码
    • do_sample=True → Top-P/Top-K 随机采样
  2. num_beams>1:启用束结构
    • do_sample=False → 标准/多样/受限确定性束搜索
    • do_sample=True → 束采样(随机束)

三、多项式采样 Multinomial Sampling(基础随机采样)

原理

基于模型原生完整词表概率分布做随机采样,概率越高的 token 被抽中概率越大,天然带来生成多样性。

transformers 参数

num_beams=1, do_sample=True

优缺点

优点:彻底解决确定性算法文本重复问题;
缺点:直接使用全词表分布,会大量采样极低概率无意义 token,极易出现语法错乱、乱码,工业几乎不会单独使用,必须搭配截断/平滑工具。

四、Top-K 采样

原理(关键:包含概率重归一化)

  1. 将全部 token 按预测概率从高到低排序;
  2. 只保留前 K 个概率最高的 token,直接丢弃剩余所有低概率候选;
  3. 对保留的 K 个 token 的概率重新归一化,保证总和为 1;
  4. 在归一化后的分布中随机采样下一个 token。

特点

固定候选集数量,适配概率分布稳定场景;但文本概率分布动态变化,固定 K 值很难适配所有上下文,容易冗余候选或截断有效词。

五、Top-P 核采样 Nucleus Sampling

原理

不固定候选数量,动态筛选最小的高概率子集:

  1. token 按概率降序排列;
  2. 持续累加概率,直到累积总和 ≥ 预设阈值 P;
  3. 仅保留参与累加的 token,概率重新归一化后采样。

特点

自适应候选集大小:概率集中时候选少、分布分散时候选自动增多;是目前对话、写作场景最主流采样截断方案,相比 Top-K 容错性更强。

六、Temperature 温度系数(分布平滑工具)

数学作用

对原始 logits 做缩放:zi′=zi/Tz_i' = z_i / Tzi=zi/T,再经过 softmax 生成概率分布,仅配合采样使用。
分段效果:

  1. T→0+T \to 0^+T0+:概率分布极度尖锐,等价贪心解码,无多样性;
  2. T=1T = 1T=1:原始概率分布,不做任何修改;
  3. T>1T > 1T>1:高低 token 概率差距缩小,分布更平缓,文本随机性、创意性大幅提升;
  4. T→+∞T \to +\inftyT+:所有 token 概率趋近相等,完全随机乱生成,无可读性。

工程常用区间

  • 严谨场景(代码、问答、翻译):0.2 ~ 0.6
  • 通用对话:0.7 ~ 1.0
  • 小说、诗歌、创意文案:1.0 ~ 1.5

七、工业标准组合使用方案

  1. 高精度、确定性任务(翻译、摘要、知识库问答)
    束搜索:num_beams=4~8, do_sample=False
  2. 对话、故事、创意生成(通用业务)
    采样组合:do_sample=True, top_p=0.9, temperature=0.7~1.2
  3. 极简快速生成、本地低算力设备
    贪心解码 num_beams=1, do_sample=False

八、参数逻辑总表

解码类型 参数配置 输出特性
贪婪解码 num_beams=1, do_sample=False 确定、最快、易重复
标准束搜索 num_beams>1, do_sample=False 确定、文本流畅、无创意
基础多项式采样 num_beams=1, do_sample=True 随机、易乱码,不单独使用
Top-P+Temperature 采样 do_sample=True + top_p + temperature 随机、均衡流畅与多样性,主流
束采样 Beam Sample num_beams>1, do_sample=True 束结构+随机,长文本质量更高
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐