损失函数:从均方误差到交叉熵
损失函数(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 把交叉熵推广到逐词语言建模(困惑度是其指数化身)。
自测题
- 推导 softmax+交叉熵的联合梯度 ∂L/∂zⱼ = pⱼ − yⱼ。
答案要点:log p_j = z_j − logΣe^{z_k},求导时 label 项给 −y_j、分母项给 p_j,相加即得。
- 为什么 MSE 配 sigmoid 输出会让训练「错得离谱却不动」?
答案要点:梯度含 σ'(z) 因子,输出饱和时 σ'≈0,误差信号被掐断(对照交叉熵的 δ=ŷ−y)。
- PyTorch 中 CrossEntropyLoss 的输入应该是什么?
答案要点:未经 softmax 的原始 logits;内部自带 log_softmax,重复 softmax 反而有害。
延伸阅读
- Goodfellow 等《Deep Learning》6.2 节「输出单元和代价函数」。
- Bishop《Pattern Recognition and Machine Learning》4.3.2 节(交叉熵的信息论解释)。
学习状态
状态保存在浏览器本地,用于首页与路径页的进度统计。