开始前,会这些就够了
- 理解概率相加为一
- 能阅读简单 Python 循环
遇到不熟悉的词,先看这 2 个解释
- 温度
- 生成时调整下一词元抽样概率集中程度的设置。对同一组分数,较低的正温度让概率更偏向高分候选,较高温度则让分布更平;是否生效取决于生成方式。
- 幻觉
- 在需要事实或材料依据的任务中,常用来指模型生成与事实冲突、或超出给定材料支持的内容。句子可能读起来很顺,因此要把是否通顺、是否有依据和是否真实分开检查。
同一个问题连续问几次,回答不一样,于是你把 temperature 调低。结果变稳定了,但稳定的可能是同一个错误。要理解这个现象,先暂时离开完整模型,只看生成下一步时的三个候选。它们的分数来自模型,温度影响的是怎么使用这些分数。
本篇的三个候选叫 A、B、C,没有接入任何真实模型。我们观察概率如何移动,再讨论这种变化为什么不等于事实检查。
调温度,看候选概率怎么变
在同一组分数上,只改变温度。观察最大概率和其他候选是否同时变化。
最高分候选始终是 A。温度改变的是抽取分布,不会替你核对 A 的内容。
三个候选的假设分数固定为 2、1、0,公式是 softmax(分数 / 温度)。百分比经过舍入,相加可能略有偏差。这不是在线模型,不生成文本,也不涉及 top-p、top-k 或质量评测;概率更集中不等于答案更正确。
分数先变成概率,才进行抽样
模型通常给词表中的候选输出一组分数,称为 logits。分数本身不是概率,也不要求总和为一。常见做法是先将分数除以正温度 T,再用 softmax 转成概率:分数较大的候选获得较大概率,但没有被其他规则排除的候选仍可能被抽中。
下面固定分数为 2、1、0,只改变温度。代码先减掉最大分数,再计算指数,减少过大的中间数;这不改变 softmax 的结果。输出是按公式计算的浮点近似值,再保留四位小数显示,不是语言模型答题正确率,也没有用随机抽样代替概率本身。一次随机抽样可能恰好选到低概率候选,所以不能用只运行一次的结果反推整个概率分布。
import math
def probabilities(scores, temperature):
if temperature <= 0:
raise ValueError("temperature must be positive")
peak = max(scores)
weights = [math.exp((s - peak) / temperature) for s in scores]
total = sum(weights)
return [w / total for w in weights]
for t in (0.5, 1.0, 2.0):
p = probabilities([2.0, 1.0, 0.0], t)
print(t, " ".join(f"{v:.4f}" for v in p))
怎样运行:Python 3.10+;保存为 temperature_demo.py,在该目录运行 python temperature_demo.py。只用标准库,无需联网。
运行后对照结果
0.5 0.8668 0.1173 0.0159
1.0 0.6652 0.2447 0.0900
2.0 0.5065 0.3072 0.1863改变集中程度,没有增加事实证据
在这组固定分数和正温度下,A 始终排第一。降低温度,让概率更多集中到它;提高温度,让其他候选有更多机会。温度没有查资料、重新训练参数,也没有给候选贴上真假的标签。如果 A 恰好代表错误延续,低温只是更常选择这个错误延续。
把 A 设想成正确答案,低温可能对这个例子有利;把正确标签改成 B,同样的低温却压低了选中 B 的机会。概率计算完全没变,变化的是我们另外给出的评价标准。这就说明采样偏好与答案对错是不同问题,不能只凭参数名称推出准确性保证。
真实生成会连续进行很多步。前面抽到不同 Token,后面的上下文和分数也会改变,所以一次回答的差别不只是给固定三列概率重复抽签。这个小实验只隔离一轮温度缩放,不能预测某个模型在整套任务上的最终表现。
先确认参数生效,再比较任务结果
温度不是每种生成方式都使用。以本文核对的 Transformers v4.46.2 为例,温度处理需要启用采样;贪心解码直接选择最高分候选,不能靠修改温度使其变成随机抽样。不同接口还可能同时使用 top_p、top_k 或其他规则,因此应先查看具体版本的参数说明。
数学实验只接受 T 大于零;接口若允许填零,怎样处理由接口规定,不能把零直接代入除法。比较设置时,固定模型、输入和其他参数,一次只改一个因素,并把“表达是否多样”和“任务是否答对”分开记录。关键事实仍靠可信材料或可执行检查核对,稳定输出本身不是证据。
记住这三点
- 正温度缩放改变概率的集中程度,不会为候选增加事实证据。
- 固定候选分数的顺序不因正温度缩放而颠倒,低温可能稳定地偏向错误候选。
- 确认生成方式和参数生效条件后,再用任务样本比较正确性。
别把例子用过头
- 三候选实验只模拟单步概率,不能代表完整模型的多步生成效果。
- temperature=0 的接口行为与数学上的除以零不是同一件事,必须看具体实现。
自己试一小步
如何用同一组分数,说明低温并不普遍提高正确率?
- 保留分数不变,分别假设 A 和 B 是正确候选。
- 在两种假设下记录不同温度给正确候选分配的概率。
- 另将三个分数设成相等,观察温度还能否改变候选之间的偏好。
做到这些,就算完成
- 没有把最高分自动标成正确答案。
- 概率之和在浮点误差范围内为一。
- 结论限定于固定分数和本文的单步 softmax 模型。
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- Transformers v4.46.2:TemperatureLogitsWarper (新标签页)↗
正温度缩放及
do_sample=True 的生效条件。 - Transformers v4.46.2:生成方式配置 (新标签页)↗
贪心、采样及 beam search 的配置区别,避免把温度推广到全部生成模式。
- 阿里云百炼:控制回复多样性 (新标签页)↗
温度、
top_p的不同作用及一次只调整一个因素的比较建议。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
Transformer Explainer:看一句话怎样变成下一个 Token 的候选 (新标签页)↗
模型加载完成后,固定输入与其他采样设置,只改变温度并观察下一 Token 的候选概率,不把概率当成答案可信度。
查看学习准备与访问说明 →