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库的默认实现中,这些采样参数的执行顺序是固定的,具体流程如下:
完整执行步骤
- 获取模型原始输出Logits:模型先对输入文本计算得到所有候选token的原始预测分数(即Logits),这一步还没有任何采样干预。
- Temperature缩放:将所有Logits除以指定的
temperature值。这一步会调整分布的“尖锐度”——温度越低,高概率token的占比越高,输出越确定;温度越高,概率分布越平缓,输出越随机。注意:Temperature是作用于Logits而非直接作用于概率,因为直接缩放概率会破坏分布的数学合理性,先缩放Logits再计算Softmax才是标准做法。
- 计算初始概率分布:对缩放后的Logits应用Softmax函数,得到所有token的概率分布(总和为1)。
- Top-K过滤:仅保留概率最高的
top_k个token,将其余token的概率设为0。 - 第一次归一化:对Top-K过滤后的token集合重新计算概率,确保它们的概率总和回到1(因为过滤掉了部分token,原总和小于1)。
- Top-P(核采样)过滤:将Top-K保留的token按概率从高到低排序,依次累加概率值,直到累加和大于等于
top_p阈值,保留这些累加的token,其余设为0。 - 第二次归一化:对Top-P过滤后的token集合再次归一化,确保概率总和为1。
- 采样token:基于最终的概率分布,随机采样出下一个生成的token。
结合你的示例计算
假设经过Temperature缩放和Softmax后,得到初始概率分布:t0→0.4、t1→0.2、t2→0.2、t3→0.15、t4→0.05,按上述步骤执行:
- Top-K=3过滤:保留概率最高的t0、t1、t2,此时它们的概率分别为0.4、0.2、0.2,总和为0.8。
- 第一次归一化:
- t0: 0.4 / 0.8 = 0.5
- t1: 0.2 / 0.8 = 0.25
- t2: 0.2 / 0.8 = 0.25
此时分布总和回到1。
- Top-P=0.51过滤:
- 按概率从高到低累加:t0的0.5 < 0.51,加上t1的0.25后总和为0.75 ≥ 0.51,因此保留t0和t1,丢弃t2。
- 第二次归一化:
- t0: 0.5 / (0.5+0.25) ≈ 0.6667
- t1: 0.25 / (0.5+0.25) ≈ 0.3333
- 最终采样:从t0(66.67%概率)和t1(33.33%概率)中随机选择一个token。
关于不同文档的差异说明
不同框架或平台的采样实现可能存在顺序差异(比如部分文档提到先Top-K再Temperature),但这是因为它们的实现逻辑不同。而你使用的Transformers库model.generate方法,默认遵循上述的标准流程——Temperature先作用于Logits,再依次进行Top-K、Top-P过滤和归一化。
内容的提问来源于stack exchange,提问作者Deshwal
相关产品推荐
相关产品推荐

