大模型生成参数:Top-K,Top-P,Temperature

48 阅读12分钟
  • 🔪 Top-K:限制候选词数量,使生成内容集中。
  • 🧠 Top-P:控制候选词动态的累加截断,确保合理的候选词动态加入。
  • 🌡️ Temperature:调整生成的随机性,控制生成风格的严谨或随意。

🌡️ Temperature

模型的原始输出:不是一个词,而是一张“榜单”。

当 LLM 读完你的 Prompt 并准备生成下一个 token 时,它输出的其实是一个包含所有已知词汇(通常几万个)的 Logits(原始得分)列表。

假设词表只有 4 个词,对于输入 “天空是”,模型的原始输出可能是:

  • 蓝色的:得分 10.0
  • 灰色的:得分 8.0
  • 红色的:得分 2.0
  • 绿色的:得分 0.1

2. Softmax 归一化:将得分变成概率

模型会通过一个叫 Softmax 的函数,把上面的得分变成概率百分比(总和为 100%)。

  • 蓝色的:85%
  • 灰色的:14%
  • 红色的:0.9%
  • 绿色的:0.1%

关键时刻来了:现在该选哪个词?

两种选择策略

策略 A:贪婪搜索 (Greedy Search) —— 没有随机性

每次只选概率最大的那个词。

  • 结果:永远选“蓝色的”。
  • 后果:同样的 Prompt 永远生成同样的内容。但这会让生成的文本非常死板,容易陷入循环,缺乏创造力。

策略 B:随机采样 (Random Sampling) —— 随机性的来源

我们根据概率分布来“掷骰子”。

  • 虽然“蓝色的”概率最大(85%),但我们依然允许系统有 14% 的几率选“灰色的”,甚至 0.9% 的几率选“红色的”。
  • 这就是为什么同一个 Prompt 会有不同结果。 模型其实是在说:“大多数时候天空是蓝的,但偶尔也是灰的,极少数情况(晚霞)是红的。”
  • 采样机制赋予了 LLM “创造力”和“多样性”。

Temperature(温度)的原理与作用

从数学原理上讲,Temperature (TT) 是一个除数,它作用在 Softmax 之前。公式简写为:Piexp(LogitiT)P_i \propto \exp(\frac{\text{Logit}_i}{T})。让我们看看调整 TT 值会发生什么:

🧊 低温状态 (T0T \to 0,例如 0.1) —— “强者愈强”

TT 很小时(比如 0.1),我们用原始得分除以一个小数,由于指数函数的特性,原本的高分会被极其夸大,原本的低分会被极其压缩。

  • 原始分布:蓝(85%),灰(14%),红(0.9%)
  • 低温处理后:蓝(99.99%),灰(0.01%),红(0.00%)
  • 效果:概率分布变得极其尖锐(Sharp)。模型几乎只会选择第一名。
  • 表现:回答非常稳定、精确、死板,几乎没有随机性。
  • 适用场景:代码生成、数学解题、事实问答(你肯定不希望 1+1 有 10% 的概率等于 3)。
🔥 高温状态 (T1T \to 1 或更高) —— “众生平等”

TT 很大时,原始得分之间的差距被缩小了。比如这里 T=5T=5

  • 原始分布:蓝(85%),灰(14%),红(0.9%)
  • 高温处理后:蓝(50%),灰(35%),红(15%)
  • 效果:概率分布变得扁平(Flat)。
  • 原本概率很低的“冷门词”现在有了更高的被选中机会。
  • 表现:回答极具创造性、用词丰富,但也容易胡说八道(因为选了不合理的词)。
  • 适用场景:写诗、头脑风暴、创意写作。
⚖️ 标准状态 (T=1T = 1)

保持模型原始输出的概率分布,不做人为的缩放。

场景设定:让 AI 补全句子

假设我们给 LLM 的输入(Prompt)是:“这只猫坐在……”

模型计算出下一个字的 原始得分(Logits),前三名可能是:

  1. 地毯 (Mat) -> 得分:10.0 (最符合常理)
  2. 椅子 (Chair) -> 得分:9.0 (也很合理)
  3. 月亮 (Moon) -> 得分:2.0 (离谱,但充满想象力)
核心数学魔法:除法缩放

Temperature (TT) 在数学公式里是一个 除数

公式核心部分是:e得分Te^{\frac{\text{得分}}{T}}。我们要对比的是 差距

情况 A:低温状态(T=0.5T = 0.5)—— 差距被拉大(贫富差距极大)

我们在做指数运算前,先把得分除以 0.5(相当于乘以 2)。

  • 地毯10/0.5=2010 / 0.5 = 20
  • 月亮2/0.5=42 / 0.5 = 4

接下来算指数(概率的雏形):

  • 地毯的权重e204.8×108e^{20} \approx 4.8 \times 10^8 (4.8 亿)
  • 月亮的权重e454e^{4} \approx 54

结果:4.8 亿 vs 54。

“地毯”的概率几乎是 100%,“月亮”的概率无限接近 0。 这时候模型 绝对不敢 胡说八道,它只会选最安全的词。

情况 B:高温状态(T=5.0T = 5.0)—— 差距被缩小(众生平等)

这次我们除以 5。

  • 地毯10/5=210 / 5 = 2
  • 月亮2/5=0.42 / 5 = 0.4

接下来算指数:

  • 地毯的权重e27.4e^{2} \approx 7.4
  • 月亮的权重e0.41.5e^{0.4} \approx 1.5

结果:7.4 vs 1.5。

虽然“地毯”还是老大,但它不再拥有统治级的优势了。此时转化为概率大约是:

  • 地毯:约 60%
  • 月亮:约 12%

本来“月亮”根本不可能出现,但在高温下,它突然有了 12% 的出场机会!如果在生成几百个字的过程中,每个字都有 10% 的机会选一个“离谱”的词,那么整段话的风格就会大变。

具体表现:从“无聊”到“疯癫”

基于上面的计算,生成的句子会变成这样:

🧊 T=0.1 (极度理性)

“这只猫坐在地毯上,看着窗外的鸟。” (解释:每个词都选概率最高的,逻辑完美,但像白开水。)

😐 T=1.0 (正常交流)

“这只猫坐在椅子上,打了个哈欠。”(解释:偶尔选了第二名的‘椅子’,还是符合常理的。)

🔥 T=2.0 (高温/创意模式)

“这只猫坐在 月亮 上,用尾巴钓星星。” (解释:模型选中了低概率的‘月亮’。虽然物理上不合理,但文学上极具画面感。这就是 创造力。)

🤪 T=10.0 (温度过高/胡言乱语)

“这只猫坐在 哲学三角形 里,紫色味道。”(解释:概率分布太平了,模型开始随机抓取完全不相关的词。这就变成了 胡说八道。)

为什么叫“扁平 (Flat)”

想象一片地形:

  • 原始得分:像喜马拉雅山。“地毯”是珠峰,“月亮”是一个小土包。
  • 高温 (TT 变大):相当于把珠峰 下去,把小土包 起来。
  • 最终效果:整个地形变成了一片 高原平地

当所有词的高度都差不多时,随机扔一个球(采样),落在哪里都有可能。这就是“众生平等”。

总结图解

想象一个转盘抽奖:

  1. 模型输出:给“蓝色”划分了大块扇形,给“灰色”划分了小块。
  2. Sampling:开始转动转盘。
  3. Temperature
    • 调低温度:就是人为地把“蓝色”的扇形面积撑大,挤压其他颜色的空间,让你几乎只能抽中蓝色。
    • 调高温度:就是把所有颜色的扇形面积变得差不多大,让你抽中什么都有可能。

工程结论

Temperature 并不改变模型的能力,它只是 改变模型“冒险”的意愿

  • 低温 = 保守派,不求有功但求无过。
  • 高温 = 冒险家,追求新奇但容易翻车。

🔪 Top-K

Top-K 限制了模型在每一步中输出的概率最高的前 K 个最可能的词。这可以通过限制模型的词汇表来减少不连贯或无意义的输出。

具体场景说明

假设 K = 3,Prompt:“今天早餐我想吃……”模型预测之后的各个候选词经过倒序排序之后如下:

  • 面包 (40%)
  • 包子 (30%)
  • 油条 (20%)
  • 混凝土 (0.01%) -> 离谱词
  • 三角函数 (0.001%) -> 离谱词

如果不加限制:虽然概率很低,但如果掷骰子运气极差,模型真有可能输出“我想吃混凝土”。

启用 Top-K (K=3)

系统直接划一条线,只保留前 3 名(面包、包子、油条)。第 4 名及以后的词,概率直接强制变为 0。

然后我们在 {面包, 包子, 油条} 这三个词里随机选。

局限性

Top-K 有个大问题:它是死板的数字

  • 场景 A(词汇贫乏):问“1 + 1 = ?”。概率分布是:2 (99%), 3 (0.01%)... 如果 K=5,它会强行把后面几个极低概率的错误答案也拉进来凑数,增加了出错风险。
  • 场景 B(词汇丰富):写小说“他脸上的表情是……”。可能前 20 个形容词(悲伤、愤怒、无奈、苦笑...)都很合适。如果 K=5,你反而把剩下 15 个好词给误杀掉了,导致文采变差。

🧠 Top-P (动态累加截断)

为了解决 Top-K 的死板问题,研究者提出了 Top-P,逻辑是:不限制具体选几个词,但我要求这些词加起来的概率总和要达到 P%。 从而增加输出的多样性,同时避免低概率的词。

设定 P = 0.9 (即 90%)。系统会从第一名开始往下加,直到概率总和超过 90% 为止。剩下的全部扔掉。

具体场景对比

场景 1:答案很确定的情况

Prompt:“中国的首都是……”模型预测之后的各个候选词经过倒序排序之后如下:

  • 北京 (0.85)
  • 上海 (0.05)
  • 深圳 (0.02)
  • 广州 (0.01)

从第一名开始往下加,看什么时候撞线 (>= P)。

  • 加(北京): 0.85 (还没到 0.9,继续)
  • 加(上海): 0.85 + 0.05 = 0.90 (撞线了!停止!)

现在的概率和是 0.9,不是 1。所以要把 {北京, 上海} 的概率按比例放大,让它们加起来等于 1。

  • 北京的新概率 0.85/0.9=94.4%0.85 / 0.9 = 94.4\%
  • 上海的新概率 0.05/0.9=5.6%0.05 / 0.9 = 5.6\%

最终采样:在这两个词里掷骰子。

场景 2:答案很开放的情况

Prompt:“在一个风雨交加的夜晚,侦探推开了门,看到了……” 模型预测之后的各个候选词的概率经过倒序排序之后如下:

  • 尸体 (10%)
  • 血迹 (8%)
  • 猫 (7%)
  • 脚印 (6%)
  • ... (后面还有几十个合理的词)

Top-P 过程

10% + 8% + 7% ... 一直加,可能加到第 15 个词,总和才凑够 90%。

候选池:{尸体, 血迹, ..., 第15个词}

⚙️ 三个参数如何协同工作

这三个参数就像是一个 三级流水线

  1. 第一步:🌡️ Temperature(调整概率形状)
  2. 第二步:🔪 Top-K(强制截断前几名)
  3. 第三步:🧠 Top-P(核心累加截断)
  4. 最后:🎲 随机采样(掷骰子)

具体场景

🧙‍♂️ 场景:你要 AI 写一个奇幻故事的开头。

Prompt“魔法师举起法杖,召唤出了一只__……”

假设模型原始预测的候选词转换后的概率倒序如下(长尾词表有 50,000 个):

  1. 🐉 火龙 (40%) - 最合理
  2. 🦅 凤凰 (30%) - 很合理
  3. 🐰 兔子 (15%) - 有点反差萌
  4. 🦆 烤鸭 (5%) - 离谱但搞笑
  5. 🚜 拖拉机 (2%) - 完全不合逻辑
  6. ... (剩下 8% 是数万个无关词,如“今天”、“但是”等)

第一道工序:Temperature(温度)—— 调氛围

作用:在做任何删除之前,先决定我们要“保守”还是“激进”。

  • 如果设 T = 0.5 (低温)
    • “火龙”的概率会被放大到 80%,“烤鸭”可能降到 0.1%。
    • 后果:后续的 Top-K/P 只能在“火龙”和“凤凰”里选了。
  • 如果设 T = 1.5 (高温)
    • “火龙”降到 25%,“烤鸭”升到 10%,“拖拉机”升到 5%。
    • 后果:长尾词(烤鸭、拖拉机)的生存几率大大增加。

假设我们设定 T = 1.0 (标准),保持原始概率不变,进入下一关。

第二道工序:Top-K —— 粗筛(防崩坏的硬底线)

作用:不管概率多少,我只允许前 K 名参赛。这是一种 低成本的物理防御,防止模型在极低概率的长尾里选出完全破坏语法的词。

  • 设定 K = 3
    • 保留:{火龙, 凤凰, 兔子}
    • 淘汰:{烤鸭, 拖拉机, ...} —— 即使“烤鸭”有 5% 的概率,也被无情砍掉了。
    • 结果:回答一定在常规生物范围内。
  • 设定 K = 50
    • 保留前 50 名。
    • 结果:“烤鸭”和“拖拉机”都活下来了,进入下一关。

假设我们设定 K = 50,保留了多样性。

第三道工序:Top-P —— 精筛(智能动态截断)

作用:在 Top-K 留下的圈子里,根据概率总和再次筛选。这是为了 保证质量

  • 设定 P = 0.85

系统开始累加概率(假设 T=1.0):

  1. 火龙 (40%) -> 总和 40%
  2. 凤凰 (30%) -> 总和 70%
  3. 兔子 (15%) -> 总和 85% —— 够了,停止!

结果:虽然 Top-K 放过了“烤鸭”,但 Top-P 觉得前三名的概率加起来已经足够代表主流意见了,所以 把“烤鸭”踢出局

最终候选池:{火龙, 凤凰, 兔子}。

三者协同的“黄金组合”策略

理解了流程,你就知道怎么组合它们来达到不同目的:

1. 🤖 “严谨逻辑型” (代码生成、数学解题)
  • 策略:压低不确定性,消灭长尾。
  • 配置
    • Temperature = 0 (或极低,0.1):直接把第一名的概率撑到最大。
    • Top-K = 1 (或 5):只要前几名。
    • Top-P = 0.1:只要最核心的那个。
  • 效果:模型变成一个只会选“火龙”的复读机,极其稳定。
2. 💬 “正常对话型” (客服、助手)
  • 策略:说话要通顺,偶尔可以有点小变化,但别离谱。
  • 配置
    • Temperature = 0.7 - 0.9:适度活跃。
    • Top-K = 50:砍掉绝对的垃圾词。
    • Top-P = 0.85 - 0.9:保留主流可能。
  • 效果:大部分时候说“火龙”,偶尔说“兔子”,绝对不会说“拖拉机”。
3. 🎨 “疯狂创意型” (头脑风暴、写段子)
  • 策略:我要惊喜!我要那个“烤鸭”!
  • 配置
    • Temperature = 1.2+:强行把“烤鸭”的概率提上来。
    • Top-K = 100+ (甚至不设):千万别把“烤鸭”被 K 值一刀切了。
    • Top-P = 0.95 - 0.99:允许累加到很后面,给长尾词机会。
  • 效果:模型可能会写出“魔法师召唤出了一只 烤鸭,烤鸭还开着 拖拉机”这种神奇的句子。

📝 总结

  • 🌡️ Temperature“兴奋剂”:它决定了模型有多大意愿去冒险。
  • 🔪 Top-K“入围门槛”:由于计算资源有限,先用它快速砍掉 99% 的垃圾词。
  • 🧠 Top-P“质量守门员”:它根据当前的自信程度,动态决定要保留多少个候选项。

💡 最佳实践:通常即使你想调整随机性,优先调 Temperature 和 Top-P。Top-K 通常固定在 40-100 作为一个保底的安全网即可。