交叉熵 vs MSE 损失模拟器 返回
机器学习

交叉熵 vs MSE 损失模拟器

一款帮助你体会「二分类为何用交叉熵而非均方误差(MSE)」的工具。调整送入 Sigmoid 的输入逻辑值 z 与真实标签 y,即可实时看到两种损失及其梯度,并可视化模型自信地犯错时 MSE 梯度逐渐消失的过程。

参数设置
逻辑值 z(Sigmoid 输入)
模型的原始输出。p = σ(z) 经过 Sigmoid 后成为预测概率
真实标签 y
该输入所属的真实类别(0 或 1)
计算结果
预测概率 p
交叉熵损失 CE
MSE 损失
CE 梯度 |dCE/dz|
MSE 梯度 |dMSE/dz|
梯度比 CE/MSE
损失曲线对比 — 工作点动画

针对当前真实标签 y,将两条损失曲线对预测概率 p 一同绘制——交叉熵曲线(陡峭上升)与 MSE 曲线(平缓抛物线)——并在两条曲线上标出当前工作点 p。

损失 vs 预测概率 p
梯度 vs 逻辑值 z
理论与主要公式

$$\text{CE}=-\big[y\ln p+(1-y)\ln(1-p)\big],\qquad \text{MSE}=(p-y)^2$$

二分类的两种损失。p:Sigmoid 预测概率 p = σ(z) = 1/(1+e^−z),y:真实标签(0 或 1)。

$$\frac{\partial \text{CE}}{\partial z}=p-y,\qquad \frac{\partial \text{MSE}}{\partial z}=2(p-y)\,p(1-p)$$

对逻辑值 z 的梯度。CE 梯度即误差 p−y 本身;MSE 梯度带有 Sigmoid 导数 p(1−p)。

当输出饱和(p≈0 或 p≈1)时 p(1−p)→0,MSE 梯度消失,而 CE 梯度保持在 ±1 附近。这正是分类中交叉熵成为标准损失的原因。

什么是交叉熵与 MSE

🙋
机器学习里的「损失函数」就是衡量预测与真值差距的函数吧。回归用 MSE(均方误差)我能理解,可分类为什么要用交叉熵呢?用平方误差不行吗?
🎓
好问题。先说结论:分类其实「也能」用 MSE。它只是把预测概率 p 与真值 y 之差平方一下,结果非负,且在 p=y 时取最小。所以初学者有时会不小心把 MSE 用到分类上。但真正训练起来,它明显比交叉熵慢。原因就出在「梯度」上。
🙋
梯度啊。那就是说,关键不是损失本身,而是它的导数?
🎓
没错。训练靠的是把参数「沿梯度方向一点点挪动」。所以真正起作用的不是损失值,而是梯度的大小。你把左边的逻辑值 z 拉到 −8 试试。真实标签是 y=1,而 z 大幅为负,意味着模型正自信地犯错——它笃定这是「类别 0」。此时看右边的「MSE 梯度」,它应该已经接近零了。
🙋
真的诶,MSE 梯度接近 0.000。明明错得最离谱,梯度却消失了……这可糟糕了。
🎓
这正是「梯度消失」。原因在 Sigmoid 的形状。MSE 梯度是 dMSE/dz = 2(p−y)·p(1−p),带有 Sigmoid 导数 p(1−p) 这个因子。当 p 饱和到接近 0 或 1,这个 p(1−p) 就几乎变成零。也就是说,恰恰在最想大幅纠正(自信犯错)的瞬间踩了刹车。而交叉熵梯度 dCE/dz = p−y 没有这个因子,所以即便 z=−8,梯度仍保持在 ±1 附近。看右边的「梯度 vs 逻辑值」图,两者差异一目了然。
🙋
CE 梯度为什么会化成 p − y 这么简洁的式子?太干净了,不像是巧合。
🎓
确实不是巧合。把 Sigmoid 与交叉熵复合后用链式法则求导,交叉熵里出来的 1/p、1/(1−p) 与 Sigmoid 导数 p(1−p) 恰好相互抵消,结果就是 p−y。这是一种设计上的巧妙——Sigmoid 与交叉熵在信息论上是「成对」的组合。所以实务中可以毫不犹豫地用这对搭配:回归用 MSE,二分类用 Sigmoid + 交叉熵,多分类用 Softmax + 交叉熵。记住这点基本就不会出错。

常见问题

看对逻辑值 z 的梯度就明白了。交叉熵损失的梯度为 dCE/dz = p − y,与误差本身成正比。而 MSE 损失的梯度为 dMSE/dz = 2(p−y)·p(1−p),带有 Sigmoid 导数 p(1−p) 这个因子。当模型自信地犯错时,p 会饱和到接近 0 或 1,p(1−p)→0,于是 MSE 梯度几乎消失为零。交叉熵则在误差越大时保持越强的梯度,因此成为分类的标准损失函数。
梯度消失是指损失很大,但用于参数更新的梯度几乎为零,导致训练停滞的现象。在 Sigmoid 输出 + MSE 损失的组合下,输出饱和区域(p≈0 或 p≈1)的 Sigmoid 导数 p(1−p) 会变得极小。MSE 梯度带有这个 p(1−p) 因子,因此恰恰在最想大幅更新(模型自信犯错)时梯度却消失了。交叉熵的梯度中不含 p(1−p),因而能避免该问题。
在交叉熵 CE = −[y·ln p + (1−y)·ln(1−p)] 中,若 p 恰为 0 或 1,对数会发散到 −∞,损失变为 Infinity 或 NaN。实现上的惯例是先把预测概率 p 钳制(裁剪)到诸如 [1e−12, 1−1e−12] 的微小区间,再取对数。本工具同样进行该钳制,因此即使把逻辑值 z 拉到 ±8,损失值也不会变成 NaN 或 Infinity。
把 Sigmoid p = σ(z) 与交叉熵 CE 复合后用链式法则求导,Sigmoid 导数 p(1−p) 与交叉熵对 p 的导数恰好相互抵消,留下简洁的 dCE/dz = p − y。这意味着「预测与真值之差」本身即为梯度——误差越大更新越大,是非常理想的性质。之所以能抵消,是因为 Sigmoid 与交叉熵在信息论上是一对匹配的组合。

实际应用

神经网络的分类任务:对于输出为类别概率的任务——图像分类、垃圾邮件判定、医学影像的良性/恶性判别等——交叉熵是事实上的标准损失。二分类用 Sigmoid + 二元交叉熵,多分类用 Softmax + 类别交叉熵。PyTorch 的 BCEWithLogitsLoss 与 TensorFlow 的 categorical_crossentropy 都遵循这一设计,直接接收逻辑值并以数值稳定的形式计算损失。

逻辑回归:作为经典统计模型的逻辑回归,其内部也直接使用「Sigmoid + 交叉熵」。最小化交叉熵损失在数学上等价于伯努利分布的极大似然估计。换言之,使用交叉熵是「选取使观测数据最为可能的参数」这一在统计上正当的步骤,而 MSE 并没有这种解释。

稳定基于梯度的优化:在深度学习中,层数越深,梯度在反向传播途中越容易变小。若在输出层使用 MSE,会在那里再叠加一次梯度消失,训练几乎停滞。仅把输出层换成交叉熵,至少来自输出层的梯度就会获得与误差成正比的健康大小,训练也随之更稳定。这与 ReLU 激活、批归一化并列,是对抗梯度消失的基本手段。

机器学习教学与模型调试:「分类模型训练不动」这类故障的典型原因之一,就是损失函数选错。借助本工具这样的可视化亲身体会一次「饱和区域 MSE 梯度消失」,日后训练停滞时就能第一时间怀疑损失函数与激活函数的组合。当损失曲线几乎平直、纹丝不动时,检查设计是否会引发梯度消失就是惯用做法。

常见误解与注意事项

首先常见的误解是断言「MSE 不能用于分类」。准确的说法应是「能用,但训练慢、容易不稳定」。MSE 损失本身形状正确——在 p=y 处取最小,仅看损失值它作为分类指标并未失效。问题在梯度而非损失值。由于在模型自信犯错的区域梯度会消失,优化无法推进。关键视角不是「损失小=好模型」,而是「选择梯度能随误差适当变化的损失」。

其次,「交叉熵即使不配 Sigmoid,梯度也是 p−y」这种想当然。dCE/dz = p−y 这一简洁形式,仅当 Sigmoid(多分类则为 Softmax)与交叉熵务必成对使用时才成立。例如输出层用 ReLU 或恒等映射,只在上面套交叉熵,这种抵消便不会发生。此外,对已经过 Sigmoid 的概率再施加一次 Sigmoid 的二次应用,或把逻辑值与概率混为一谈的实现,都是典型 bug。请注意别把「传入逻辑值的函数」(如 BCEWithLogitsLoss)与「传入概率的函数」弄混。

最后,认为「梯度消失只是 MSE 的问题」也很危险。梯度消失的根本原因是 Sigmoid/tanh 的饱和;即便把损失换成交叉熵,只要在隐藏层多级堆叠易饱和的激活函数,梯度依然会变小。交叉熵解决的只是「源自输出层损失的梯度消失」。整个深层网络的梯度消失,需要组合使用 ReLU 系激活、残差连接(跳跃连接)、恰当的权重初始化与批归一化等。请理解交叉熵并非万能药,它只是对抗梯度消失的众多手段之一。

使用指南

  1. 在logit值输入框(zNum)中输入原始预测得分,范围通常为-5到5
  2. 通过zRange滑块调整logit值范围以观察S形曲线上不同区间的损失行为
  3. 选择真实标签y=0或y=1,实时对比两种损失函数的数值与梯度变化
  4. 关注CE梯度与MSE梯度的比值,当比值>1时说明交叉熵在该点对权重更新的驱动力更强

具体计算示例

假设二分类神经网络输出logit z=0.5,真实标签y=1。sigmoid激活后预测概率p=1/(1+e^(-0.5))≈0.6225。交叉熵损失CE=-[1*ln(0.6225)+0*ln(0.3775)]≈0.4743;MSE损失=(0.6225-1)²≈0.1425。在该点CE的梯度|dCE/dz|=|0.6225-1|≈0.3775,MSE的梯度|dMSE/dz|=2*(0.6225-1)*0.6225*0.3775≈0.1133。梯度比约为3.33,表明交叉熵在接近边界时给出更强的学习信号。

实务注意事项

  1. 在logit值接近0时(z=-0.5到0.5),两种损失的梯度差异最明显,建议重点观察此区间内MSE梯度消失而CE梯度保持稳健的现象
  2. 当预测概率接近0.5(最不确定状态)时,交叉熵损失达到最大约0.693,此时MSE仅为0.25,说明交叉熵对分类边界附近的样本更敏感
  3. 在生产环境中,对于严重不平衡数据集(如医学诊断,正样本<1%),应优先选择交叉熵,因其梯度比例使正样本的学习信号不被稀释
  4. 若神经网络收敛缓慢,可通过本模拟器检验是否误用MSE作为分类损失,观察梯度比<0.5的区域是否为常见预测值