一句话定义
Softmax 是一个把任意一组实数(可正可负、大小随意)压缩成一组非负数、且总和恰好等于 1 的函数——也就是一个概率分布。
它到底做了什么
假设模型对三个类别打出原始分数(logits):猫 3.2、狗 1.1、鸟 −0.7。这三个数本身没法直接解读:3.2 不是 3.2 倍,−0.7 更不可能是负数概率。Softmax 分两步把它们收拾干净:
1. 取指数:e^3.2 ≈ 24.5,e^1.1 ≈ 3.0,e^−0.7 ≈ 0.50。指数把负数变成正数,还把差距指数级放大:原本差 2.1 分,现在差了 8 倍。
2. 归一化:各自除以三者之和 28.0,得到约 0.876、0.107、0.018,加起来正好是 1。
公式写成:softmax(x_i) = e^(x_i) / Σ e^(x_j)。
打个比方:几个候选人拿到一叠原始票数,有人甚至是欠票(负数)。你要报出一份"支持率"。直接除以总和会被负数搞崩;Softmax 相当于先按指数重新折算每个人的票,再按比例分蛋糕——领先者被放大,落后者被压扁,但谁都不会掉到 0 或负数。
为什么非得取指数
- 保证非负:e 的任何次方都是正的;
- 放大差距:分数高的类别拿走更大份额,体现模型的"决心";
- 光滑可导:才能用梯度下降训练。
工程实现上会先减去最大值再算:e^(x_i − max) / Σ e^(x_j − max)。数学结果完全一样,但避免了指数的数值溢出,这是各家深度学习框架的标准做法。
和相邻概念的区别
| 概念 | 输出特点 | 典型用途 |
|---|---|---|
| Softmax | 多项互斥,和恒为 1 | 多分类、语言模型预测下一个词 |
| Sigmoid | 每个维度独立的 0~1,不要求和为 1 | 二分类、多标签 |
| Argmax | 只返回最大值的下标 | 推理时取出最终答案 |
| 简单归一化 | 除以总和,遇负数失效 | 一般不用于分类 |
核心差别在于任务假设:Sigmoid 处理的是"每个标签各自是否成立",可以同时说这张图既像猫又像动物;Softmax 处理的是"从一堆选项中挑一个",选项之间互相竞争。Argmax 则是 Softmax 之后的最后一步剪枝——丢掉概率只留答案,因此不可导,只能用于推理。
温度:一个顺手能拧的旋钮
实践中常见 softmax(x / T),T 叫温度(temperature)。T = 1 是原样;T 调大,分布被抹平,趋近均匀;T 调小,分布变尖锐,几乎退化成 argmax。大模型生成文本时调节的"创造力",拧的就是这个旋钮,具体取值范围以各服务商的官方页面为准。
对从业者的意义
Softmax 通常是分类网络的最后一层,把模型的"内部黑话"翻译成人类能读的概率。它也决定了交叉熵损失的形式,所以框架里往往直接提供 log_softmax 这类合并实现,数值上更稳。反过来,部署时如果你只关心最终预测结果,可以省掉 Softmax 直接比较 logits 取最大值——结果一致,还省一次计算。
