参数设置
正确的类别固定为c=1("类别1")。One-hot标签为y = (1, 0, 0)。
概率分布与温度的影响
上半部=当前T的P(class i)(绿=正确,蓝=其他类别)/下半部=T=0.5、1、2、5的P比较/左下=损失与预测类别
理论与主要公式
Softmax将实数向量z转换为概率分布p,交叉熵测量预测与正确标签y的距离。
带温度T的Softmax。用T除后再指数化和归一化:
$$p_i = \frac{\exp(z_i / T)}{\sum_{j} \exp(z_j / T)}$$
交叉熵损失。y是one-hot标签(仅正确类为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是把"分数(logit)"转换成"概率"的函数。在上面的模拟器中,当z_1=2、z_2=1、z_3=0时,概率分别是0.665、0.245、0.090,加起来正好是1。每个分数通过exp变成正数,然后用总和归一化。因为用了指数,分数之间的差异会被"指数级地"放大,这是Softmax的关键。
🎓
这是用来测量预测概率和"正确标签"之间差异的量。如果正确类是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是先把logit除以T再通过Softmax的参数。T越大,差异就会缩小,概率分布越接近均匀;T越小,差异就放大,概率会集中在最大元素上。下面的图用T=0.5、1、2、5并排比较,你可以看看区别。在实际工作中的"知识蒸馏"会用比较大的T,把教师模型的"分布形状"原原本本传给学生。
🎓
说得好。z=1000的话exp(1000)会变成无穷大,算不了。所以在编程实现时,一般是"把所有logit减去最大值,再计算exp"。Softmax对常数平移不变,所以结果不会改变,最大元素变成exp(0)=1,这样就不会overflow了。这叫log-sum-exp技巧。这个模拟器即使把滑块拉到最右边z=5也不会坏,你可以试试。
常见问题
当T→0时,最大logit对应的类概率会几乎全部集中到1,其他都压到0(硬分布)。比如z_1=2、z_2=1、z_3=0,T=0.1时p_1接近1。反过来T→∞时所有类的概率都相等,3分类就都接近1/3≈0.333(软分布)。温度T就像直接控制分布"尖锐度"的旋钮。
在Hinton等人的知识蒸馏论文中,教师模型和学生模型都用较大的温度(比如T=4~10)来计算Softmax,让学生学会"模仿分布的形状"。如果T=1,最大元素几乎就只有1,信息太少。用大的T后,"次优类的概率"等细节就会显露出来,学生能学到教师发现的"类之间的相似程度"。推理时再改回T=1。
标签平滑是把one-hot标签(正确类为1.0)改成0.9,剩下0.1均匀分给其他类的正则化方法。通过平滑L = -Σ y_i log(p_i)中的y,能防止模型"过度自信"。这能改善泛化性能,防止过拟合,在图像分类、语音识别等领域是标准技巧。
当logit太大时exp会overflow(z≈709时变成+Inf),太小会underflow变成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等大型语言模型,每个位置都输出"词汇表大小的logit",通过Softmax得到下一个token的分布。训练时损失是正确token的-log p_c,推理时可以用温度T控制"采样的多样性"(T大就多样,T小就确定)。ChatGPT的"temperature"设置就是这个T。
知识蒸馏(模型压缩):大规模教师模型的预测分布(高温Softmax)被小规模学生模型学着模仿的方法。BERT→DistilBERT、图像分类的量化模型等,为了在边界设备上部署都用这个手段。"升高温度"是关键,T=1的话信息会丢失。
强化学习、策略网络:在策略梯度法(REINFORCE、PPO)中,行动的选择概率用Softmax输出。温度高倾向于探索,温度低倾向于利用,有的实现会在学习前期和后期调度温度。AlphaGo的MCTS中也用了类似的软选择。
常见误解与注意
最普遍的误解是"Softmax的输出就是真正的概率,无条件相信它"。深度模型的Softmax输出虽然满足概率的数学性质(非负、和为1),但不一定经过了"正确的标度"。特别是现代深层神经网络往往"过度自信",预测说有0.99的把握时,实际正确率才80%是常见的。在医疗诊断、自动驾驶这样安全第一的领域,需要用temperature scaling这样的后处理校正。
第二常见的误解是"交叉熵损失和MSE(均方误差)是一样的,怎么用都行"。交叉熵要求输入是"归一化的概率",直接用Softmax之前的logit套-y log z公式会出现NaN或负值,完全破裂。PyTorch的nn.CrossEntropyLoss接收logit(内部自动计算log_softmax),而nn.NLLLoss接收log概率。一定要确认函数的前置条件。
最后是"温度T是提升模型精度的魔法参数"这种想法很危险。训练时改T只是改变损失函数的形状,推理时T=1评估的精度本质上不会变。T真正有用的场景是"蒸馏学习中传递教师的分布"、"生成模型中控制采样多样性"、"分类的不确定性补正"这种需要"利用概率分布形状"的任务。拿模拟器试试改T看什么变什么不变,慢慢理解吧。