笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 向量入门

    • 看得见的机器学习数学
    • 向量是什么
    • 向量的加减与数乘
    • 线性组合与张成
  • 矩阵与变换

    • 矩阵是一次变换
    • 矩阵乘法
  • 度量与求解

    • 行列式与面积
    • 解方程组就是倒着走回去
    • 特征向量的直觉
    • 点积与相似度
  • 高维与结构

    • 高维空间的直觉
    • 正交基与投影
    • 秩与低秩
    • 长度与归一化
    • 线性与非线性
  • 概率与信息

    • 概率分布与采样
    • 期望与方差
    • 指数与 softmax
    • 对数与信息量
    • 交叉熵
  • 学习与优化

    • 导数就是坡度
    • 梯度下降
    • 链式法则与反向传播

押"猫 60%、狗 30%、鱼 10%",答案是狗,该扣多少分

老师心里想了一个字,让你押注。你押"猫 6 成、狗 3 成、鱼 1 成",答案揭晓是狗。你不算全错,但也不该满分——该扣多少,得有个说法。

🧠 一句话结论

交叉熵只看一件事:你给正确答案打的那个概率,有多"意外"。打了 0.9 罚一点点,打了 0.01 罚一大笔,打 0 罚到无穷。模型训练从头到尾就是在把这个罚分往下压——它不是在"学知识",是在躲罚分。


场景问题

老师玩个游戏:她心里想了一个动物,你来猜。但不是猜一个,而是押注——把你的把握分成几份写下来。

第一轮你写:猫 6 成、狗 3 成、鱼 1 成。

老师揭晓:是狗。

现在的问题是:该给你扣多少分?

  • 说你全错,冤枉——你给狗留了 3 成,不是完全没想到
  • 说你全对,也不合适——你把最大的一份押给了猫

那扣多少?如果第二轮你押"狗 9 成",猜中了,扣分该比这轮少多少?如果你押"狗 0 成"(压根没考虑狗),扣分又该是多少?

得有一把统一的尺子,把"押注押得准不准"变成一个具体的分数。 这把尺子就是交叉熵。

实现方案

罚分只看正确答案那一格

第一件让人意外的事:罚分只看一个数——你给正确答案打的那个概率。 其余的格子,看都不看。

你押的是"猫 6 成、狗 3 成、鱼 1 成",答案是狗。那就只把 0.3 这个数拎出来,其余的猫和鱼直接扔掉。

你押:猫 6 成、狗 3 成、鱼 1 成 —— 答案是「狗」猫 0.6狗 0.3鱼 0.1罚分只看框里这一个数:0.3

为什么可以只看一格?因为第十五篇那条规则在这儿起作用了:所有格子加起来正好是一整块蛋糕。你给猫的 6 成,本来就是从狗和鱼那里抢来的。

所以"你给猫押多了"这件事,已经体现在"你给狗押少了"里面了——不用再单独罚一次。看一格,等于看全局。

罚分就是那一格有多"意外"

拎出 0.3 之后,罚多少?

上一篇刚讲过一个现成的工具:一件事的概率越小,它发生时越"意外",意外程度 = 概率的对数取负。

正确答案就摆在那儿了,它必然发生。所以罚分就直接问一句:这件必然发生的事,在你的押注里被打成了多不可能?

罚分=−log⁡(你给正确答案打的概率)\text{罚分} = -\log(\text{你给正确答案打的概率}) 罚分=−log(你给正确答案打的概率)

这行的意思是:把你押给正确答案的那个数取对数、加个负号,得到的就是罚分。

代进去看看不同押法各罚多少:

0.010.30.95罚分随"给正确答案打的概率"变化押 0.01 → 罚一大笔押 0.3 → 罚中等押 0.95 → 几乎不罚往右 = 给正确答案打的概率越高;往上 = 罚得越狠
你给正确答案打了罚分相当于
0.950.05几乎不罚——你押对了
0.50.69罚一点
0.31.2罚中等——就是开头那轮
0.014.6罚一大笔——你几乎没考虑正确答案
0无穷大罚到破产——你把正确答案彻底排除了

曲线的形状说明了一切:右边平缓,左边陡峭。

  • 从 0.9 提到 0.95,罚分只少一丁点——已经押得挺准了,再准也没多少好处
  • 从 0.01 提到 0.1,罚分砍掉一大半——押得越离谱,改进的收益越大

最后一行值得单独说:押 0 会被罚到无穷大。这不是数学上的意外,是一条态度上的规定:你说"这件事绝对不可能",结果它发生了——这不是估错了大小,是把可能性彻底否掉了,罚无穷大是合适的。

所以稳妥的做法是永远别把话说死。给每个选项都留一丝丝,哪怕只有万分之一。第十七篇的 softmax 天然就做到了这一点——指数出来的数永远是正的,不可能有哪个格子恰好是 0。

训练就是一路把罚分往下压

现在把整件事串起来,就是模型训练的全貌:

  1. 给模型看一句话的前半截,让它押注下一个字是什么(一块几万段的蛋糕,第十七篇切的)
  2. 揭晓真正的下一个字
  3. 拎出它押给这个字的概率,算罚分
  4. 想办法调整模型,让下次遇到类似情况时,这个罚分更小一点

对一整篇文章的每一个字都这么来一遍,罚分加起来(用上一篇的"连乘变连加"),就是这篇文章的总罚分。

模型训练从头到尾干的就是这一件事:把总罚分往下压。

这话值得琢磨一下:模型并不"理解"它在学什么,也没人给它讲过语法或常识。它只是在几万亿次"押注—揭晓—挨罚—微调"的循环里,慢慢学会了怎么押注才挨罚少。所谓的"懂中文""有常识",是躲罚分躲出来的副产品。

罚分降到 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.90.10.11(差不多)
0.010.994.6
01无穷大

减法的罚分封了顶:再离谱也就罚 1。于是"押 0.01"和"押 0"在它眼里差不多——可这两件事天差地别。

交叉熵没有顶:错得越离谱罚得越狠。这才能逼着模型优先去修那些错得最离谱的地方。

错误直觉二:以为非正确项的预测不影响罚分

表面上确实只算了正确答案那一格。但别忘了所有格子加起来必须是一整块蛋糕——你给猫多押一成,就得从狗和鱼那儿抢一成。

所以"给错误选项押高了"这件事照样会挨罚,只不过是通过"正确答案那一格变小了"来挨的。

这个区分很实在:模型压低罚分的办法不只是"抬高正确答案",也可以是"打压那些错误选项"——它俩本来就是同一个动作的两面。

错误直觉三:以为损失降到 0 才算训练完美

罚分为 0 意味着模型对每个字都押 100%,认定"只可能是这一个"。

可"今天天气真____"后面接好、接不错、接糟糕全都对。逼模型认定只有一个答案,等于让它把训练材料一字不差地背下来,遇到没见过的句子就彻底傻眼。

语言本身有不确定性,罚分有个降不下去的下限。 罚分停在一个合理的位置上是健康的;一路压到 0,说明它已经在背书而不是在学规律了。

沉淀结论

  1. 交叉熵只看一个数:你给正确答案打的那个概率。其余格子不用单独看——它们的影响已经体现在这一格里了
  2. 罚分 = 那个概率的对数取负,也就是第十八篇的"意外程度":正确答案在你眼里越不可能,罚得越狠
  3. 曲线右缓左陡:押 0.9 再往上提没多少好处,押 0.01 稍微改改就能省一大笔——错得越离谱,改进收益越大
  4. 押 0 罚到无穷大——"估得低"和"认定不可能"是两码事;softmax 天然不会输出 0,正好躲开这个雷
  5. 训练就是一路把罚分往下压;但压到 0 是坏消息,说明模型在背书而不是学规律——语言本身有不确定性

记忆口诀

罚分只看正确答案那一格。
罚多少 = 那一格有多"意外"(对数取负)。
押对了几乎不罚,押离谱了罚一大笔,押 0 罚到破产。
训练全程就干一件事:把罚分往下压。
但压到 0 反而是坏消息 —— 那是在背书。

延伸阅读

  • 预训练目标:给模型看前半句、让它押下一个字、按本篇的尺子罚分、微调参数——几万亿次循环下来,"懂中文"就是这么躲罚分躲出来的。详见大模型核心原理。
  • perplexity(困惑度):把平均罚分用指数翻回去,得到的就是"模型平均每一步在几个选项之间犹豫"。罚分越低,困惑度越小。详见大模型评测。

自测:合上资料能说清楚吗?

  1. 你押"猫 60%、狗 30%、鱼 10%",答案是狗。算罚分时用到了哪几个数?
参考答案

只用到一个:0.3,也就是你押给正确答案(狗)的那个数。猫和鱼看都不看。

因为所有格子加起来正好是一整块蛋糕——你给猫押多了,必然意味着给狗押少了,这件事已经体现在 0.3 这个数里了,不用再单独罚一次。

  1. 交叉熵是"预测值减去答案"吗?
参考答案

不是,是对数取负。 差别在极端处:押 0.01 时减法罚 0.99、交叉熵罚 4.6;押 0 时减法罚 1、交叉熵罚无穷大。

减法的罚分封了顶(再离谱也就罚 1),于是"押 0.01"和"押 0"在它眼里差不多——可这两件事天差地别。交叉熵没有顶,错得越离谱罚得越狠,这才能逼模型优先去修最离谱的地方。

  1. 为什么押 0 要罚到无穷大?
参考答案

因为"我估得低"和"我认定不可能"是两码事。前者只是判断失误,罚一笔就够;后者是把这个选项彻底从桌上拿走了,结果它偏偏发生了——性质完全不同。

罚无穷大等于一条警告:永远别把话说死。好在 softmax 出来的数永远是正的,模型不会真的踩到这个雷。

  1. 训练时把损失降到 0,是不是最理想?
参考答案

恰恰相反,那是出问题了。 罚分为 0 意味着模型对每个字都押 100%,认定"只可能是这一个字"。

可"今天天气真____"后面接好、不错、糟糕全都对。逼模型认定唯一答案,等于让它把训练材料一字不差地背下来,遇到新句子就傻眼。语言本身有不确定性,罚分有个降不下去的下限,停在合理位置才健康。

  1. 模型是靠"理解语法和常识"学会说话的吗?
参考答案

不是。 没人给它讲过语法或常识。它只是在几万亿次"押注 → 揭晓 → 挨罚 → 微调"的循环里,慢慢学会怎么押注才挨罚少。

所谓的"懂中文""有常识",是躲罚分躲出来的副产品——因为符合语法、符合常识的押注,长期下来挨罚最少。

最近更新: 2026/9/10 11:38
Prev
对数与信息量