Softmax激活函数 详解
Softmax激活函数是深度学习中多分类任务的核心激活函数 ,其核心作用是将神经网络输出层的任意实数向量,映射为总和为1的概率分布,让每个输出值都能表示对应类别的预测概率,便于后续分类决策和损失计算。
一、数学公式与符号解释
对于一个长度为 K 的输入向量 (
是输出层第
个神经元的原始得分,也称 logit),Softmax 函数会输出一个同维度的概率向量
,其中第
个元素的计算公式为:
关键符号说明
-
:对第
个输入得分做指数运算,放大输入之间的差异(得分越高,指数后的值占比越大)。
-
分母
:所有输入得分的指数和,用于归一化,保证输出向量的所有元素之和为 1。
示例
若输入向量 ,则 Softmax 计算过程为:
\\begin{align*} \\sigma_1 \&= \\frac{e\^2}{e\^2 + e\^1 + e\^0} = \\frac{7.389}{7.389+2.718+1} \\approx 0.659 \\ \\sigma_2 \&= \\frac{e\^1}{e\^2 + e\^1 + e\^0} \\approx 0.242 \\ \\sigma_3 \&= \\frac{e\^0}{e\^2 + e\^1 + e\^0} \\approx 0.099 \\end{align*}
输出概率向量 ,总和为 1,可解释为:类别 1 的预测概率 65.9%,类别 2 24.2%,类别 3 9.9%。
二、核心特性
- 归一化特性
输出向量所有元素之和恒为 1,这是 Softmax 最核心的特点,也是它适合多分类任务的根本原因------输出可直接作为概率分布。
- 指数放大效应
指数函数的特性会放大输入得分的差异:得分高的元素,指数后占比会急剧提升;得分低的元素,占比会被进一步压缩。
例如输入 ,输出
,高得分的类别几乎占据全部概率。
- 温度系数的调节作用
实际应用中常引入温度系数 T 来控制概率分布的"陡峭程度",公式变为:
-
:分布变平缓,概率差异减小,适合模型训练时的"软化"预测(如知识蒸馏)。
-
:标准 Softmax。
-
:分布变陡峭 ,概率差异放大,趋近于 one-hot 编码(只有一个类别概率为 1,其余为 0),适合推理时的硬分类。
- 无饱和区
与 Sigmoid、Tanh 不同,Softmax 没有饱和区(即输入无论多大/多小,梯度都不会趋近于 0),但需注意数值溢出问题。
三、典型应用场景
Softmax 几乎是深度学习多分类任务输出层的标配,常见场景包括:
-
图像分类:CNN 模型的最后一层,将特征映射为各类别的概率(如 ResNet 分类 ImageNet 1000 类)。
-
自然语言处理:文本分类、词性标注、命名实体识别等任务的输出层。
-
推荐系统:多候选物品的排序概率输出。
注意:二分类任务通常用 Sigmoid 函数(输出单个概率值),而非 Softmax(输出两个概率值,且两者之和为 1,存在冗余)。
四、优缺点分析
优点
-
输出是概率分布,可解释性强,便于理解模型的预测倾向。
-
与交叉熵损失函数搭配时,梯度计算简洁高效(梯度公式无复杂链式求导项)。
-
无饱和区,能有效传递梯度,避免模型训练后期梯度消失。
缺点
- 数值溢出风险
当输入 很大时,
会超出浮点数的表示范围(如
是无穷大),导致计算溢出。
解决方案 :计算时对输入向量 减去其最大值
,公式等价变换后可避免溢出:
变换原理:分子分母同乘 ,值不变,但指数部分的数值被大幅降低。
- 对类别不平衡敏感
若训练数据中某类样本占比极高,模型容易倾向于预测该类,Softmax 的指数放大效应会加剧这种偏差。
解决方案:引入类别权重、过采样/欠采样、 focal loss 等方法。
- 类别数增多时计算成本上升
当类别数 很大(如 10 万类),分母的求和操作
会消耗大量计算资源。
五、数值稳定的 Python 实现
下面提供原始实现 和数值稳定实现的对比代码,直观展示溢出问题的解决方法:
python
import numpy as np
def softmax_naive(z):
"""原始 Softmax 实现(存在溢出风险)"""
exp_z = np.exp(z)
return exp_z / np.sum(exp_z)
def softmax_stable(z):
"""数值稳定的 Softmax 实现(推荐)"""
max_z = np.max(z)
exp_z = np.exp(z - max_z) # 减去最大值,避免溢出
return exp_z / np.sum(exp_z)
# 测试:输入包含大数值
z = np.array([1000, 998, 999])
# print(softmax_naive(z)) # 会输出 [nan, nan, nan],因为 exp(1000) 溢出
print(softmax_stable(z)) # 输出 [0.88079708 0.04742587 0.07177705]
六、与交叉熵损失的搭配
在多分类任务中,Softmax 几乎总是和 交叉熵损失(Cross-Entropy Loss) 搭配使用,原因是两者联合求导的结果非常简洁。
假设真实标签为 one-hot 向量 (只有正确类别对应的
,其余为 0),交叉熵损失公式为:
由于 是 one-hot 向量,损失可简化为
(
是正确类别)。
对损失 关于输入得分
求导,最终结果为:
这个梯度公式无复杂计算,极大降低了模型训练的计算开销,这也是 Softmax + 交叉熵成为多分类标配的核心原因。
七、与 Sigmoid 函数的区别
| 特性 | Softmax 函数 | Sigmoid 函数 |
|---|---|---|
| 适用任务 | 多分类(输出概率分布,总和为1) | 二分类(输出单个概率值,范围 0~1) |
| 输出维度 | 与输入维度相同 | 与输入维度相同(或压缩为 1 维) |
| 输出关联性 | 输出值相互关联(总和为1) | 输出值相互独立 |
| 典型应用 | 分类任务输出层 | 二分类输出层、隐藏层 |