03-训练核心 核心 预计 30 分钟 ★ 最小路径

损失函数:从均方误差到交叉熵

损失函数(Loss Function)把「预测与真值的差距」量化为单个非负标量,是 kp-001 中 min_θ E[L] 的优化目标本体:回归常用均方误差(MSE),分类常用交叉熵(Cross-Entropy)。

一句话定义

损失函数(Loss Function)把「预测与真值的差距」量化为单个非负标量,是 kp-001 中 min_θ E[L] 的优化目标本体:回归常用均方误差(MSE),分类常用交叉熵(Cross-Entropy)。

直觉

损失像「考试的扣分规则」:规则怎么定,学生(模型)就往哪个方向努力。用 MSE 考分类,等于用「答错扣 1 分、答对不扣」的粗糙规则逼学生学百分比;交叉熵则按「你给正确答案的信心有多足」精细扣分,逼模型既答对又答得笃定。

为什么重要

损失函数决定了梯度信号的质量:kp-007 推出的 δ⁽ᴸ⁾ 直接由 ∂L/∂ŷ 决定,选错损失轻则收敛慢、重则梯度病态。softmax+交叉熵的组合能化简出 δ⁽ᴸ⁾ = ŷ − y 的优美形式,是全库「公式为工程服务」的最佳注脚;kp-024 语言建模、kp-026 注意力训练全部建立在交叉熵之上。

前置知识

  • kp-005(网络输出层结构)、kp-007(误差信号定义)。
  • 库外前置:对数函数、概率的加和为 1。

核心概念

  • MSE(均方误差):误差平方的均值,回归默认损失。
  • one-hot(独热编码):类别标签的向量表示,正确类为 1 其余为 0。
  • softmax:把任意实数向量归一化为概率分布的输出层激活。
  • 交叉熵(cross-entropy):度量两个分布差异的信息论量,分类默认损失。
  • 对数似然(log-likelihood):交叉熵的统计孪生——最小化交叉熵等价于最大化正确类的对数概率。
  • 数值稳定性:log(0) 与 e^z 溢出问题,工程上用 log-sum-exp 技巧与 CrossEntropyLoss 融合实现解决。

原理与机制

MSE:L = (1/B)Σᵢ(ŷᵢ−yᵢ)²。它的导数 2(ŷ−y) 是线性的,误差大梯度大、误差小梯度小,天然适合「拟合数值」的回归任务。但用于分类有两大病灶:其一,分类希望输出概率分布,平方差不匹配这个几何结构;其二,配合 sigmoid 输出时 δ⁽ᴸ⁾ = (ŷ−y)σ'(z),一旦输出饱和(σ'≈0),即使错得离谱梯度也近乎为零——学习停滞。交叉熵从根上治这两个病。二分类形式:L = −[y log p + (1−y)log(1−p)]。当 y=1 时 L = −log p:预测 p→0 时损失→∞,梯度永不消失——「错得越狠推得越狠」。多分类先经 softmax 得 pⱼ = e^{zⱼ}/Σₖe^{zₖ},再取 L = −Σⱼ yⱼ log pⱼ(one-hot 下即 −log p_正确类)。最漂亮的结果在 kp-007 已预告:∂L/∂zⱼ = pⱼ − yⱼ,即输出层误差信号就是「预测概率减去真值」。证明只需三步:log pⱼ = zⱼ − log Σₖe^{zₖ};对 zⱼ 求导得 ∂L/∂zⱼ = −yⱼ + pⱼ(第二项来自 softmax 分母的自影响);整理即得。指数与对数相消,既无饱和又无雅可比矩阵,这就是分类任务「softmax + 交叉熵」事实标准化的数学原因。

公式或模型

三个核心公式与关键化简:

回归:   L_MSE = (1/B) Σ_i ( ŷ_i − y_i )²
分类:   p_j = softmax(z)_j = e^{z_j} / Σ_k e^{z_k}
         L_CE = − Σ_j y_j log p_j          (y 为 one-hot)
联合梯度:∂L_CE/∂z_j = p_j − y_j          (softmax+CE 融合,无饱和)

变量说明:B 为批大小;z 为输出层 logits;y 为 one-hot 标签。注意 PyTorch 中 nn.CrossEntropyLoss 接收原始 logits(内部含 log_softmax),不要再对其输入做 softmax。

图示

MSE(配合 sigmoid)                交叉熵
L(y=1)                             L(y=1)
 │   ╲                              │╲
 │    ╲(曲线平缓)                  │ ╲   p→0 时陡峭上升
 │     ╲──                          │  ╲──
 └───────► p                        └────────► p
 0       1                          0        1
 预测离谱时梯度仍小(σ'≈0)           错得越狠梯度越大

直观类比

交叉熵的 −log p 像「信心税」:你给正确答案的信心 p 越低,税越重,且 p→0 时税趋无穷——逼模型不敢给出自信的错误答案。

实例或案例

数值对比实验:固定错误预测 p=0.01(真值 y=1)。MSE 损失 (1−0.01)² ≈ 0.98,若该输出经 sigmoid、且 z=−4.6(σ'(z)≈0.0099),实际回传梯度 ∝ 0.99×0.0099 ≈ 0.01——几乎不动。交叉熵损失 −log(0.01) ≈ 4.6,对 logits 的梯度 p−y = −0.99,满力纠正。这个 400 倍的梯度差距就是「分类必须用交叉熵」的最硬理由。kp-016 的训练循环中 nn.CrossEntropyLoss 与 kp-021 CIFAR 项目的损失选择都直接沿用本结论。

常见误区

  • 给 CrossEntropyLoss 喂 softmax 后的输出:重复 softmax 会压平分布、严重拖慢收敛(框架要的是 logits)。
  • 「MSE 不能用于分类是因为算得慢」:错,根因是概率几何不匹配与 sigmoid 饱和导致的梯度消失。
  • 忽略数值稳定:自己手写 log(softmax) 容易在 p=0 处产生 −inf,应使用框架融合实现或 log-sum-exp。
  • 把多标签任务硬套 softmax+CE:softmax 归一化互斥类别;多标签应逐类用 sigmoid+二元交叉熵。

与其他知识点的关系

δ⁽ᴸ⁾=ŷ−y 是 kp-007 推导的输出层起点;损失选择与 kp-010 优化器的组合决定收敛行为;kp-016/kp-021 提供两个落地案例;kp-024 把交叉熵推广到逐词语言建模(困惑度是其指数化身)。

自测题

  1. 推导 softmax+交叉熵的联合梯度 ∂L/∂zⱼ = pⱼ − yⱼ。

答案要点:log p_j = z_j − logΣe^{z_k},求导时 label 项给 −y_j、分母项给 p_j,相加即得。

  1. 为什么 MSE 配 sigmoid 输出会让训练「错得离谱却不动」?

答案要点:梯度含 σ'(z) 因子,输出饱和时 σ'≈0,误差信号被掐断(对照交叉熵的 δ=ŷ−y)。

  1. PyTorch 中 CrossEntropyLoss 的输入应该是什么?

答案要点:未经 softmax 的原始 logits;内部自带 log_softmax,重复 softmax 反而有害。

延伸阅读

  • Goodfellow 等《Deep Learning》6.2 节「输出单元和代价函数」。
  • Bishop《Pattern Recognition and Machine Learning》4.3.2 节(交叉熵的信息论解释)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。