得分 1、2、3 分怎么分蛋糕:先拉开差距,再摊成一整块
三个人拿了 1 分、2 分、3 分,要分一个蛋糕。按 1 : 2 : 3 分吗?还是让高分的多拿一大截?你选哪种切法,决定了这场比赛是"重在参与"还是"赢者通吃"。
🧠 一句话结论
softmax 干两件事:先用指数把分数的差距放大(每多 1 分就翻若干倍),再除以总和摊成一整块蛋糕。temperature 是插在最前面的旋钮——分数先除以它再进指数,T 调大差距被抹平(蛋糕分得均匀),T 调小差距被拉爆(一段独占)。
场景问题
班里搞投票,三个候选人拿到 1 票、2 票、3 票。奖品是一个蛋糕,按票数分。
同学甲说:"简单,1 : 2 : 3 呗——一个人拿六分之一,一个拿六分之二,一个拿六分之三。"
听着挺合理。但有两件事马上不对劲了。
第一件事:如果打分不是"票数",而是评委给的分,可以是负的呢?比如三个人是 -2 分、0 分、3 分。按比例分,那个 -2 分的人要倒贴一块蛋糕?这不成话。
第二件事:3 分和 2 分只差一票,按比例分只差六分之一块蛋糕——差距太小了,赢和输几乎没区别。可有时候我们希望"赢就要赢得明显"。
于是问题变成:有没有一种切法,既能处理负分,又能让我自己决定"赢者通吃"还是"重在参与"?
有,而且就两步。
实现方案
第一步:用指数把差距拉开
先解决负分和"差距太小"这两件事,一招就够——先让每个分数过一遍"指数"。
指数是什么?就一句话:每多 1 分,就翻固定的若干倍。
比如约定"每多 1 分翻 2.7 倍"(这个 2.7 是数学里最顺手的那个倍数,写作 e):
| 原始分 | 过一遍指数之后 |
|---|---|
| -2 | 0.14 |
| 0 | 1 |
| 1 | 2.7 |
| 2 | 7.4 |
| 3 | 20 |
看这张表,两件事一下子都解决了:
- 负分变成了正的小数(-2 分 → 0.14),再也不用倒贴蛋糕了。指数出来的数永远是正的,多小也不会变成负的
- 差距被放大了:原来 2 分和 3 分只差 1,过完指数变成 7.4 和 20,差了将近 3 倍
上下对比看得很清楚:原始分是均匀往上一级一级,过完指数之后最高那根被拉得远远高出其余两根。
这就是指数在这里的全部作用:把负数变正数,顺便把差距放大。
第二步:除以总和,摊成一整块
现在手上是 2.7、7.4、20 这三个正数。它们加起来是 30.1,不是 1——还不是一块完整的蛋糕。
第十五篇讲过:一块蛋糕的所有段加起来必须正好是一整块。所以最后一步很朴素:每个数除以它们的总和。
- 2.7 ÷ 30.1 ≈ 0.09
- 7.4 ÷ 30.1 ≈ 0.25
- 20 ÷ 30.1 ≈ 0.66
加起来正好是 1,一块完整的蛋糕切好了。
这两步合起来,就叫 softmax。 名字听着唬人,做的事就两件:
这行的意思是:先让每个分数过一遍指数(变正、拉开差距),再除以它们的总和(摊成一整块蛋糕)。
对比一下同学甲那种"直接按比例分":
| 直接按比例(1 : 2 : 3) | softmax | |
|---|---|---|
| 三段各占 | 0.17 / 0.33 / 0.50 | 0.09 / 0.25 / 0.66 |
| 负分怎么办 | 没法办,要倒贴 | 变成很小的正数,没问题 |
| 赢的那个 | 只占一半 | 占了三分之二 |
同样的原始分,softmax 让第一名明显更突出——因为差距在进蛋糕之前就已经被指数放大过了。
那个旋钮:temperature
现在还剩最后一件事:"赢者通吃"还是"重在参与",我能不能自己说了算?
能,而且只要在最前面插一个动作:所有分数先除以一个数 T,再进指数。
这个 T 就叫 temperature(温度)。它是个旋钮,转一转,蛋糕的形状就变:
盯住这个动画:同一组分数没变,只是转了转 T:
- T 调小(比如 0.2):分数先被放大(除以 0.2 等于乘以 5),差距变得极大,指数一放大更是天差地别。结果是第一名几乎独占整块蛋糕——模型变得很"斩钉截铁",几乎每次都吐出同一个答案
- T 调大(比如 2):分数先被压扁(除以 2),差距被抹平,指数放大的也就没那么夸张。结果是几段接近均分——模型变得"很随和",什么都有可能吐出来
- T = 1:不除不乘,就是原始的 softmax
所以 temperature 调的不是随机数,而是蛋糕的形状。形状定了,落点还是要靠上一篇的采样去摸——T 决定蛋糕怎么切,采样决定这一下落在哪儿。
一个提醒:分数高不代表模型真有把握
softmax 出来的三个数加起来正好是 1,长得跟"机会"一模一样。于是很容易顺口说成:"模型有 66% 的把握选第一个。"
这话得打个折。 softmax 只是把一组分数塑造成了蛋糕的样子——它保证加起来是 1,但没保证这个 0.66 真的对应现实中的六成六。
一个模型完全可能对着一件它根本不懂的事,输出一个 0.99。分数是它自己算的,softmax 只负责把这组分数摊成一整块,并不核实这组分数靠不靠谱。
加起来是 1 是数学上的保证,"真有那么大把握"不是。
为什么这么做
为什么不能直接按比例分,非要先过一遍指数?
两个原因。一是负分没法按比例分——总不能让人倒贴蛋糕;指数把任何数都变成正数,这个问题直接消失。二是按比例分差距太小:1 分和 3 分按比例只差两倍,很多时候我们希望赢得更明显。指数在进蛋糕之前先把差距拉开,正好补上这一点。
为什么最后要除以总和?
因为蛋糕必须是一整块。第十五篇的第二条规则:所有段加起来正好是 1。不除的话,那三个数(2.7、7.4、20)加起来是 30,压根不是一块蛋糕,没法拿去采样。
为什么 temperature 是"先除以 T",而不是在最后调整蛋糕?
因为在指数之前动手,效果会被指数放大,一点点改动就能让形状变化很大——旋钮很灵敏。要是等蛋糕切好了再去调整每段宽度,既麻烦又不好保证加起来还是 1。在源头拧一下,比在末尾修补省事得多。
为什么别的选择不行
错误直觉一:以为 softmax 就是"除以总和"
只除以总和,两件事都办不到:负分会倒贴(-2 除以总和还是负的),差距不会被放大(1 : 2 : 3 除完还是 1 : 2 : 3)。
指数那一步不是可有可无的装饰,它承担了两件正事:把所有数变正,和把差距拉开。去掉它,softmax 就退化成同学甲那个一开始就被否掉的方案。
错误直觉二:以为 temperature 是随机数种子
这两件事完全不同:
| temperature | 随机数种子 | |
|---|---|---|
| 管什么 | 蛋糕怎么切(形状) | 这一下落在哪儿(落点) |
| 调它会 | 让分布变尖或变平 | 让同样的分布下摸出不同结果 |
把 temperature 当种子的后果是:你以为"调 T 只是换个随机结果",其实你在改变模型有多敢冒险。T 调到很大,它会开始吐出那些本来机会很小的字——这不是"换了个随机结果",是把小机会的选项拉到了台面上。
错误直觉三:以为 softmax 输出的数就是模型真实的把握
softmax 保证的只有一件事:加起来等于 1。它是把一组分数塑造成蛋糕形状的工具,不是一个测谎仪。
模型对着一件它完全不懂的事输出 0.99,softmax 照样忠实地把它摊成 0.99——它没有能力、也没有职责去核实那组分数靠不靠谱。
把"输出 0.99"当成"真有 99% 把握"的后果很具体:你会对着一个自信满满的错误答案深信不疑。数字的形状像概率,不等于它就是可信的概率。
沉淀结论
- softmax 就两步:先让每个分数过一遍指数(变正、拉开差距),再除以总和(摊成一整块蛋糕)
- 指数那一步不可省:它同时解决了"负分怎么分"和"差距太小"两个问题
- 除以总和那一步不可省:蛋糕必须是一整块,加起来正好是 1,才能拿去采样
- temperature 是插在最前面的旋钮:分数先除以 T 再进指数。T 小 → 一段独占(斩钉截铁);T 大 → 接近均分(很随和)
- softmax 输出加起来是 1,但不代表它真有那么大把握——它只负责塑形,不负责核实
记忆口诀
softmax 就两步:过指数,除总和。
指数管两件事:把负数变正,把差距拉开。
除总和是为了凑成一整块蛋糕。
temperature 是旋钮:小了一段独占,大了接近均分。
加起来是 1 是数学保证,"真有把握"不是。
延伸阅读
- Attention 打分和输出层都用 softmax:一边是把"每个词该关注多少"摊成一整块,一边是把"下一个字是谁"摊成一整块——同一套两步走。详见大模型核心原理。
- temperature 是生成时最常动的旋钮:它决定蛋糕的形状,采样决定这一下落在哪儿。两者配合才是"模型有多敢冒险"的完整答案。详见大模型核心原理。
自测:合上资料能说清楚吗?
- softmax 的两步分别是什么?各解决什么问题?
参考答案
第一步:过一遍指数——把负分变成正的小数(不用倒贴蛋糕),顺便把差距放大(赢得更明显)。
第二步:除以总和——把这些正数摊成一整块蛋糕,所有段加起来正好是 1,这样才能拿去采样。
两步缺一不可:少了指数,负分没法处理、差距也拉不开;少了除总和,凑不成一块完整的蛋糕。
- 为什么不能直接按 1 : 2 : 3 的比例分蛋糕?
参考答案
两个坏处。 一是负分没法办——评委给了 -2 分,按比例分难道让他倒贴一块蛋糕?二是差距太小——1 分和 3 分只差两倍,赢和输几乎没区别。
指数那一步同时补上了这两个窟窿:任何数过完指数都是正的,而且差距被明显放大了。
- temperature 调大调小,分别会发生什么?
参考答案
T 调小(比如 0.2):分数先被放大(除以 0.2 等于乘 5),差距变得极大,结果是第一名几乎独占整块蛋糕——模型很斩钉截铁,几乎每次吐同一个答案。
T 调大(比如 2):分数被压扁,差距被抹平,结果是几段接近均分——模型很随和,什么都可能吐出来。
T = 1 就是原始的 softmax,不除不乘。
- temperature 和随机数种子是一回事吗?
参考答案
完全不同。 temperature 管的是蛋糕怎么切(分布的形状),随机数种子管的是这一下落在哪儿(同样的分布下摸出哪个结果)。
把 T 当种子的后果是:你以为只是换了个随机结果,其实你在改变模型有多敢冒险——T 调很大时,那些本来机会极小的字会被拉到台面上来。
- softmax 输出 0.99,是不是说明模型真有 99% 的把握?
参考答案
不能这么说。 softmax 保证的只有一件事:加起来等于 1。它是个把一组分数塑造成蛋糕形状的工具,不是测谎仪。
模型对着一件它完全不懂的事输出 0.99,softmax 照样忠实地摊成 0.99——它没有能力也没有职责去核实那组分数靠不靠谱。数字的形状像概率,不等于它就是可信的概率。