阶段 1 · 最小学习机器

损失函数:网络的价值观
是你写的

网络自己不知道什么叫「对」。你得给它一个数字,告诉它「你现在错得多离谱」。 这个数字就是损失。
关键在于:损失函数不是一把尺子,而是一份指令。 你写什么,它就把自己塑造成什么样子——包括你没想要的那些样子。

1

它在整条流水线上的位置

上一章《激活函数》给了网络「弯」的能力,可「弯成什么样才算好」,它说了不算。 那些 w 和 b 到底怎么定下来,一直没交代——答案的第一步,是让网络知道「错了多少」。 而「错了多少」,网络自己不知道,得你写给它。

一次完整的训练循环,永远是这五步,损失函数在第三步:

① 前向输入 → 网络 → 预测值
② 对答案预测值 vs 真实标签
③ 算损失把差距压缩成一个数
④ 反向求损失对每个参数的梯度
⑤ 更新参数往梯度反方向挪一小步

注意第 ③ 步:把「预测和答案的差距」压缩成一个标量。 一旦压成一个数,就意味着你做了一个价值判断:哪种错更严重、哪种错可以容忍,全写在这一个数里。

第 ④ 步的梯度也不是新名词:每个参数各配一个数,说它往上调一点、 损失会变大还是变小、变多快;往反方向挪一小步,损失就降一点。 怎么把它算出来,是《梯度下降与反向传播》那一章的事。

核心大图 · 同一排差距,三种压法,三个数

不过「压成一个数」的算法不止一种。这一章正文会反复用到下面四个,先认个脸:

图 · 四个演员:三种回归压法 + 一种分类压法

前三张是回归用的:横轴都是误差 e。形状就是性格——平方两端翘得飞快, 绝对值是一条直线,Huber 近处跟着平方走、远处拉直。
第四张是分类用的交叉熵:横轴换成了网络给出的概率 p(正确答案是 1)。 它专治「自信地说错」——p 越接近 0,代价涨得越吓人。 什么时候该用哪一张,第 2 节和第 3 节各回答一半。

🎯 类比 像给团队定考核:你只按「接了多少单」发奖金,大家就会疯狂接单、不管质量。 「奖金怎么算」就是损失函数。
你只奖励「接单量」,它就学会牺牲质量,这不是团队坏,是你没写清目标。 它精确地学会了你要的东西,而不是你以为你要的东西。

它不是超参那一档的小旋钮:同一批数据、同一个网络,只把损失换掉,最后学出的就是另一个模型 (数学节 M-4 那张图能直接拖给你看)。它管的是「你到底想要什么」。

把损失想成一张地形:网络有两个旋钮 w、b,每拧到一个位置,损失就是那一点的海拔。下面这张地形是真的算出来的。

互动 · 损失是一张地形:两个旋钮定位置,损失就是海拔

2

回归任务:一个离群点能毁掉多少

刚才认过的前三张脸,都是给回归任务用的:预测一个数值(房价、温度、股价), 误差 e = 预测值 − 答案(猜高了为正,猜低了为负)。 现在看它们的脾气——下面这个例子里,100 个训练点有 99 个正常、只有 1 个离群, 同样是「错」,三种写法要付的钱差得很远。

互动 · 拖一个离群点,看三种损失怎么反应

总损失 MSE
—
总损失 MAE
—
总损失 Huber
—

损失离群点的代价梯度什么时候用
MSE
L2
按 e² 增长:一个 e=50 的点,代价是 2500 2e(也是按 e 增长) 误差近似高斯分布、没有离群点
MAE
L1
只按 e 增长 恒为 ±1、不随误差变小而变小,所以在 0 附近来回跳、收敛慢;
零点不可导——梯度给不出该往哪边挪
离群点多、要鲁棒
Huber
Smooth L1
小误差像 MSE、大误差像 MAE 两端都平滑可导 回归任务的稳妥默认值
⚠️ 为什么这是个真问题

上面那个演示里,100 个训练点中有 99 个误差是 1,只有 1 个是离群点。 当离群点误差到 50 时,它一个人就占了 MSE 总损失的 96%。
换句话说:模型会为了迁就那一个可能标错数据的点,把另外 99 个点全部学歪。 MSE 对离群点的惩罚是 MAE 的 e 倍,e 越大,惩罚越不成比例。

3

分类任务为什么不能用 MSE

分类任务的答案不是一个数值,而是一个概率:网络说「这张图是猫的概率是 0.9」。 那么问题来了——刚才认过的交叉熵,和前面三张回归的脸,能换着用吗? 拿两个具体数字比一比。正确答案是 1(下面把它记作 y),网络给出两种态度:

交叉熵的价钱只有一行:−log(给正确答案的概率)—— 网络说 0.5(没想法),收 −log 0.5 = 0.69; 说 0.01(自信地说错),收 −log 0.01 = 4.60。 (这里的 log 用的是自然对数;换成以 2 为底,它就成了数学节说的「比特」:−log₂ 0.5 = 1 比特。) MSE 那边收的是 (p − 1)²:两列数字先别急着比大小,它们不是同一种尺子。

网络的态度MSE 收多少交叉熵收多少
说 0.5(没想法)0.250.69
说 0.01(自信地说错)0.984.60

价钱上,各自在自己那一列里比:MSE 从 0.25 涨到 0.98(不到 4 倍),交叉熵从 0.69 涨到 4.60(6.6 倍)—— 看着只是「贵一点」。但价钱不是重点:真正决定学得多快的,是这个价钱能不能换成 推力(梯度),也就是网络被往正确方向推多远。 下面左图是价钱,右图是推力。把滑块拖到最左边(p = 0.01),看右图那两条线差多远。

互动 · 拖 p,看两个损失函数的反应

预测概率 p
0.50
均方误差 MSE
0.25
交叉熵 CE
0.69

情况MSE 的梯度交叉熵的梯度
p = 0.5(没想法)中等中等
p = 0.99(很自信,对了)趋近 0 ✅趋近 0 ✅
p = 0.01(很自信,但错了)也趋近 0 ❌拉满 ✅
那多分类呢?Softmax + MSE 行不行?

一样不行,而且更糟:Softmax(把一串分数压成一串「加起来等于 1」的概率,多分类的输出层就是它)的梯度里同样带着 p(1−p) 那一类因子,只要有一个类接近 0 或 1 就一起塌下去。所以多分类也一律用交叉熵,它面对「自信地答错」照样给满梯度。

⚠️ 错得越离谱,反而学得越慢

一个网络自信地答错的时候,恰恰是最该被狠狠纠正的时候。 但 MSE 对打分的梯度是 2(p − y)·p(1 − p):后面那个 p(1 − p) 就是 Sigmoid 的导数 (《激活函数》那一章讲过),答得越自信它越接近 0。
于是出现了一个荒谬的结果:错得越离谱,反而学得越慢。 交叉熵没有这个问题,它的梯度是干净的 p − y。

为什么交叉熵能一路「清干净」

上面看到「MSE 的梯度里带着 p(1−p),交叉熵却没有」。差别就出在求导路上的两个因子上—— −log 求导带来的 1/p,和 Sigmoid 的导数 p(1−p)—— 它们恰好互相抵消:

公式卡 · 求导路上的两个因子,乘完只剩 p − y

互动 · 抵消现场:一个冲天、一个贴地,乘起来却稳稳的

上面那张梯度图里那条直线就是这么来的:推力的 1/p 正好把 Sigmoid 塌下去的那段吃掉, 梯度的大小于是恰好等于「预测和答案差了多远」——差得越多推得越狠。 MSE 那边没有这个 1/p 可约,它的 p(1−p) 就留下来,把梯度一路压向 0。

💡 一句话

二分类用 Sigmoid + 交叉熵,多分类用 Softmax + 交叉熵 (Softmax 就是把分数换成概率的那一步)——两种配法的梯度是同一个式子: 预测 − 答案。几乎所有分类模型都在用它。
它也不是碰巧的。为什么偏偏是这个组合?那是后面数学那一节要回答的问题—— 数学 · 你写下的那个数就是价钱。

4

类别不平衡:几乎全是容易样本

交叉熵也有它搞不定的场景。目标检测就是在一张图里找出所有物体、用框圈出来: 常见做法是先撒出几万到十万个候选框,再逐个判断框里有没有东西。 绝大多数框里只有背景,模型一眼就能认出——可这些「已经做对的样本」仍然占着损失函数的大头。 模型只要把它们都答对,总损失就很低,于是根本没有动力去学那些难的样本。

图 · 一张图撒几万个候选框,只有几个框里有东西

物体 物体 物体 每个小格 = 一个候选框:几万个里只有几个装得下物体,其余全是背景

互动 · 调 γ,看注意力怎么被重新分配

做法就是在交叉熵上乘一个「调制因子」(1−p)γ(完整公式见下面表格里那一行): 取 γ = 2:样本很容易(p = 0.9)时它等于 0.01,权重被压到百分之一;样本很难(p = 0.1)时它是 0.81,权重几乎不动。 损失函数的注意力于是自动从「已经会的」转移到「还不会的」,γ = 0 时就退回普通交叉熵。 RetinaNet 靠这一招把单阶段检测器的精度提到了两阶段水平——单阶段指不先筛候选、直接在每个位置出结果, 两阶段指先筛一遍再细看。

方法核心公式怎么处理不平衡代价
加权交叉熵−wc · log pc 给稀有类乘一个大权重(wc 就是那个权重) 权重得手工调;而且它只按类别加权,不区分同一类里哪些样本已经学会了
Focal Loss−(1−p)γ · log p 按样本难度自动降权,不用手工设权重 多了一个超参 γ;γ 越大,简单样本被压得越狠,太大了效果反而变差(原文试到 γ=5,γ=2 最好)
Dice Loss见第 5 节 直接优化「预测区域和真实区域的重叠度」,天然不受类别比例影响 分割任务专用;对小目标不稳定,通常和交叉熵混用
重采样P(抽到 c) ∝ 1 / nc 过采样稀有类 / 欠采样多数类(它不改损失,改的是数据分布) 过采样会让稀有类过拟合;欠采样会丢信息
M

数学 · 你写下的那个数就是价钱

前面几节反复说:损失函数把「你错得多离谱」压成一个数。 但一直没回答最要紧的那个问题——为什么偏偏是交叉熵?
答案只有一句话:因为它数的,是模型「有多意外」。 而「意外」是可以数出来的,单位是比特 (第 3 节那个 0.69 是自然对数;换成比特,它就是 1 比特)。 这一节就把「意外」拆成能算的东西,再亲手验一遍。

图 · 用多短的暗号发天气预报

按频率配:常见的短、罕见的长 以为四种一样常见:每种都 2 位 晴 0.50 0 阴 0.30 10 雨 0.15 110 雪 0.05 1110 晴 0.50 00 阴 0.30 01 雨 0.15 10 雪 0.05 11 平均长度(用错了表,就是交叉熵) 躲不掉的:熵 多付的:KL 配得越贴合现实,平均长度越短;完全贴合时「多付」那一截归零

🎯 类比:用多短的暗号发天气预报 常见的天气配短暗号、罕见的配长暗号,平均长度才短——这条「最短平均长度」就是熵。 拿一套和现实不符的暗号表,消息就变长,多付的那部分就是 KL 散度;两者相加,正是训练时要压下去的那个数。

M-1 · 从「概率」到「比特」:同一组数的三种画法

下面这张图里,左边是现实,右边是模型。现实不会动,模型随你拖。 拖的时候盯住那根差额条,它就是「你现在要多付几个比特」。

图解 · 两排柱子,一条差额

拖上面那个「模型有多懂这片天空」:左边现实一动不动,右边模型跟着你变。

🎬 自己验一遍

先切到第 ② 个标签页,再把滑块拖到最右边:让模型和现实一模一样,粉色差额条会真的归零。

再往回拖一点点:只要不是完全一致,KL 就立刻大于 0。 「差不多学对了」和「学对了」差得很远,原因就在这里。

把上面那张图写成公式,只有一行。三个量就是同一根条上的三段:

公式卡 · 把鼠标移到每一项上

M-2 · 「最小化交叉熵」为什么就是「最大似然」

把交叉熵压到最小 = 让「我看到的数据」最可能发生(最大似然)= 让模型少付比特: 三个说法指的是同一件事。这条等价给了你换损失函数的判据——凡是「让数据更可能发生」的写法, 都能拿来当损失,后面那些损失函数的源头都在这里。一行推导和一个抛硬币的例子, 放在页末的 ∑ 更严格的形式 里。

图 · 三句话,同一个中心

交叉熵最小 数据最可能发生 (最大似然) 少付比特 同一件事

M-3 · ★ 完整推导:为什么梯度恰好等于「预测 − 答案」

这是全站三处完整推导之一(另两处是反向传播的链式法则 和注意力的 Q/K/V,都在后面)。 整个深度学习里最优雅的一处配对,优雅就优雅在这里—— 推完你会得到一个漂亮得不像话的结论: 交叉熵对打分的导数,恰好就是「模型说的」减去「事实」。

先看它长什么样,再一步步推。这里的「打分」是网络给出的分数、还没变成概率,下面记作 z; 「导数」是偏导数——把别的量按住不动,只看这一个怎么变。

第几步做什么这句话在图上对应哪一块
①写出损失:L = −log pc 就是前面那张图里正确答案那根柱子顶上的惊讶值
②把 pc 换成打分 z 的表达式(softmax) 柱子的高度是归一化之后的数:分母是全部柱子的和
③求 pc 对每个分数 zj 的偏导(结果里会冒出一个记号 δ) 拖「模型有多懂这片天空」,看四根柱子怎么一起变(加起来始终是 1)
④代回去,把 1/pc 消掉 惊讶值的变化量,恰好被柱子的高度抵消了:「干净」的来源就在这里
⑤写成一行:∂L/∂z = p − y 「预测 − 事实」:错多少,梯度就是多少

📐 诚实标注:哪一步牺牲了严谨性 第 ③ 步的 δ(读作「德尔塔」)是一个记号: 当 c = j(算的正好是正确那一类的分数)时等于 1,否则等于 0。它把「正不正确」写成了一个数。

另外,这里默认正确答案只有 1 个——就是 one-hot(一堆 0 里只有一个 1,指着那个正确答案)。如果标签是软的 (比如知识蒸馏、标签平滑),第 ⑤ 步的形式不变, 因为 y 本来就可以是一排小数,不必是 0 和 1。

M-4 · 换一个损失,就换一个目的地

互动 · 同一批点,三种损失真的会拟合出三条不同的线

那这个数,怎么变成一步更新?

损失已经是一个数,就能对它求导——求出来的斜率,就是每个参数该往哪挪、挪多少。 「切线有多陡、学习率怎么定、每个参数各自分到多少梯度」, 是 《梯度下降与反向传播》和 《优化器谱系》两章的整章内容。 这里只要记住一句:你写下的那个标量 L 决定了每条切线的斜率,斜率决定参数往哪走, 参数走到哪,模型就长成什么样——所以换损失函数不是换一把尺子,是换一个目的地。

本节的数学属于「Ⅳ 少一点意外 · 信息论」;同一套工具还会在 文本生成与采样 · VAE · 生成模型家族图谱 里出现 → 打开《数学地图》Ⅳ

5

损失函数家族

前面几节都在解决「这一个场景该用哪个」。这一节把整个家族一次摊开: 每一行说清它解决什么问题、关键性质是哪一条。 看完这张表,你该能自己选。

互动 · 同一个误差,不同损失各收多少「过路费」

损失核心公式解决什么 · 用在哪关键性质
MSE / L2e² 最基础的回归损失;数值预测 对大误差惩罚重;等价于假设噪声是高斯分布
MAE / L1|e| 抗离群点;有脏数据的回归 梯度恒为 ±1、不随误差变小;0 附近来回跳、收敛慢;零点不可导
Huber / Smooth L1|e|≤δ: ½e²
|e|>δ: δ(|e|−½δ)
两者的折中;回归任务的稳妥默认 各处可导;δ 控制「多大算离群」
交叉熵 CE−log py 分类的标准答案;几乎所有分类 梯度 = p − y,干净利落
BCE−[y·log p + (1−y)·log(1−p)] 二分类 / 多标签;每个标签独立判断 和 Sigmoid 配对
Focal Loss见第 4 节 极端类别不平衡;目标检测 按难度自动降权
Dice / IoU Loss1 − 2|A∩B| / (|A|+|B|) 直接优化重叠度;分割 不受类别比例影响
KL 散度Σ P·log(P/Q) 让两个分布靠近;VAE、蒸馏 有方向性(KL(P‖Q) ≠ KL(Q‖P))
对比损失 / InfoNCE−log [ es⁺/τ / Σj esj/τ ] 拉近正样本、推远负样本;自监督、检索 只需「谁和谁相似」,不需要精确标签
三元组损失max(0, d(a,p) − d(a,n) + m) 度量学习;人脸识别 要小心挖「难三元组」;
m:正负样本之间至少要拉开的距离
CTC−log Σπ↦y Πt p(πt) 输入输出长度对不齐;语音识别 不需要逐帧标注
6

它会骗你

下面两张图,各挑了一个「损失函数骗人」的具体场景来拖。它们不是同一件事的两种画法, 左边是「多个任务抢一个权重」,右边是「你把标签改软之后损失怎么变」。

互动 · 两个任务吵架时,权重把最优解拉向谁

互动 · 把标签从 one-hot 换成「软的」,损失会怎么变

陷阱怎么回事什么时候真的会痛 → 换什么
它只是代理指标 你要的是「翻译得准」,损失函数优化的是「和参考译文的词重叠度」。 两者相关但不相等。把代理指标优化到极致,往往离真实目标越来越远, 这就是 Goodhart 定律。评测那一章讲的是同一个问题的另一个版本 把词重叠度(BLEU 这类)当成训练目标 → 模型优化的是词面,不是你要的通顺; 上线要的是人能读懂 → 换人工或接近人工的指标当验收,损失只当训练时的替身
每个损失都藏着假设 任何损失都默认了「误差长什么样」。假设错了它不会报错,只会安静地把你往错误方向推, 典型下场就是第 2 节那个:MSE 默认噪声是对称的,于是一个标错的点就能绑架整条线。 每个损失各自的假设列在第 8 节暗线表的 E 行,不在这里重复一遍 数据里有离群点、脏标注,却用了 MSE → 一个错点绑架整条线; 先查数据,或换 Huber / MAE
多任务时怎么加权是门玄学 「分类损失 + 10 × 回归损失」里的那个 10 从哪来? 通常是试出来的。而且不同任务的损失量纲不同,权重一变,学出来的模型完全不同 一个任务的损失数值天生比另一个大 → 它悄悄主导了训练; 先把量纲对齐,或让权重随任务的不确定性自己定
数值稳定性 log(0) = −∞、exp(大数) = Inf、除零。 交叉熵前面不加 eps、softmax 不做 max 减法,训练到一半就会冒出 NaN 自己拆开算 log 和 exp → 大数值一上来就 Inf; 直接用 PyTorch 的 WithLogits 融合实现
损失低 ≠ 模型好 训练损失降到很低,可能只是记住训练集了(过拟合); 也可能只是学会了输出「安全的平均值」 训练损失一直降、线上指标不动 → 你在优化一个和交付目标无关的数; 永远看验证集和你真正关心的指标 (准确率:答对的占多少;召回率:该找出来的找回来了多少;通过率……), 损失只是训练时的替身
⚠️ 一个新手最常见的 bug

PyTorch 的 CrossEntropyLoss 内部自带 Softmax, 所以你的模型最后一层不要再加 Softmax,否则相当于做了两次, 概率被压得极度平缓,梯度接近 0,模型看起来在训练但什么都学不到。
同理,BCEWithLogitsLoss 自带 Sigmoid。 这两个「WithLogits」版本不只是方便,它们用数值稳定的融合实现, 比你自己写 sigmoid 再取 log 更不容易溢出。

选损失函数的顺序:① 先问「我真正关心什么指标」→ ② 找一个和它最接近的可导代理 → ③ 再考虑数值稳定和类别不平衡。 不要因为「MSE 看起来更简单」就用它,损失函数是整条流水线上最不该图省事的地方。

7

它和哪几章连在一起

先说最贴身的一个例子:正则项就是往损失函数里加的一项。拖一下 λ,看最优解怎么被拽走; 下面那张表再把这一章和后面几章的接口一次列全。

互动 · 正则项就是加在损失上的一根橡皮筋

后面的内容和损失函数的关系
优化器谱系 损失函数只负责算出梯度,怎么用这个梯度是优化器的事。两者是流水线上的上下游
过拟合与正则化 正则项就是往损失函数里加的一项。「损失 + λ·权重范数」,正则化就是在改损失函数
VAE 它的损失是重建误差 + KL 散度,两项互相拉扯,β 就是那个权重
对比学习 InfoNCE 就是交叉熵的变体:从一堆候选里认出正样本,是个 N 分类问题
RLHF 与 DPO DPO 最漂亮的地方就是把奖励函数消掉,直接写成一个像交叉熵的损失。 理解这一章,就看懂 DPO 一半了
评测与幻觉 同一个问题:优化指标 ≠ 优化目标。损失函数和评测指标是一枚硬币的两面
8

小结

这一章看上去是在比较一堆公式。但它的主题只有一个:把一个极复杂的东西压成了一个数。 而凡是压缩,就一定丢东西。

它对应哪条线 ④ 学习即压缩,损失函数就是把「什么叫做好」这件复杂的事,压成一个标量
一句话 损失函数的做法,本质上是在用「一个数」代表「什么叫做得好」这件极复杂的事; 而网络会精确地优化你写下的那个数,包括你没想优化进去的那些部分。
它牺牲了什么 牺牲了目标的完整性(回扣暗线 B)。一个数装不下一整套价值判断, 装不下的那部分就是它骗你的地方:优化代理指标 ≠ 优化目标。
MSE 装不下「这个离群点可能是标错了」,于是它照样按 e² 惩罚下去; 交叉熵装不下「绝大多数样本都是容易的背景」,于是要用 Focal 那一项手工补回来
💡 检验一下:你现在能指着哪个互动说这句话

回到第 2 节那张图。把「离群点的误差 e」滑块从 12 拖到 60, 然后看条形图里各自占全部损失的比例:MSE 那一栏会飙到 96% 以上,MAE 只从一成多涨到不到四成。

同一批数据、同一个离群点,三种损失给出三个不同的「什么叫错」。
那个瞬间你看到的就是「压缩会把信息丢掉」:你写下的那个公式,就是你的价值观被压扁之后的样子。 如果你刚才没有想指着那个滑块说这句话,那这一节对你就是没用的,回去再拖一次。

为什么是「学习即压缩」,而不是别的线

线为什么这章不是它
① 表达力 vs 泛化 沾边:损失函数确实决定模型往哪走。但这一章的机制在「定义目标」,不在「模型够不够灵活」
② 没有免费午餐 沾边:第 6 节说「每个损失都藏着假设」(MSE 假设高斯噪声)。 但那是代价表里的一行,不是全章的主张
④ 学习即压缩 ✅ 这章的位置:把一整套「哪种错更不能忍」压成一个数, 再拿这个数去驱动梯度。第 1 节那个五步流水线里第③步就写着「把差距压缩成一个标量」

它在六条暗线里站在哪

暗线这一章的回答
A 信息流动 两个张量进去(预测和标签),一个标量出来。 如果是 (B, C) 的预测再加一批标签,出来就是 (1,)。 整个网络的行为被压成一个数来评判,这是整条流水线上唯一一次「塌成一个点」
B 什么被牺牲了 牺牲了目标的完整性(一个标量装不下价值判断)。换来的是可微、可优化, 没有这个标量,梯度下降无从下口
C 参数账本 损失函数自己 0 个参数,计算量也是全流水线最小(逐元素 + 一次求和,一个 log 而已)。 但它决定梯度的大小:交叉熵的梯度是 p − y,落在 [−1, 1]; MSE 走 Sigmoid 之后是 2(p − y)·p(1−p),峰值也不到 0.3。
同一个网络、同一批数据,换损失函数往往会把梯度量级整体挪一档, 而学习率是跟着梯度量级调的,所以换损失函数往往要重调学习率
D 跑在什么上 带宽受限。损失是逐元素运算加一次归约,算术强度接近于 1, 读一批数、各算一两次、再写回一个数。它从来不是瓶颈: 贵的是它前面的 forward 和后面的 backward。
而且它小到可以忽略不计:这也是为什么「损失函数怎么选」常常被当成不需要优化的细节。 完整的算术强度账在 《硬件与算力账本》
E 它假设了什么 假设数据或误差长什么样。MSE 假设噪声是高斯分布;按最大似然推出交叉熵时, 假设了样本互相独立;Huber 假设「超过 δ 的误差就是离群点」;对比损失假设「增强后的两张图语义相同」。 假设不成立时,损失就把模型往错误的方向推
F 违背了哪个直觉 直觉是「错得越离谱,被纠正得越狠」。在 MSE + Sigmoid 上是反的: y = 1 而 p → 0 时,梯度带着 p(1−p) 一起趋近 0, 错得最离谱的时候,学得最慢。第 3 节那张右图就是把这件事画出来的
🎯 前后钩子

它接住了上一章的什么:《激活函数》给了网络「弯」的能力, 但「弯成什么样才算好」,折法自己说了不算——这一章写的就是那个说了算的标量。

它给下一章留了什么:损失只答了「错了多少」,参数怎么改它没答—— 这才是《梯度下降与反向传播》要回答的。 往损失里加一根橡皮筋,则是更后面的 《过拟合与正则化》。

一句话带走损失函数

损失函数 = 你给网络下的定义:「什么叫做好」。 它不是尺子,是指令,你奖励什么,模型就精确地学成什么,包括你没想要的部分。
回归用 Huber(MSE 会被一个离群点绑架,惩罚按 e² 增长)。
分类用交叉熵不用 MSE,因为交叉熵的梯度是干净的 p − y, 而 MSE 会在「自信地答错」时把梯度掐死,错得越离谱反而学得越慢。
不平衡用 Focal Loss,那个 (1−p)γ 把注意力从「已经会的」挪到「还不会的」。
拿到一个任务,能一眼挑出该用哪个损失(回归 → MSE / Huber,分类 → 交叉熵,极度不平衡 → Focal), 并说出选错会怎样;模型行为奇怪时,先回去查你无意中奖励了什么。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口, 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式

M-3 那五步推的是 one-hot 标签。把标签放开成任意概率分布 y, 第 ③ 步那个 δ 就换成 y 本身, 结论一个字都不用改。这就是知识蒸馏和标签平滑能直接用同一个公式的原因。

一般形式 · 标签不必是 0 和 1

人话版:损失是「模型分配的注意力」和「你给的答案」之间的差距, 按每个类分别算。y 是 0 和 1 时它就是普通交叉熵; 是一排小数时,它就是标签平滑 / 蒸馏用的那个损失。

「最小化交叉熵」=「最大似然」,一行就够。 抛 5 次硬币出现 4 次正面,设正面概率为 p:似然是 L(p) = p⁴(1−p),取对数再求导置零 4/p − 1/(1−p) = 0,解得 p = 0.8——正好是交叉熵最小的那个位置。 推广到一般数据集:把所有样本的 log p(y|x) 加起来最大化, 就是最大似然;整体乘一个负号再取平均,就是交叉熵。 两条路的终点是同一个数,这就是分类模型默认用交叉熵的原因。