什么是Decoding策略

在使用GPT类产品的时候,不妨问一下自己这些问题:

  • 同一个 prompt,为什么模型有时说的不一样?
  • Chatbot里面的Temperature参数是什么含义?为什么说值越大越有创造力?
  • 如果我想让输出100%确定,应该怎么做?

LLM的输出是vocab维度的预测概率分布,$P(x_t | x_1, x_2, …, x_{t-1})$, 在预测阶段,需要根据这个概率分布生成文本序列,解码(decoding)策略是从模型预测分布中选择下一个 token 的过程。

模型输出的 logits 通过 softmax 转化为概率分布:

$$ P(x_t | x_{\lt t}) = \frac{e^{z_t}}{\sum_j e^{z_j}} $$

针对这个概率分布的输出,选择下一个token的策略总体上分为:

  • 确定性策略
    • Greedy Search: 每步选概率最大的 token,结果是确定的。$x_t = \arg\max P(x_t | x_{\lt t})$
    • Beam Search: 综合考虑所有候选序列,选择概率最大候选序列,结果也是确定的
  • Sampling:根据概率分布随机采样
    • Top-k:
      • 只保留概率最高的k个 tokens,$S_k​={x_i​:x_i​ \in TopK}$
      • 对候选集合重新归一化再采样,$x_t​∼Categorical(S_k​)$
      • Top-k可以避免非常荒谬的输出
    • Top-p(Nucleus Sampling):
      • 保留累计概率 ≤ p 的最小 token 集合
      • 可以动态调整候选集大小,比Top-k更灵活
    • Top-k/p with Temperature: softmax计算中通过引入temperature参数控制输出的分布(更尖锐 还是 更平缓)

确定性策略和Sampling侧略也可以结合使用,比如Beam Search得到TopK的Sequence,然后根据概率分布随机采样。

动机

在 生成式模型(如语言模型、推荐生成、机器翻译)中,我们往往要生成一个 token 序列:

$$ y_{1:T}=(y_1,y_2,\dots,y_T) $$

模型给出条件概率:

$$ P(y_{1:T} \mid x) = \prod_{t=1}^{T} P(y_t \mid y_{1:t-1}, x) $$

目标是找到:

$$y^* = \arg\max_{y_{1:T}} P(y_{1:T} \mid x)$$

但是:

  • 所有序列的组合的搜索空间非常大(指数级),无法穷举。
  • Greedy Search(每步选最大概率的 token)虽然快,但容易错过全局最优序列。

于是可以使用 Beam Search —— 一种在 “搜索效率” 和 “全局最优性” 之间折中的方法。

Beam Search计算步骤

设:

  • beam 搜索宽度为 B
  • 序列最大长度为 T

算法每一步保留 概率最高的前 B个候选序列(beam),扩展它们的下一个 token,并继续筛选。

初始化 在时间步 t=1:

$$\text{Beam}_1 = \text{TopB}\big( P(y_1 \mid x) \big)$$

即保留概率最高的前 B 个 token。

递推过程

在时间步 t>1:

  1. 对每个当前 beam(长度为 t−1的部分序列)扩展所有可能的下一个 token: $$\text{候选集合} = \{(y_{1:t-1}^{(b)}, y_t) \mid b=1,\dots,B,\; y_t \in V\}$$
  2. 对所有候选计算累积 log 概率(为什么用log add?因为如果采用概率乘的方式有可能导致数据进度溢出问题): $$\log P(y_{1:t}) = \log P(y_{1:t-1}) + \log P(y_t \mid y_{1:t-1}, x)$$
  3. 从这些候选中选出前 B 个最高概率的序列,作为新的 beam: $$\text{Beam}_t = \text{TopB}\big(\log P(y_{1:t})\big)$$
  4. 如果某个 beam 生成了 EOS(结束符),则将其从活跃 beam 中移除,放入完成候选集中。

终止与选择

到达最大长度 T 或所有 beam 都以 EOS 结尾时,选出完成候选中概率最高(或长度归一化后最高)的序列。

Beam Search本质是在一颗树上搜索的过程, beamsearch

Top-p/Top-p Sampling with Temperature

Temperature开始是在Hinton的蒸馏模型中出现,通过temperature参数可以控制输出分布的差异化程度。T越小,输出的概率分布越尖锐,否则T越大输出分布越平缓。

原理是在logit计算softmax的时候,增加温度参数T,做温度缩放:

$$ P(x_t | x_{\lt t}) = \frac{e^{z_t/T}}{\sum_j e^{z_j/T}} $$

Temperature Temperature通常结合Top-k或Top-p得到最终的输出序列,最终的效果是,

  • T>1:分布更平缓,增加随机性(更“创造”);
  • T<1:分布更尖锐,更确定;
  • T=1:原始 softmax;
  • T趋近0:接近贪心解(总是取最大概率 token)。
  • T趋近无穷大:接近随机输出

参考

  • Sutskever et al. (2014)Sequence to Sequence Learning with Neural Networks, 最早展示 Beam Search 在 Seq2Seq 模型中的应用。
  • Vaswani et al. (2017)Attention Is All You Need,Transformer 架构奠定了解码策略的重要性。
  • Holtzman et al. (2020)The Curious Case of Neural Text Degeneration,提出 Top-p (Nucleus) Sampling,解释为什么 Beam Search 会导致退化。
  • Li et al. (2016)Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence Models,提出 Beam Search 多样性改进。
  • Keskar et al. (2019)CTRL: A Conditional Transformer Language Model for Controllable Generation,实践中使用 temperature + top-k 控制生成质量。
  • 如何让大模型生成解码阶段的结果更好:从Beam Search到top_k、top_p等参数的实现原理与脚本实现