SoftMax函数
概念
SoftMax 函数是一种专门用于多分类问题的激活函数,它的作用是把神经网络输出层的多个原始数值转换成一组概率分布,使得所有输出值都在 0 到 1 之间,并且所有输出值的总和恰好等于 1,这样就可以直接把这些输出理解为样本属于各个类别的概率。具体来说,SoftMax 会对输出层的每个数值先取指数,这一步可以让较大的值变得更大、较小的值变得更小,从而拉大差距,然后把每个数值的指数除以所有数值指数的总和,得到归一化后的概率值。
函数表达式:
即:对每个元素取指数,然后除以所有元素指数之和。
需要值得注意的是:Softmax 函数的数值溢出,数值溢出包括数值上溢和下溢两张情况:
- 上溢:数值较大的数据经过一些运算后其数值非常大,以至于超过计算机 的存储范围而无法继续运算,在程序中表现为
- 下溢:非常接近0 的数据被四舍五入为 0,从而产生毁灭性的误差。
对于上溢出我们采用减去最大值的方式:
对于下溢出我们采用对函数:
| 特点 | 说明 |
| 输出范围 | 每个输出值在 (0, 1) 之间 |
| 输出总和 | 所有输出值之和等于 1 |
| 可微分 | 处处可导,适合梯度下降优化 |
| 放大差异 | 指数运算让大的更大,小的更小 |
|---|
用法
SoftMax 主要用于神经网络的输出层,将原始分数转换为概率分布:
- 多分类任务:如图像分类(猫/狗/鸟)、文本分类(正面/负面/中性)
- 与交叉熵损失搭配:计算预测概率与真实标签之间的差距
- 注意力机制:Transformer 中计算注意力权重
代码实现:
python
import numpy as np
def softmax(z):
exp_z = np.exp(z - np.max(z)) # 减去最大值防止数值溢出
return exp_z / np.sum(exp_z)
input1 = np.array([-0.5, -0.2, 0, 0.2, 0.5])
input2 = np.array([-5, -2, 0, 2, 5])
output = softmax(input1)
output = [float('{:.4f}'.format(i)) for i in output]
print(f"{output}")
output = softmax(input2)
output = [float('{:.4f}'.format(i)) for i in output]
print(f"{output}")
输出结果为:
可以明显看到, x 的数值分布越不均匀,则Softmax(x)的两极化越明显 在上面第二个 input 中, -5 对应的输出已经非常接近0,而 5 对应的输出已经接近 0.95。