怎么量「错了多少」?
本课一问:第 1 课让机器「把 60 个数一起调」,调的目标是「让例子的答案概率尽量大」。可 7 个例子、每个一个概率,怎么合成一个数,表示模型现在「错了多少」?这个数还得能告诉我们往哪边改。
这一课先不碰:拿到这个数以后怎么改参数(第 3 课);初始 loss ≈ ln V、困惑度与验证集切法(C0 第 5 课);不同词表之间怎么比(C1)。
从已有出发
对话样本里,老师给的场景是:模型读到「小猫 喜欢 吃」,正确答案「鱼」,模型却只给「鱼」5%,于是「你预测错了,产生一个 loss」。第 1 课的迷你模型(种子 3)开局也差不多:「小猫 喜欢 吃」后面,它把 28.2% 给了「水」,13.7% 给了「小猫」,「鱼」只有 5.26%。
- 手写规则 / 把例子背成一张表
- 带参数的模型:用例子调数字
- 交叉熵:正确答案概率的负对数
- 梯度下降
- 反向传播(反向模式自动微分)
- 非线性多层网络
- 验证集、早停与正则化
- 深度学习为什么是经验性的
- 词向量:按编号查表
这一课要造的是 LearnLoop 里「loss」那一格:一把尺子,输入是模型的预测和正确答案,输出一个数。
先自己设计:数错题
最自然的尺子:看模型给概率最大的那个词对不对,数一数错了几道。第 1 课的 7 个例子,开局错 7 道。训练就是让错题数变少——听上去完全合理。
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
数字来源:浏览器实时计算(纯 JS,Float64)。例子、初始化与种子写在组件说明里;按词切只为演示,真实切分见 C1。已用 Python 独立实现逐位核对默认设置下的全部读数。
交叉熵看的不是「第一名是谁」,而是「正确答案拿到了多少概率」:p 从 5% 涨到 6%,它就降一点。所以它是一条坡,不是台阶——参数每动一点点,它都跟着变,这正是往哪边改的依据。下面把这条坡的形状画出来。
两把更聪明的朴素尺子,也各有一个真数字
尺子二:把答案概率连乘。 第 1 课里「拟合得多好」用的就是它:三个小猫例子的答案概率乘起来。连乘有一个很好的意思——「模型一字不差地复现所有例子的概率」。可例子一多,它就算不出来:
数字来源:浏览器实时计算。唯一的输入是你拖的 p 和 N;默认的 5% 是对话样本里老师假设的数,1/256 是本章真语料小网络(256 个字)什么都没学时的平均猜测。
一个什么都没学的真语料小网络,每个字平均给 1/256。连乘 134 个还能用 float64 表示(约 2 × 10−323),第 135 个就变成 0;验证集 2,979 个位置连乘的真实大小是 10−7174。补救很简单:取对数。ln 把连乘变成连加(ln ab = ln a + ln b),再除以个数、加个负号,就是每个例子平均的 −ln p——它和个数无关,永远算得出。这就是交叉熵。
尺子三:平方差。 把「对 / 不对」当两类,预测 (p, 1 − p),目标 (1, 0),误差平方 2(1 − p)²。它不会下溢,也是一条坡。问题在坡度:上面第二张图里,红线(平方差的梯度)在左端趴到 0——错得越离谱,它给的推力越小。p = 5% 时交叉熵的梯度是它的 5.3 倍,p = 0.1% 时是 250 倍。开局的模型恰恰处处错得离谱,用平方差,它几乎不知道往哪走。
试三件事:① 连乘那一块:把 N 拖到 134,再拖到 135,看 float64 里的结果从 10−323 量级变成 0;再把 p 拖大到 0.5,看 N 要多大才下溢(0.5 连乘 1,075 次);② 梯度那一块:把 p 拖到最左边,读「交叉熵是平方差的多少倍」;③ 把 p 拖到 50% 以上,两条线都在降,平方差反而在 1/3 附近最大——它在「差不多对」的时候推得最用力,方向正好反了。
交叉熵长什么样
数字来源:浏览器实时计算。唯一的输入是你拖的 p 和 N;默认的 5% 是对话样本里老师假设的数,1/256 是本章真语料小网络(256 个字)什么都没学时的平均猜测。
试三件事(这三段解说迁移自旧版课程的交叉熵组件,数字都在这里现算):① 点「5%(对话样本)」:loss = 2.996,在左端的红色爆炸区;再点 10%、1%,读出 2.303、4.605——p 每减半,loss 加 ln 2 = 0.693;② 点 60% 再点 90%:loss 只降 0.405;点 10% 再点 40%:降 1.386,是前者的 3.4 倍——错得多的例子,改进一点收益更大;③ 点 90% 再点 99%:loss 从 0.105 到 0.010,离 0 已经很近,再往上提省不了多少。
把它写成一个式子,逐项看:
回到对话样本:「鱼」拿 5%,loss = −ln 0.05 = 2.996。迷你模型开局给「鱼」5.26%,这一个例子的 loss 是 −ln 0.0526 = 2.944;7 个例子平均 2.583。
常见误解一:「loss 就是错题率。」
不是。错题率只看第一名,是台阶;交叉熵看正确答案拿到的概率,是坡。上面第 0 → 1 步,交叉熵降了 0.277,错题率一格没动。
常见误解二:「交叉熵是人为规定的一条惩罚曲线,换一条也行。」
它不是随手挑的形状:它是「复现例子的概率」取对数、取平均、加负号,最小化它就是最大似然 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条最小化训练数据与模型分布的 KL 散度,等价于最小化交叉熵,也等价于最大似然;这是代数恒等,不依赖实验。 出处Goodfellow 等《Deep Learning》§5.5 ↗需联网 。「错得越离谱罚得越重」是 −ln 在 0 附近的形状,不是额外加的规则。
常见误解三:「loss 要降到 0 才算学好。」
当同一个上下文后面本来就有好几种说法(「小猫 喜欢 吃」后面可以是鱼,也可以是肉),最好的模型也只能按真实频率分概率,loss 的下限是真实分布的熵,大于 0 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条Gibbs 不等式:交叉熵 H(p, q) ≥ H(p),等号当且仅当模型分布 q 等于真实分布 p。 出处待补 。真语料小网络训练后验证 loss 在 3.6 左右,大模型也远不是 0;这个「降不下去的部分」在 C6 讲规模时还会出现。
🔍 交叉熵和「困惑度」「ln V」是什么关系?(C0 第 5 课兑现)
eloss 叫困惑度:loss = 2.996 时 e2.996 = 20,意思是「模型的犹豫程度,相当于在 20 个词里平均猜」。一个什么都没学的模型在 V 个词里平均猜,每个词 1/V,loss = ln V:锚点 Qwen3.8 的词表 248,320 个 token,开局 loss 约 ln 248,320 = 12.42;本章真语料小网络 256 个字,开局 5.550,和 ln 256 = 5.545 只差 0.005。
证据三问
| 问 | 本课的回答 |
|---|---|
| ① 它解决什么问题? | 把「每个例子的答案拿到多少概率」合成一个数,并且参数动一点它就变一点,能给出方向 |
| ② 数学上为什么可能有效? | 交叉熵 = 平均负对数似然,在真实分布处最小 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条最大似然等价与 Gibbs 不等式都是恒等式 / 不等式。 出处待补 ;对 softmax 的 logit 求导恰好是 p − y,错得越离谱推力越大(本课第二张图) 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条导数式可直接推出:交叉熵对正确答案那一格 logit 的导数是 −(1 − p);两类平方差是 −4p(1 − p)²。 出处待补 |
| ③ 实验上为什么选它? | 分类与语言模型几乎都用它训练;与平方差相比训练更快是大量实践的结论,不是定理 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条「交叉熵比平方差训练得好」在分类任务上广泛成立,但具体快多少取决于模型与数据。本课只展示了梯度大小的差别。 出处待补 |
一句话
交叉熵 = 正确答案概率的负对数,再求平均:它把「例子被复现的概率」连乘变成连加;错得越离谱罚得越重,而且处处有坡度可以往下走。
先停在这里:记住「loss = −ln p(正确答案),平均;是坡不是台阶」。
再深一层:展开「困惑度与 ln V」的 Dig,或者去看王木头的视频把熵和 KL 补上。
下一个缺口
知道错了多少,60 个参数(真模型几百亿个)该往哪边改、改多少? → 第 3 课:往哪边改、改多少?
回扣:本课说交叉熵「处处有坡度」。坡度具体是多少、怎么算,第 3 课用它走第一步,第 4 课把它从 loss 一路算回每个参数。
你可能会问
- 「为什么是自然对数 ln,不是 log₂?」 底数只差一个常数倍(ln p = log₂ p × ln 2),不影响哪组参数更好。深度学习框架默认用 ln,单位叫 nat;用 log₂ 时单位是 bit,C0 与 C14 里的「每字节比特数」用的就是它。
- 「只看正确答案那一格,其他词给多少不管吗?」 不直接管,但 softmax 把 12 个概率绑在一起:要让「鱼」的概率涨,别的词的概率必然一起降。第 4 课会看到,反向传播时每个错误答案都会收到一个「往下压」的梯度,大小就是它自己的概率。
- 「深度学习里这种『选一个目标函数』的决定,有多少是证明出来的?」 这一课的交叉熵属于数学性质很好的那一类;很多别的选择没那么干净。见岔路课:深度学习为什么是经验性的?