神经网络之激活函数Softmax
🧠 一、设计动机:Softmax 为什么存在?
Softmax 的设计核心思想是:
将任意实数向量映射为一个概率分布,使得所有元素都为正,并总和为 1。
📌 背后的需求:
在多分类任务中,神经网络输出一个向量(logits),每个分量表示模型对某个类别的“评分”或“偏好”。
但我们希望模型输出的是每个类别的概率,因此需要一个转换机制:
从打分→概率 \text{从打分} \rightarrow \text{概率} 从打分→概率
Softmax 就是这个“打分转概率”的函数。
🔢 二、数学定义与形式
设输出层的未归一化向量为:
z=[z1,z2,...,zK] \mathbf{z} = [z_1, z_2, ..., z_K] z=[z1,z2,...,zK]
Softmax 输出:
softmax(zi)=ezi∑j=1Kezjfor i=1,...,K \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} \quad \text{for } i = 1, ..., K softmax(zi)=∑j=1Kezjezifor i=1,...,K
✅ 特性总结:
特性 | 描述 |
---|---|
非负性 | 所有输出 ∈(0,1)\in (0, 1)∈(0,1) |
归一性 | 所有输出总和为 1,构成有效的概率分布 |
可导性 | 对每个输入 ziz_izi 都可微,有封闭形式的导数 |
🎲 三、Softmax 的概率解释
Softmax 实际上来源于统计物理中的Boltzmann分布,在信息论中可解释为:
给定一组能量值 ziz_izi,我们希望获得每个状态被“选中”的概率。能量越低的状态越可能被选中。
在机器学习中:
- ziz_izi 可以看作是某个类别的“置信评分”;
- Softmax 将这些评分转化为概率,使得高评分的类别对应更高概率。
它是**最大熵原理(Maximum Entropy Principle)**在多类输出问题中的自然选择:
在满足均值约束下,Softmax 是熵最大的概率分布。
📈 四、Softmax 的导数与梯度结构
反向传播中,Softmax 的梯度结构是训练中的核心之一。
设:
si=softmax(zi) s_i = \text{softmax}(z_i) si=softmax(zi)
Softmax 的偏导数:
$$
\frac{\partial s_i}{\partial z_j} =
\begin{cases}
s_i (1 - s_i), & \text{if } i = j \
- s_i s_j, & \text{if } i \ne j
\end{cases}
$$
这构成一个 Jacobian 矩阵 J∈RK×K\mathbf{J} \in \mathbb{R}^{K \times K}J∈RK×K,其结构具有特殊性:
- 对角线为正(表示每个输出对自身的敏感性);
- 非对角线为负(类别之间具有竞争关系)。
📌 这种“竞争机制”使得 Softmax 能捕捉类别之间的相对关系。
🔄 五、Softmax 与交叉熵的联合优化
通常,我们不单独使用 Softmax,而是配合 交叉熵损失函数(Cross-Entropy Loss) 一起使用。这有数学上的简洁性和数值稳定性的优势。
给定:
- 模型输出(logits):z\mathbf{z}z
- Softmax 输出概率分布:p=softmax(z)\mathbf{p} = \text{softmax}(\mathbf{z})p=softmax(z)
- 真实标签 one-hot 向量:y\mathbf{y}y
交叉熵损失为:
L=−∑i=1Kyilog(pi) \mathcal{L} = - \sum_{i=1}^K y_i \log(p_i) L=−i=1∑Kyilog(pi)
由于 yiy_iyi 是 one-hot 的,这简化为:
L=−log(pc)(真实类别索引为 c) \mathcal{L} = -\log(p_{c}) \quad \text{(真实类别索引为 } c \text{)} L=−log(pc)(真实类别索引为 c)
🚀 联合梯度优势:
将 Softmax 和交叉熵一起考虑,其组合的梯度非常简洁:
∂L∂zi=pi−yi \frac{\partial \mathcal{L}}{\partial z_i} = p_i - y_i ∂zi∂L=pi−yi
这意味着我们不必显式计算 Softmax 和 log 的导数 —— 框架如 PyTorch、TensorFlow 都进行了内建优化(nn.CrossEntropyLoss()
直接接收 logits)。
🧮 六、数值稳定性与实现技巧
由于 ezie^{z_i}ezi 的快速增长,Softmax 在实践中容易出现 overflow,导致 NaN 或 Inf。
为了解决这个问题,常用如下数值稳定技巧:
✅ 稳定 Softmax:
softmax(zi)=ezi−max(z)∑jezj−max(z) \text{softmax}(z_i) = \frac{e^{z_i - \max(\mathbf{z})}}{\sum_j e^{z_j - \max(\mathbf{z})}} softmax(zi)=∑jezj−max(z)ezi−max(z)
减去最大值不会改变输出结果(因为是比值),但能显著减小数值范围,提高稳定性。
🧠 七、为什么不用 Sigmoid?
Softmax 和 Sigmoid 有一定相似性,都是将输出映射为概率,但用途不同:
属性 | Softmax | Sigmoid |
---|---|---|
输出总和是否为 1 | ✅ 是 | ❌ 否 |
类别是否互斥 | ✅ 是(多类选一) | ❌ 否(可多标签) |
应用层 | 多分类输出层 | 二分类输出,或中间层 |
当任务是 “从多个类中选一个”(如图像分类),使用 Softmax;
当任务是 “每个类都可能属于或不属于”(如多标签任务),使用 Sigmoid。
💡 八、进阶应用:温度 Softmax(Softmax with Temperature)
引入一个温度参数 T>0T > 0T>0:
softmaxT(zi)=ezi/T∑jezj/T \text{softmax}_T(z_i) = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} softmaxT(zi)=∑jezj/Tezi/T
- 当 T→0T \to 0T→0:输出趋近于 one-hot(更确定);
- 当 T→∞T \to \inftyT→∞:输出变得平滑(接近均匀分布);
- 用于控制输出的“确定性”与“探索性”之间的权衡。
📌 在**模型蒸馏(knowledge distillation)**中,常使用 T>1T > 1T>1 来提取教师模型的“软标签”。
🔬 九、Softmax 的局限性
虽然强大,但 Softmax 并非完美:
- 对类别关系不建模:无法表达“类别之间相似性”;
- 输出非稀疏:即使概率接近 0,也不会真正为 0;
- 对异常值敏感:logits 受极端输入影响较大;
- 类别数多时计算成本高(如词汇量大的语言模型);
替代方案示例:
- Sparsemax:产生稀疏概率,部分类别概率为 0
- Gumbel-Softmax:可微的 one-hot 近似,用于强化学习或离散选择
- Hierarchical Softmax:减少大量类别下的计算复杂度
✅ 十、一句话总结
Softmax 是将向量“打分”转化为概率分布的函数,它以指数放大差异、总和归一为原则,在多类互斥分类任务中提供了可训练、可解释、可优化的输出机制。