押"猫 60%、狗 30%、鱼 10%",答案是狗,该扣多少分
老师心里想了一个字,让你押注。你押"猫 6 成、狗 3 成、鱼 1 成",答案揭晓是狗。你不算全错,但也不该满分——该扣多少,得有个说法。
🧠 一句话结论
交叉熵只看一件事:你给正确答案打的那个概率,有多"意外"。打了 0.9 罚一点点,打了 0.01 罚一大笔,打 0 罚到无穷。模型训练从头到尾就是在把这个罚分往下压——它不是在"学知识",是在躲罚分。
场景问题
老师玩个游戏:她心里想了一个动物,你来猜。但不是猜一个,而是押注——把你的把握分成几份写下来。
第一轮你写:猫 6 成、狗 3 成、鱼 1 成。
老师揭晓:是狗。
现在的问题是:该给你扣多少分?
- 说你全错,冤枉——你给狗留了 3 成,不是完全没想到
- 说你全对,也不合适——你把最大的一份押给了猫
那扣多少?如果第二轮你押"狗 9 成",猜中了,扣分该比这轮少多少?如果你押"狗 0 成"(压根没考虑狗),扣分又该是多少?
得有一把统一的尺子,把"押注押得准不准"变成一个具体的分数。 这把尺子就是交叉熵。
实现方案
罚分只看正确答案那一格
第一件让人意外的事:罚分只看一个数——你给正确答案打的那个概率。 其余的格子,看都不看。
你押的是"猫 6 成、狗 3 成、鱼 1 成",答案是狗。那就只把 0.3 这个数拎出来,其余的猫和鱼直接扔掉。
为什么可以只看一格?因为第十五篇那条规则在这儿起作用了:所有格子加起来正好是一整块蛋糕。你给猫的 6 成,本来就是从狗和鱼那里抢来的。
所以"你给猫押多了"这件事,已经体现在"你给狗押少了"里面了——不用再单独罚一次。看一格,等于看全局。
罚分就是那一格有多"意外"
拎出 0.3 之后,罚多少?
上一篇刚讲过一个现成的工具:一件事的概率越小,它发生时越"意外",意外程度 = 概率的对数取负。
正确答案就摆在那儿了,它必然发生。所以罚分就直接问一句:这件必然发生的事,在你的押注里被打成了多不可能?
这行的意思是:把你押给正确答案的那个数取对数、加个负号,得到的就是罚分。
代进去看看不同押法各罚多少:
| 你给正确答案打了 | 罚分 | 相当于 |
|---|---|---|
| 0.95 | 0.05 | 几乎不罚——你押对了 |
| 0.5 | 0.69 | 罚一点 |
| 0.3 | 1.2 | 罚中等——就是开头那轮 |
| 0.01 | 4.6 | 罚一大笔——你几乎没考虑正确答案 |
| 0 | 无穷大 | 罚到破产——你把正确答案彻底排除了 |
曲线的形状说明了一切:右边平缓,左边陡峭。
- 从 0.9 提到 0.95,罚分只少一丁点——已经押得挺准了,再准也没多少好处
- 从 0.01 提到 0.1,罚分砍掉一大半——押得越离谱,改进的收益越大
最后一行值得单独说:押 0 会被罚到无穷大。这不是数学上的意外,是一条态度上的规定:你说"这件事绝对不可能",结果它发生了——这不是估错了大小,是把可能性彻底否掉了,罚无穷大是合适的。
所以稳妥的做法是永远别把话说死。给每个选项都留一丝丝,哪怕只有万分之一。第十七篇的 softmax 天然就做到了这一点——指数出来的数永远是正的,不可能有哪个格子恰好是 0。
训练就是一路把罚分往下压
现在把整件事串起来,就是模型训练的全貌:
- 给模型看一句话的前半截,让它押注下一个字是什么(一块几万段的蛋糕,第十七篇切的)
- 揭晓真正的下一个字
- 拎出它押给这个字的概率,算罚分
- 想办法调整模型,让下次遇到类似情况时,这个罚分更小一点
对一整篇文章的每一个字都这么来一遍,罚分加起来(用上一篇的"连乘变连加"),就是这篇文章的总罚分。
模型训练从头到尾干的就是这一件事:把总罚分往下压。
这话值得琢磨一下:模型并不"理解"它在学什么,也没人给它讲过语法或常识。它只是在几万亿次"押注—揭晓—挨罚—微调"的循环里,慢慢学会了怎么押注才挨罚少。所谓的"懂中文""有常识",是躲罚分躲出来的副产品。
罚分降到 0 反而是坏消息
既然训练是压罚分,那压到 0 岂不是完美?
恰恰相反,那是出问题了。
罚分为 0 意味着模型对每个字都押 100%——它认定"这里只可能是这一个字,别的绝无可能"。可语言根本不是这样:
"今天天气真____"
好、不错、糟糕、闷、冷……都对。硬要模型认定只有一个答案,等于逼它背下训练时见过的每一句话,遇到新句子就傻眼。
语言本身就带着不确定性,罚分有个下限,压不到 0,也不该压到 0。 一个健康的模型是"心里有数但不把话说死",不是"斩钉截铁"。
为什么这么做
为什么罚分只看正确答案那一格,不管别的格子?
因为所有格子加起来正好是一整块蛋糕——你给别的格子押多了,必然意味着给正确答案押少了。这件事已经体现在正确答案那一格里了,不用再单独罚一次。看一格,等于看全局。
为什么用对数,不用"1 减去你押的概率"这种更朴素的算法?
因为"1 减概率"罚得太温柔。押 0.01 和押 0.0001,离谱程度差了一百倍,"1 减概率"却只从 0.99 爬到 0.9999,几乎没区别——模型感觉不到自己错得有多离谱,也就没动力大改。
对数不一样:越接近 0 罚得越狠,一路陡到无穷。错得越离谱,罚得越重,改的动力也越足。
为什么把"押 0"罚到无穷大,这不是太狠了吗?
这是有意为之的一条态度:"我估得低"和"我认定不可能"是两码事。前者是判断失误,罚一笔就够;后者是把选项彻底从桌上拿走了,性质完全不同。
罚到无穷大等于警告模型:永远别把话说死。好在 softmax 天然保证每个格子都是正数,不会真的踩到这个雷。
为什么别的选择不行
错误直觉一:以为交叉熵是"预测减答案"
听着很自然:预测 0.3,答案是 1(正确答案就该是 100%),那罚分就是 1 - 0.3 = 0.7 呗?
不是减法,是对数取负。 差别在两头:
| 你押给正确答案 | 减法罚分 | 交叉熵罚分 |
|---|---|---|
| 0.9 | 0.1 | 0.11(差不多) |
| 0.01 | 0.99 | 4.6 |
| 0 | 1 | 无穷大 |
减法的罚分封了顶:再离谱也就罚 1。于是"押 0.01"和"押 0"在它眼里差不多——可这两件事天差地别。
交叉熵没有顶:错得越离谱罚得越狠。这才能逼着模型优先去修那些错得最离谱的地方。
错误直觉二:以为非正确项的预测不影响罚分
表面上确实只算了正确答案那一格。但别忘了所有格子加起来必须是一整块蛋糕——你给猫多押一成,就得从狗和鱼那儿抢一成。
所以"给错误选项押高了"这件事照样会挨罚,只不过是通过"正确答案那一格变小了"来挨的。
这个区分很实在:模型压低罚分的办法不只是"抬高正确答案",也可以是"打压那些错误选项"——它俩本来就是同一个动作的两面。
错误直觉三:以为损失降到 0 才算训练完美
罚分为 0 意味着模型对每个字都押 100%,认定"只可能是这一个"。
可"今天天气真____"后面接好、接不错、接糟糕全都对。逼模型认定只有一个答案,等于让它把训练材料一字不差地背下来,遇到没见过的句子就彻底傻眼。
语言本身有不确定性,罚分有个降不下去的下限。 罚分停在一个合理的位置上是健康的;一路压到 0,说明它已经在背书而不是在学规律了。
沉淀结论
- 交叉熵只看一个数:你给正确答案打的那个概率。其余格子不用单独看——它们的影响已经体现在这一格里了
- 罚分 = 那个概率的对数取负,也就是第十八篇的"意外程度":正确答案在你眼里越不可能,罚得越狠
- 曲线右缓左陡:押 0.9 再往上提没多少好处,押 0.01 稍微改改就能省一大笔——错得越离谱,改进收益越大
- 押 0 罚到无穷大——"估得低"和"认定不可能"是两码事;softmax 天然不会输出 0,正好躲开这个雷
- 训练就是一路把罚分往下压;但压到 0 是坏消息,说明模型在背书而不是学规律——语言本身有不确定性
记忆口诀
罚分只看正确答案那一格。
罚多少 = 那一格有多"意外"(对数取负)。
押对了几乎不罚,押离谱了罚一大笔,押 0 罚到破产。
训练全程就干一件事:把罚分往下压。
但压到 0 反而是坏消息 —— 那是在背书。
延伸阅读
- 预训练目标:给模型看前半句、让它押下一个字、按本篇的尺子罚分、微调参数——几万亿次循环下来,"懂中文"就是这么躲罚分躲出来的。详见大模型核心原理。
- perplexity(困惑度):把平均罚分用指数翻回去,得到的就是"模型平均每一步在几个选项之间犹豫"。罚分越低,困惑度越小。详见大模型评测。
自测:合上资料能说清楚吗?
- 你押"猫 60%、狗 30%、鱼 10%",答案是狗。算罚分时用到了哪几个数?
参考答案
只用到一个:0.3,也就是你押给正确答案(狗)的那个数。猫和鱼看都不看。
因为所有格子加起来正好是一整块蛋糕——你给猫押多了,必然意味着给狗押少了,这件事已经体现在 0.3 这个数里了,不用再单独罚一次。
- 交叉熵是"预测值减去答案"吗?
参考答案
不是,是对数取负。 差别在极端处:押 0.01 时减法罚 0.99、交叉熵罚 4.6;押 0 时减法罚 1、交叉熵罚无穷大。
减法的罚分封了顶(再离谱也就罚 1),于是"押 0.01"和"押 0"在它眼里差不多——可这两件事天差地别。交叉熵没有顶,错得越离谱罚得越狠,这才能逼模型优先去修最离谱的地方。
- 为什么押 0 要罚到无穷大?
参考答案
因为"我估得低"和"我认定不可能"是两码事。前者只是判断失误,罚一笔就够;后者是把这个选项彻底从桌上拿走了,结果它偏偏发生了——性质完全不同。
罚无穷大等于一条警告:永远别把话说死。好在 softmax 出来的数永远是正的,模型不会真的踩到这个雷。
- 训练时把损失降到 0,是不是最理想?
参考答案
恰恰相反,那是出问题了。 罚分为 0 意味着模型对每个字都押 100%,认定"只可能是这一个字"。
可"今天天气真____"后面接好、不错、糟糕全都对。逼模型认定唯一答案,等于让它把训练材料一字不差地背下来,遇到新句子就傻眼。语言本身有不确定性,罚分有个降不下去的下限,停在合理位置才健康。
- 模型是靠"理解语法和常识"学会说话的吗?
参考答案
不是。 没人给它讲过语法或常识。它只是在几万亿次"押注 → 揭晓 → 挨罚 → 微调"的循环里,慢慢学会怎么押注才挨罚少。
所谓的"懂中文""有常识",是躲罚分躲出来的副产品——因为符合语法、符合常识的押注,长期下来挨罚最少。