Softmax 与交叉熵损失模拟器 返回
机器学习模拟器

Softmax 与交叉熵损失 — 分类训练的核心

将三分类的对数几率通过 Softmax 转换为概率,并实时计算与正确类别的交叉熵损失。拖动温度 T 滑块,可直观感受分布锐化或平滑的变化以及损失的响应。

参数设置
对数几率 z_1(类别1:正确)
对数几率 z_2(类别2)
对数几率 z_3(类别3)
温度 T

正确类别固定为 c = 1("类别 1")。one-hot 标签为 y = (1, 0, 0)。

计算结果
P(类别 1) ←正确
P(类别 2)
P(类别 3)
交叉熵损失 L
概率分布与温度的影响

上半=当前 T 下 P(class i)(绿=正确类别,蓝=其他)/下半=T=0.5, 1, 2, 5 下 P 的对比/右下=损失与预测类别

理论与主要公式

Softmax 将实数向量 z 变为概率分布 p;交叉熵衡量该预测与 one-hot 标签 y 之间的距离。

带温度 T 的 Softmax。先将每个对数几率除以 T,再取指数并按和归一化:

$$p_i = \frac{\exp(z_i / T)}{\sum_{j} \exp(z_j / T)}$$

交叉熵损失。y 为 one-hot 标签(仅正确类别 c 为 1):

$$L = -\sum_{i} y_i \log(p_i) = -\log(p_c)$$

数值稳定化(log-sum-exp)。Softmax 对常数平移不变,因此先减去最大值再求 exp:

$$p_i = \frac{\exp((z_i - z_{\max}) / T)}{\sum_{j} \exp((z_j - z_{\max}) / T)}$$

T 越小分布越锐(集中于 argmax),T 越大越接近均匀分布。这正是知识蒸馏中所利用的关键性质。

Softmax 与交叉熵损失模拟器是什么

🙋
听说分类模型最后都要过一层"Softmax",它到底在做什么?
🎓
简单说,Softmax 把"分数(logits)"变成"概率"。在上面这个模拟器里,z_1=2, z_2=1, z_3=0 对应的概率正好是 0.665, 0.245, 0.090,加起来恰好为 1。做法就是对每个分数取指数让它变正,再除以总和归一化。妙处在于,指数会把分数之间的差异以指数方式放大。
🙋
明白了!那下面的"交叉熵损失"又是什么?
🎓
它衡量预测概率与"真实标签"之间的差距。设正确类别为 c,损失就是 L = -log(p_c)。现在正确类别是 C1、p_1 = 0.665,所以 L ≈ 0.408。p_c 接近 1 时 L→0;自信地预测错误,p_c=0.01 时 L→4.6——它特别"狠地"惩罚那种自信地犯错的情况。
🙋
拖动温度 T 滑块时,所有概率都一起在变。T=5 时它们都接近 0.3 左右。
🎓
观察得很敏锐。T 是在送入 Softmax 之前用来除以每个对数几率的参数。T 大时分量之间的差异缩小,趋向均匀分布;T 小时差异被放大,概率集中到最大分量上。下面这张图把 T=0.5, 1, 2, 5 并排画出来——可以对比着看。在实际工程里,"知识蒸馏"就是用较大的 T,让学生模型学到教师分布的"形状"。
🙋
如果对数几率特别大,计算会不会出问题?
🎓
问得很到位。当 z=1000 时 exp(1000) 会溢出到无穷大。所以实现上的标准做法是"先从所有对数几率中减去最大值再做 exp"。Softmax 对常数平移不变,因此结果不变,而最大分量变成 exp(0)=1,绝不会溢出。这就是 log-sum-exp 技巧。这个模拟器内部也是这样做的,所以即使把 z 调到 5(上界)也不会崩。可以把滑块拉到两端试试。

常见问题

在 T→0 的极限下,概率几乎全部集中到对数几率最大的类别上,其他趋于零(hard 分布)。在 z_1=2, z_2=1, z_3=0、T=0.1 下,p_1 基本上等于 1。反之,T→∞ 时所有类别的概率趋于相等;三分类时即 1/3 ≈ 0.333(soft 分布)。可以说 T 是直接调节"分布锐度"的旋钮。
Hinton 等人提出的知识蒸馏中,教师与学生都使用较大的 T(例如 T=4 到 10)输出 Softmax,让学生匹配教师分布的"形状"。T=1 时几乎所有质量都集中在最优类别上,信息量贫乏;T 大时次大类别的概率等"教师学到的类别之间的相似度"才会显现。推理时把 T 复位为 1。
一种正则化方法:将"仅正确类别为 1.0 的 one-hot 标签"改为,例如正确类别为 0.9、其余 0.1 在其他类别间均匀分配。通过在 L = -Σ y_i log(p_i) 中平滑 y,可以避免模型变得过度自信。一般会改善泛化与校准性,是图像分类、语音识别等的标准技巧。
对数几率过大时 exp(z) 在双精度下会溢出(z≈709 时变为 +Inf),过小时下溢为 0。实现中改用 p_i = exp(z_i − max(z)) / Σ exp(z_j − max(z))。由于 Softmax 对常数平移不变,结果一致,且最大分量变为 exp(0)=1,数值稳定。PyTorch 与 TensorFlow 的 log_softmax 内部正是这样实现的。

实际应用

图像分类与目标检测:ResNet、ViT 等图像分类模型的最后一层输出 Softmax 概率,并以交叉熵损失训练。在 ImageNet(1000 类)上,z 是 1000 维向量,输出为每个类别的概率。目标检测(YOLO、Faster R-CNN)中,对每个候选框的类别预测也使用同样的框架。

语言模型与机器翻译:GPT、BERT 等大语言模型在每个位置输出"词表大小维度的对数几率",再用 Softmax 得到下一个 token 的分布。训练时以正确 token 的 -log p_c 为损失,推理时用温度 T 控制"采样的多样性"(T 大则多样,T 小则更确定)。ChatGPT 的 "temperature" 设置正是这个 T。

知识蒸馏(模型压缩):让小型学生模型模仿大型教师模型在高温下的 Softmax 分布。BERT → DistilBERT、图像分类的量化模型等,蒸馏在面向边缘部署的模型轻量化中被广泛使用。关键在于"提高温度":T=1 时信息会丢失。

强化学习与策略网络:策略梯度方法(REINFORCE、PPO)通过 Softmax 输出动作选择概率。温度大偏向探索,小偏向利用,有些实现会在训练中调度 T。AlphaGo 的 MCTS 也采用了类似的软选择规则。

常见误解与注意事项

最常见的误解是"无条件地把 Softmax 输出当作真实的概率"。深度模型的 Softmax 输出虽然满足概率的数学性质(非负、求和为 1),但并不一定"校准良好"。尤其是现代深度神经网络容易"过度自信"——即使预测 p=0.99,实际正确率可能只有 80% 左右。在医疗诊断、自动驾驶等对安全性要求高的场景中,会用 temperature scaling 等事后校准方法来修正。

其次常见的是"以为交叉熵损失可以像 MSE(均方误差)一样使用"。交叉熵以概率分布为前提,必须输入"已归一化的概率"才有意义。把未经 Softmax 的原始对数几率直接代入 -y log z,会得到 NaN 或负值而崩溃。PyTorch 的 nn.CrossEntropyLoss 接受原始对数几率(内部计算 log_softmax),nn.NLLLoss 则需要 log 概率——一定要先弄清楚每个函数的输入约定。

最后,"以为温度 T 是能提高模型精度的魔法参数"同样危险。训练时改变 T 只会改变损失函数的形状,推理时以 T=1 评估的精度本质上不会改变。T 真正发挥作用的场景是"在蒸馏中传递教师分布"、"在生成模型中控制采样多样性"、"对分类不确定性进行校准"等需要利用概率分布"形状"本身的任务。请在模拟器上拖动 T,观察什么在变、什么不变——理解这个区分才是关键。