介绍
softmax 的可实现 “概率归一化”
提示:与 “普通归一化(如 min-max 归一化)”有本质区别
softmax 激活函数 用于解决 多分类 问题,详见链接。
公式
softmax 的数学定义如下(以 PyTorch 中的一维张量为例):
对于输入张量:
x = [x_1,x_2,\ldots,x_n]
softmax 计算每个元素的输出:
\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}
\text{j} = 1,2,3, \ldots ,n
特征:
- 所有输出值都在
(0, 1)区间内; - 所有输出值的 总和为 1。
这完全符合 “概率归一化” 的要求——将数据映射到特定范围,且满足特定约束,即:总和为1
代码验证(PyTorch 实现)
import torch
import torch.nn.functional as F
# 定义一个任意一维张量(模拟分类模型的logits输出)
logits = torch.tensor([1.0, 2.0, 3.0])
# 应用softmax归一化
softmax_out = F.softmax(logits, dim=0)
print("softmax输出:", softmax_out)
# 输出:tensor([0.0900, 0.2447, 0.6652])
print("输出总和:", softmax_out.sum())
# 输出:tensor(1.0)(完美归一化到总和为1)
print("每个值的范围:", (softmax_out.min(), softmax_out.max()))
# 输出:(tensor(0.0900), tensor(0.6652))(都在0~1之间)
softmax 归一化 vs 普通归一化
虽然都叫“归一化”,但 softmax 和 min-max 归一化、L2 归一化等场景不同,核心差异如下:
| 特性 | softmax 归一化 | min-max 归一化([0,1]) | L2 归一化 |
|---|---|---|---|
| 输出约束 | 总和=1(概率分布) | 范围=[0,1] | 向量模长=1 |
| 数值敏感性 | 放大差异(指数特性) | 线性映射,保留原始差异 | 仅调整尺度,保留方向 |
| 典型应用 | 多分类任务(输出类别概率) | 特征预处理(统一量纲) | 相似度计算(如余弦相似度) |
对比 softmax 和 min-max 归一化
# 同一组数据,两种归一化方式
x = torch.tensor([1.0, 2.0, 3.0])
# softmax归一化(概率分布)
softmax_x = F.softmax(x, dim=0)
# min-max归一化(线性映射到0~1)
min_max_x = (x - x.min()) / (x.max() - x.min())
print("softmax归一化:", softmax_x) # [0.09, 0.24, 0.67](差异被放大)
print("min-max归一化:", min_max_x) # [0.0, 0.5, 1.0](线性保留差异)
注意事项
- softmax 的“指数放大”特性:
指数运算会让大值更大、小值更小,比如输入[1,2,10],softmax 输出会接近[0,0,1],这适合分类任务(突出最可能的类别),但不适合需要保留原始数值关系的场景。
总结
- softmax 是归一化的一种:它将任意实数映射到 (0,1) 区间,且总和为 1,是专为多分类设计的概率归一化函数。
- 和普通归一化的核心区别:softmax 是非线性的(指数运算),会放大数值差异;而 min-max 等是线性的,保留原始数值关系。
- 适用场景:softmax 仅用于分类任务的输出层(将 logits 转为类别概率),不适合特征预处理;特征预处理优先用 min-max、标准化(Z-score)等。