从0训练LLM · 现代大模型体系 阅读 + 实验 ≈ 30 分钟 页内实验 ×3
D 深度学习地基:机器怎么从例子里学会规律 第 2 课

怎么量「错了多少」?

错了多少:交叉熵
数错题:训练第 1 步 loss 明明在降,错题数还是 7/7——台阶上没有坡度。把答案概率连乘:135 个 1/256 相乘在 float64 里就是 0。平方差:错得越离谱,梯度反而越小。三把朴素的尺子各失败在一个真数字上,剩下的就是交叉熵:正确答案概率的负对数。
❓

本课一问:第 1 课让机器「把 60 个数一起调」,调的目标是「让例子的答案概率尽量大」。可 7 个例子、每个一个概率,怎么合成一个数,表示模型现在「错了多少」?这个数还得能告诉我们往哪边改。

这一课先不碰:拿到这个数以后怎么改参数(第 3 课);初始 loss ≈ ln V、困惑度与验证集切法(C0 第 5 课);不同词表之间怎么比(C1)。

从已有出发

对话样本里,老师给的场景是:模型读到「小猫 喜欢 吃」,正确答案「鱼」,模型却只给「鱼」5%,于是「你预测错了,产生一个 loss」。第 1 课的迷你模型(种子 3)开局也差不多:「小猫 喜欢 吃」后面,它把 28.2% 给了「水」,13.7% 给了「小猫」,「鱼」只有 5.26%。

从已有出发 · 从例子里学的一整圈(点任一环节看它在迷你模型和 Qwen/Qwen3.8-27B 里多大) 本课本章后面的课
训练一个网络要的东西,是一件一件被真数字逼出来的(点名字去那一课;完整版在章首页)
  1. 手写规则 / 把例子背成一张表
  2. 带参数的模型:用例子调数字
  3. 交叉熵:正确答案概率的负对数
  4. 梯度下降
  5. 反向传播(反向模式自动微分)
  6. 非线性多层网络
  7. 验证集、早停与正则化
  8. 深度学习为什么是经验性的
  9. 词向量:按编号查表
第二代交叉熵:正确答案概率的负对数统计学的最大似然;softmax 这个名字来自 Bridle 1989/1990你在这里
解决了错得越离谱罚得越重:对话样本假设「鱼」拿到 5%,loss = 2.996;而且处处有坡度。
卡在有了坡,往哪边走?24,896 个参数的小网络里,随机方向和下坡方向夹角余弦的中位数只有约 0.004(第 3 课浏览器实训)。
数字口径:one-hot 维数与乘加次数由锚点 Qwen3.8 的 config 构建时现算;迷你模型(种子 3)、四句组合题(种子 3)、真语料小网络(种子 1)的数字来自本章各课组件的默认设置,浏览器里现场复算;4.771 / 6.906 来自项目真实日志 d00-foundations.json。年份按原始文献核对(2026-09-26)。

这一课要造的是 LearnLoop 里「loss」那一格:一把尺子,输入是模型的预测和正确答案,输出一个数。

先自己设计:数错题

最自然的尺子:看模型给概率最大的那个词对不对,数一数错了几道。第 1 课的 7 个例子,开局错 7 道。训练就是让错题数变少——听上去完全合理。

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案数错题:最大概率那个词不对就算错一道
同一段训练:交叉熵在降,错题数动不动? 迷你模型 · 12 个词 · 60 个参数 · 教学构造 · 浏览器现算

数字来源:浏览器实时计算(纯 JS,Float64)。例子、初始化与种子写在组件说明里;按词切只为演示,真实切分见 C1。已用 Python 独立实现逐位核对默认设置下的全部读数。

两把更聪明的朴素尺子,也各有一个真数字

尺子二:把答案概率连乘。 第 1 课里「拟合得多好」用的就是它:三个小猫例子的答案概率乘起来。连乘有一个很好的意思——「模型一字不差地复现所有例子的概率」。可例子一多,它就算不出来:

尺子一:把每个例子的答案概率连乘
尺子二:平方差 vs 交叉熵,梯度有多大
蓝 = 交叉熵的梯度大小 1 − p · 红 = 平方差的梯度大小 4p(1 − p)²(都是对「正确答案那一格 logit」求导,把「对 / 不对」当两类)

数字来源:浏览器实时计算。唯一的输入是你拖的 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 附近最大——它在「差不多对」的时候推得最用力,方向正好反了。

交叉熵长什么样

模型读到「小猫 喜欢 吃」,正确的下一个词是「鱼」。它给「鱼」多少概率,loss 就是多少:
横轴 = p(给正确答案的概率),纵轴 = loss = −ln p。左端爆炸、右端贴地——这个形状就是全部结论。

数字来源:浏览器实时计算。唯一的输入是你拖的 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 已经很近,再往上提省不了多少。

把它写成一个式子,逐项看:

交叉熵 loss(平均负对数似然)
= (1/N) pθ( | )
👆 公式里带下划线的每一项都可以点——点哪项,讲哪项。
名字里的「交叉熵」来自信息论:它是用模型的分布去编码真实数据时,平均每个例子要花的码长(以 e 为底时单位是 nat)。这里只需要记住它的算法:正确答案概率的负对数,求平均。

回到对话样本:「鱼」拿 5%,loss = −ln 0.05 = 2.996。迷你模型开局给「鱼」5.26%,这一个例子的 loss 是 −ln 0.0526 = 2.944;7 个例子平均 2.583。

⚠

常见误解一:「loss 就是错题率。」

不是。错题率只看第一名,是台阶;交叉熵看正确答案拿到的概率,是坡。上面第 0 → 1 步,交叉熵降了 0.277,错题率一格没动。

常见误解二:「交叉熵是人为规定的一条惩罚曲线,换一条也行。」

它不是随手挑的形状:它是「复现例子的概率」取对数、取平均、加负号,最小化它就是最大似然 。「错得越离谱罚得越重」是 −ln 在 0 附近的形状,不是额外加的规则。

常见误解三:「loss 要降到 0 才算学好。」

当同一个上下文后面本来就有好几种说法(「小猫 喜欢 吃」后面可以是鱼,也可以是肉),最好的模型也只能按真实频率分概率,loss 的下限是真实分布的熵,大于 0 。真语料小网络训练后验证 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。这两个数是训练开局的自检:差太多,说明初始化或 loss 写错了。C0 第 5 课用项目真实日志把它讲完整。

证据三问

问本课的回答
① 它解决什么问题?把「每个例子的答案拿到多少概率」合成一个数,并且参数动一点它就变一点,能给出方向
② 数学上为什么可能有效?交叉熵 = 平均负对数似然,在真实分布处最小 ;对 softmax 的 logit 求导恰好是 p − y,错得越离谱推力越大(本课第二张图)
③ 实验上为什么选它?分类与语言模型几乎都用它训练;与平方差相比训练更快是大量实践的结论,不是定理

一句话

📌

交叉熵 = 正确答案概率的负对数,再求平均:它把「例子被复现的概率」连乘变成连加;错得越离谱罚得越重,而且处处有坡度可以往下走。

🚦

先停在这里:记住「loss = −ln p(正确答案),平均;是坡不是台阶」。
再深一层:展开「困惑度与 ln V」的 Dig,或者去看王木头的视频把熵和 KL 补上。

下一个缺口

知道错了多少,60 个参数(真模型几百亿个)该往哪边改、改多少? → 第 3 课:往哪边改、改多少?

回扣:本课说交叉熵「处处有坡度」。坡度具体是多少、怎么算,第 3 课用它走第一步,第 4 课把它从 loss 一路算回每个参数。

你可能会问