模型每步都在抽签
语言模型每生成一个 token,先对整个词表算出一组分数(logits),再用 softmax 把分数变成一张概率表:每个候选词一个概率,总和为 1。所谓采样参数,就是「从这张表里怎么抽签」的规则。同一个模型,参数不同,输出的风格与稳定性可以差很远。
先回答一个常见疑问:为什么不永远取概率最大的词?那叫贪心解码,稳是稳,但容易陷入循环、输出呆板。适度的随机性能让长文本更自然,采样参数做的就是在「稳」与「活」之间找位置。
Temperature:分布锐度旋钮
Temperature(温度)作用在 softmax 之前:把 logits 除以 T 再归一化。T 小于 1 时,头部候选的概率被进一步放大,分布变「尖」,输出更确定;T 大于 1 时差距被抹平,分布变「平」,冷门词更容易被抽中,输出更随机。T 趋近 0 时,概率最大的词几乎必然胜出,等价于贪心解码。所以温度不是「创造力」旋钮,而是分布锐度旋钮——它只改变抽签的倾向性,不改变模型会什么。
T=0 并非处处最优:它保证同样的输入得到同样的输出,适合要可复现性的场景;但纯贪心在个别任务上可能一头扎进错误路径出不来,适度的随机性反而提供「跳出去」的机会。
还要注意 T 与 Top-p 的先后关系:多数实现先按温度调整 logits,再划 Top-p 的候选圈。所以两者不是并列的二选一,而是接力——Top-p 负责把长尾垃圾挡在圈外,温度负责决定圈内抽签的偏好。
几行 Python 就能看清这件事:
import math
def softmax_with_temperature(logits, t):
scaled = [x / t for x in logits]
m = max(scaled)
exps = [math.exp(x - m) for x in scaled]
return [e / sum(exps) for e in exps]
# logits = [4.0, 2.0, 1.0]
# t = 0.5 时,最大项概率约 0.98;t = 1.0 约 0.84;t = 2.0 约 0.63
# T 越大,分布越平,输出的随机性越强
Top-k 与 Top-p:先划候选圈
只调温度,冷门词永远有机会中签。Top-k 与 Top-p 是另一种思路:先把候选圈划小,只在圈内重新归一化再抽。
Top-k 固定保留概率最高的 k 个候选。问题在于 k 是死的:模型很笃定时,前 3 个候选可能占了九成以上概率,截 40 个反而把不相干的词捞进圈里;模型犹豫时,40 个又不够看。
Top-p(核采样,nucleus sampling)改成按累计概率动态截断:候选按概率从高到低排序,从最高往下累加,累加到刚好覆盖 p(比如 0.9)就截断,只在圈内抽。模型笃定时圈里可能只有两三个词,模型犹豫时圈自动变大——它截的是「概率质量」而不是「个数」,对分布形态的适应性好得多,因此成了多数推理接口的默认选项。
重复惩罚:治复读机
还有一类参数叫 repetition penalty / frequency penalty / presence penalty,思路都是给已经出现过的 token 扣分:出现越多扣得越狠,或只要出现过就扣一点。它们治的是低温采样常见的「复读机」毛病——同一句话无限循环。但别拉太狠,否则代词、介词这类天然高频的小词会被误伤,句子反而变得不通顺。
场景对照表
| 场景 | 建议起点 | 理由 |
|---|---|---|
| 代码生成 | T ≈ 0~0.2,Top-p 可不设 | 语法与 API 名没有随机空间,低温最稳 |
| 事实问答 / 摘要 | T ≈ 0.2~0.5 | 要一点措辞弹性,但事实不能抖 |
| 创意写作 | T ≈ 0.8~1.2,Top-p ≈ 0.9~0.95 | 适度随机带来多样性,过高会散架 |
| Agent 工具调用 / 结构化输出 | T ≈ 0~0.1 | 字段名与格式必须严格,宁稳勿活 |
数字只是常见起点,不是铁律;不同模型对温度的「体感」也不同,同一组参数换个模型就得重试。
三个常见误区
一,把温度当创造力旋钮。 温度只改分布锐度,创意来自模型能力本身;T 拉太高只会让分布过平、输出胡言乱语——那不是更有创意,是失控。
二,Top-p 与温度同时拉满。 两者都在改抽签方式,要联动着调:一般先动一个、观察输出,再决定要不要动另一个;两个一起放开等于随机性叠加,出了问题都不知道该怪谁。
三,指望采样参数修模型。 参数决定「从概率表里怎么抽」,模型本身不行,调参救不了事实错误与能力短板。
怎么调:固定变量做对比
最有效的办法很朴素:准备一小组固定评测题(十几条、覆盖典型场景即可),固定其他参数,一次只动一个,对比输出的稳定性与质量——代码题看通过率与格式错误率,问答看事实稳定性,写作看多样性是否失控。评估「稳定性」要有客观抓手:同一道题跑多次看答案是否一致,代码题看多次运行的通过率波动,对话题可以让另一个模型盲评两份输出。把每次实验的参数与结果记成表,避免凭印象来回调。有评测集打底,调参就从玄学变成实验。
读者留言
COMMENTS 暂无还没有留言,来说第一句?