logit 与 softmax
模型的原始输出分数如何变成下一个 token 上的概率分布。softmax 函数、温度对它做了什么,以及为什么这些数字是相对的而不是绝对的。
模型不会直接吐出「Paris」。它的最后一层吐出一长串原始数字——词表里每个 token 一个——这些数字可正可负、可大可小,但还不是概率。把它们变成一个干净、加起来等于 1 的分布,是 softmax 这一个函数的活;搞懂它,温度、top-p,以及关于「模型有多确信」的一半困惑,就都散开了。
logit 是什么
模型最后一步为它认识的每个 token 产出一个分数——几万个数字。这些原始分数就叫 logit。␣Paris 的 logit 是 8.2、␣London 是 3.1,说明 Paris 更被看好,但 8.2 不是「8.2% 的概率」,单看它也说明不了任何别的东西。logit 生活在一个没有上下界的尺度上,只有彼此相对时才有意义。
有两条关于 logit 的事实,会影响后面的环节:
- 它们的绝对大小是任意的。给每个 logit 都加 100,最终概率一点不变。
- 只有它们之间的差距携带信息。两个 token 相差 5,无论 logit 是 (8, 3) 还是 (105, 100),含义完全一样。
所以原始输出是一片相对的偏好。softmax 读这些差距,产出概率。
softmax 做了什么
softmax 接收 logit 向量,返回概率向量——全为正,加起来等于 1。它分两步走。
取指数。 以 e 为底,对每个 logit 求幂。这既让每个值变成正数,更关键的是放大了差异。logit 相差 2,概率比约为 7.4 倍;相差 5,约为 148 倍。领先的 logit 会迅速拉开。
归一化。 把每个取过指数的值除以它们之和。现在它们加起来等于 1,构成一个合法的分布。
取指数这一步的后果是:softmax 会突出赢家。它不只是给 token 排序,而是把领先优势磨得更锋利。一个只是略微领先的 logit,会变成占据主导的概率。这就是为什么即使有好几个 token 都说得通,模型也常常把大部分概率压在其中一个或两个上。
为什么偏偏用指数
你可以想象更简单的把分数变成分布的办法——比如把所有值平移到正数再除以总和。softmax 用指数,并不是随意选的。
它能干净地处理负的 logit(任何数的指数都是正的),对变化响应平滑,所以训练时梯度流得好,而且在数学上与交叉熵损失正好配对,给出的更新干净、行为良好。最后一点才是深层原因:训练目标和 softmax 是被当成一对搭档来设计的。损失以某种方式把指数「抵消」掉,让算式化简。
温度:softmax 之前的重新缩放
到这里,一个可调旋钮登场了。在套用 softmax 之前,先把每个 logit 除以一个叫温度的数 T。
- T 小于 1 会拉开 logit 之间的差距。softmax 于是磨得更狠——最高那个 token 的概率往 1 爬,输出变得更确定。
- T 大于 1 会压缩差距。概率向均匀分布摊平,冷门 token 也拿到真实的机会。
- T = 1 不动 logit——这是模型的原生分布。
温度不改变模型认为什么更可能,它改变的是这个信念被转成下注时有多果断。T 趋近 0 时,softmax 退化成永远挑 logit 最高的那个,也就是贪心选择。从得到的分布里具体怎么挑——温度与 top-p、top-k 如何配合——见温度与 top-p。
概率是相对的,不是真相
一个常见的误读:某个 token 的概率是 0.97,意味着模型有 97% 的把握它是对的。并不是。这个 0.97 完全只是在说这一次前向传播里 logit 的差距——这个 token 的分数比其他高出多少。它反映的是模式的强度,不是经过核实的事实。
模型可以把 0.99 压在一个自信的错误答案上。分布之所以尖锐,是因为训练里的模式强烈指向了某一个方向,而不是因为任何东西被拿去和现实核对过。这是流畅的输出依然可能是错的的一个机械原因:softmax 忠实地报告模型内部的偏好,而这个偏好是一个预测,不是一个真值。
要点回顾
- 模型的原始输出是 logit——没有上下界的分数,词表里每个 token 一个,只有相互比较时才有意义。
- softmax 对它们取指数再归一化,变成加起来等于 1 的概率分布,而取指数这一步会把领先优势磨得更锋利。
- 只有 logit 的差距有意义;给所有 logit 加同一个常数,什么都不会变。
- 温度在 softmax 之前除 logit:小于 1 变尖锐,大于 1 变平坦,接近 0 就退化成贪心。
- 高概率反映的是这一次前向传播里模式的强度,不是对真相的把握。
下一篇: 温度与 top-p——softmax 产出的分布里,一个 token 到底是怎么被选出来的。