You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLP解码中Top-K、Top-P与Temperature联合使用的执行顺序问询

Transformers中model.generate的采样参数执行顺序详解

针对你给出的代码:

sample_outputs = model.generate(**model_inputs,max_new_tokens=40,do_sample=True,
    top_k=3,top_p=0.51, temperature=0.6, num_return_sequences=3,)

在Hugging Face Transformers库的默认实现中,这些采样参数的执行顺序是固定的,具体流程如下:

完整执行步骤

  1. 获取模型原始输出Logits:模型先对输入文本计算得到所有候选token的原始预测分数(即Logits),这一步还没有任何采样干预。
  2. Temperature缩放:将所有Logits除以指定的temperature值。这一步会调整分布的“尖锐度”——温度越低,高概率token的占比越高,输出越确定;温度越高,概率分布越平缓,输出越随机。

    注意:Temperature是作用于Logits而非直接作用于概率,因为直接缩放概率会破坏分布的数学合理性,先缩放Logits再计算Softmax才是标准做法。

  3. 计算初始概率分布:对缩放后的Logits应用Softmax函数,得到所有token的概率分布(总和为1)。
  4. Top-K过滤:仅保留概率最高的top_k个token,将其余token的概率设为0。
  5. 第一次归一化:对Top-K过滤后的token集合重新计算概率,确保它们的概率总和回到1(因为过滤掉了部分token,原总和小于1)。
  6. Top-P(核采样)过滤:将Top-K保留的token按概率从高到低排序,依次累加概率值,直到累加和大于等于top_p阈值,保留这些累加的token,其余设为0。
  7. 第二次归一化:对Top-P过滤后的token集合再次归一化,确保概率总和为1。
  8. 采样token:基于最终的概率分布,随机采样出下一个生成的token。

结合你的示例计算

假设经过Temperature缩放和Softmax后,得到初始概率分布:t0→0.4、t1→0.2、t2→0.2、t3→0.15、t4→0.05,按上述步骤执行:

  1. Top-K=3过滤:保留概率最高的t0、t1、t2,此时它们的概率分别为0.4、0.2、0.2,总和为0.8。
  2. 第一次归一化:
    • t0: 0.4 / 0.8 = 0.5
    • t1: 0.2 / 0.8 = 0.25
    • t2: 0.2 / 0.8 = 0.25
      此时分布总和回到1。
  3. Top-P=0.51过滤:
    • 按概率从高到低累加:t0的0.5 < 0.51,加上t1的0.25后总和为0.75 ≥ 0.51,因此保留t0和t1,丢弃t2。
  4. 第二次归一化:
    • t0: 0.5 / (0.5+0.25) ≈ 0.6667
    • t1: 0.25 / (0.5+0.25) ≈ 0.3333
  5. 最终采样:从t0(66.67%概率)和t1(33.33%概率)中随机选择一个token。

关于不同文档的差异说明

不同框架或平台的采样实现可能存在顺序差异(比如部分文档提到先Top-K再Temperature),但这是因为它们的实现逻辑不同。而你使用的Transformers库model.generate方法,默认遵循上述的标准流程——Temperature先作用于Logits,再依次进行Top-K、Top-P过滤和归一化。

内容的提问来源于stack exchange,提问作者Deshwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:34:57