Softmax 与温度系数:今天真正弄懂
先记住:一句话定义 + 一句记忆口诀
一句话定义:Softmax 把一组“原始分数”变成一组“加起来等于 1 的概率”;温度系数控制这组概率是“更尖锐”还是“更平滑”。
记忆口诀:Softmax 管归一,温度管脾气;温度低更自信,温度高更犹豫。
生活类比:
你在看三个说话人谁最像当前这段音频。
模型给了三个分数:
- 说话人 A:3.0
- 说话人 B:1.0
- 说话人 C:0.5
这些分数本身不好直接读。
3.0 不是“3 倍概率”。
1.0 也不是“100%”。
它们只是模型的“偏好分”。
Softmax 就像一个裁判。
它把这些偏好分变成概率:
- A:最可能
- B:次可能
- C:较不可能
而且三者加起来正好是 1。
温度系数像“裁判的性格”。
温度低:裁判很果断。最高分会被放大,概率更集中。
温度高:裁判更谨慎。大家概率更接近。
必要公式:
普通 Softmax:
\[ p_i = \frac{e^{z_i}}{\sum_j e^{z_j}} \]
带温度系数的 Softmax:
\[ p_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} \]
逐个解释符号:
- \(z_i\):第 \(i\) 个类别的原始分数。也叫 logit。
- \(p_i\):第 \(i\) 个类别最后得到的概率。
- \(e\):自然指数函数。它会把分数变成正数,并放大分数差距。
- \(\sum_j\):对所有类别求和。
- \(T\):temperature,温度系数。必须大于 0。
- \(i\):当前看的那个类别。
- \(j\):遍历所有类别。
举个小例子:
logits 是:
\[ [3.0, 1.0, 0.5] \]
Softmax 后可能类似:
\[ [0.82, 0.11, 0.07] \]
意思是:
模型认为第一个类别概率最大。
注意:
这不是“真实世界一定 82%”。
这是“模型根据当前参数给出的相对置信度”。
温度怎么影响?
同样的 logits:
\[ [3.0, 1.0, 0.5] \]
如果 \(T = 0.5\):
先变成:
\[ [6.0, 2.0, 1.0] \]
差距变大。
Softmax 后更尖锐。
最高类别概率更高。
如果 \(T = 2.0\):
先变成:
\[ [1.5, 0.5, 0.25] \]
差距变小。
Softmax 后更平滑。
几个类别概率更接近。
它解决什么问题:
第一,解决“分数不能直接当概率”的问题。
神经网络最后一层常输出 logits。
比如音频分类:
- 狗叫:2.1
- 音乐:0.8
- 说话:4.6
这些值可能是负数,也不加和为 1。
Softmax 把它们转成概率分布。
第二,解决“多类别只能选一个”的训练问题。
很多任务是单标签分类:
- 这帧音频属于哪个音素?
- 这张图属于哪个类别?
- 当前语音段最像哪个说话人?
- 当前视频片段属于哪个动作?
Softmax 给每个类别一个概率。
再配合交叉熵损失,让正确类别概率变大。
第三,解决“模型输出需要可比较”的问题。
不同类别的 logit 不好直接解释。
Softmax 后,可以说:
“模型在这些候选里更偏向谁”。
没有 Softmax 会怎样:
- 输出可能是负数。
- 输出不加和为 1。
- 很难解释成概率。
- 多类别分类训练不方便。
- 推理时只能看最大 logit,但不知道相对差距。
- 做阈值判断、置信度过滤、后处理会更难。
不过也要注意:
训练时在 PyTorch 里,常用 `CrossEntropyLoss`。
它内部已经包含了 `LogSoftmax + NLLLoss`。
所以训练分类模型时,不要在 `CrossEntropyLoss` 前手动加 Softmax。
否则容易训练变差。
资料怎么学:
- Dive into Deep Learning 的 Softmax 部分,适合从概率直觉、线性分类到实现一步步学。
- PyTorch Softmax 文档,适合确认 `dim` 参数怎么写,以及 API 行为。
Softmax 输入的原始分数通常叫什么?
PyTorch 中 logits 形状是 [batch, classes] 时,Softmax 通常沿哪个维度做?
温度 T 变大时,Softmax 输出会怎样?
发展流程:
第一阶段:直接用分数。
早期或最简单的分类想法是:
哪个类别分数最大,就选哪个。
比如:
\[ [3.0, 1.0, 0.5] \]
直接选第一个。
这能做决策。
但问题是:
分数不是概率。
分数尺度也不稳定。
一个模型输出 10,另一个模型输出 100,不能直接比较。
第二阶段:需要概率。
很多任务不只要“选谁”。
还要知道“有多确定”。
比如说话人日志 diarization:
系统可能要判断:
- 这段是不是同一个说话人?
- 是否需要新建说话人?
- 当前段属于哪个聚类?
- 这个预测能不能信?
这时概率比原始分数更好用。
Softmax 就出现了。
它把任意实数分数变成概率分布。
第三阶段:和交叉熵结合。
现代分类模型常这样训练:
输入 → 编码器 → 分类头 → logits → 交叉熵损失。
交叉熵会鼓励正确类别的概率变大。
在数学实现上,常把 Softmax 和 log 结合起来算。
因为这样更稳定。
PyTorch 的 `CrossEntropyLoss` 就是典型做法。
第四阶段:温度系数加入。
后来大家发现:
模型的概率有时不准。
比如模型说 0.95,但实际只对了 0.75。
这叫置信度不校准。
温度系数可以调节概率分布形状。
常见用途:
- 训练后概率校准。
- 蒸馏学习中让 teacher 的分布更柔和。
- 生成模型采样时控制随机性。
- 对比学习中控制相似度分布的尖锐程度。
现在怎么用:
在主流模型里,Softmax 很常见。
- 分类头里。
比如音频事件分类:
音频 → CNN/Transformer 编码器 → 线性层 → logits → Softmax 概率。
- 注意力机制里。
Transformer 里有 attention。
它会算 query 和 key 的相似度分数。
然后用 Softmax 变成注意力权重。
这些权重加起来等于 1。
再对 value 加权求和。
所以 Softmax 不只用于分类。
也用于“分配注意力”。
- 说话人识别里。
训练说话人分类器时:
语音片段 → speaker embedding → 分类层 → 每个训练说话人的 logits → 交叉熵。
这里通常训练时用 `CrossEntropyLoss`。
推理时可能不再用这个分类头,而是拿 embedding 做相似度比较。
- 说话人日志中。
说话人日志经常不是简单 Softmax 一步完成。
但 Softmax 会出现在很多子模块里:
- 语音活动检测:speech / non-speech 分类。
- 重叠语音检测:overlap / non-overlap 分类。
- 说话人变化检测:change / no-change 分类。
- 神经聚类或端到端 diarization 的帧级说话人概率。
- Transformer 模块内部的 attention 权重。
- 音视频理解中。
Softmax 可用于:
- 视频动作分类。
- 音频事件分类。
- 音视频同步判断。
- 多模态融合时的权重分配。
- attention 模块中的归一化。
与相近概念的区别:
- Softmax vs Sigmoid。
Sigmoid:
\[ \sigma(z)=\frac{1}{1+e^{-z}} \]
它把一个数压到 0 到 1。
常用于二分类或多标签分类。
多标签的意思是:
一个样本可以同时属于多个类别。
比如一段音频里可以同时有:
- 说话声
- 音乐
- 背景噪声
这时每个标签独立判断。
用 Sigmoid 更合适。
Softmax:
一组类别之间互相竞争。
概率总和为 1。
适合单标签多分类。
比如一段音频只选一个主类别。
- Softmax vs Argmax。
Argmax 只选最大的位置。
比如:
\[ [0.7, 0.2, 0.1] \]
Argmax 输出第 1 类。
它不给完整概率。
也不可导。
训练神经网络时,通常不能直接用 Argmax 做损失。
Softmax 给完整概率分布。
可以参与梯度计算。
- Softmax vs LogSoftmax。
Softmax 输出概率。
LogSoftmax 输出概率的对数。
\[ \log(p_i) \]
训练时常用 LogSoftmax,因为数值更稳定。
PyTorch 的 `CrossEntropyLoss` 内部就用到了这个思路。
- Softmax vs 归一化。
普通归一化可能是:
把一组数除以总和。
但如果有负数,会出问题。
Softmax 先用指数变正数,再归一。
而且指数会强调高分。
- 温度系数 vs 学习率。
温度控制输出分布形状。
学习率控制参数更新步子大小。
两者不是一回事。
温度不直接决定模型学多快。
当前局限:
事实部分:
- Softmax 概率不一定等于真实概率。
模型输出 0.9,不代表现实中一定有 90% 的频率正确。
它可能过度自信。
- Softmax 会强制类别竞争。
如果任务本来是多标签,Softmax 不合适。
比如音频里同时有说话和音乐。
用 Softmax 会逼模型二选一。
- Softmax 对大 logit 差距很敏感。
最高分稍微大一些,概率可能就很集中。
这会让模型看起来很自信。
- 类别很多时,Softmax 计算成本更高。
因为要对所有类别求指数和求和。
大词表语言模型尤其明显。
- 维度容易写错。
在 PyTorch 里,`dim` 很关键。
如果 logits 形状是 `[batch, classes]`,通常用 `dim=1`。
如果写成 `dim=0`,就会在 batch 维度上归一化,含义错了。
未来可能作用:
事实部分:
温度系数现在已经常用于:
- 概率校准。
- 知识蒸馏。
- 生成模型采样。
- 对比学习。
- 注意力分布控制。
推测部分:
未来在音视频和说话人日志里,温度可能更多用于动态置信度控制。
比如:
噪声大时,提高温度,让模型别太自信。
语音清晰时,降低温度,让决策更果断。
这属于合理推测,不是所有系统都已经这样做。
推测部分:
多模态系统可能会按模态质量调温度。
比如视频模糊时,降低视频分支权重;音频清晰时,提高音频分支影响。
但具体做法依赖模型设计。
不能说这是统一标准。
最后再压缩一遍:
Softmax 做三件事:
- 指数化:把分数变正,并拉开差距。
- 求总和:算总票数。
- 除总和:变成概率。
温度做一件事:
- 调分布尖锐程度。
温度小于 1:
- 更尖。
- 更自信。
- 更接近 argmax。
温度大于 1:
- 更平。
- 更保守。
- 更接近平均分布。
温度趋近 0:
- 几乎只选最大项。
温度趋向无穷大:
- 各类别接近均匀概率。
口诀:
Softmax 把分数变概率;温度低,赢家通吃;温度高,大家都有戏。
- Softmax 的输出为什么一定加起来等于 1?
- 如果一个音频片段可以同时有“说话声”和“音乐”,应该用 Softmax 还是 Sigmoid?为什么?
- 温度系数从 1 改成 0.5,概率分布会更尖锐还是更平滑?这对模型置信度有什么影响?