09aaab-Softmax是什么?
这篇文章会把 Softmax 函数彻底讲清楚。从最直观的类比,到严谨的数学定义,再到手算验证、核心性质、数值稳定性问题,最后还会附上 NumPy 和 PyTorch 的代码实现。如果你对 Transformer 里的注意力机制也感兴趣,那 Softmax 在其中扮演的关键角色这里也一并涵盖了。

阅读路线图如下:先从直观类比入手理解 Softmax 是什么,然后掌握核心公式并拆解每个部分的作用。接着用手算例子验证公式,再深入了解三大性质,最后攻克数值稳定性问题并看代码实战。
1. 什么是 Softmax?
1.1 直观类比:投票计数器
想象一下班级评选“最受欢迎的同学”。每个同学都可以给其他人打分——分数任意,正数代表喜欢,负数代表讨厌。但最终我们需要的是每个人的“得票百分比”,加起来正好 100%。
Softmax 函数干的活就和这个“投票计数器”差不多:输入是任意实数(同学们的“支持度打分”),输出则是 [0,1] 之间的概率值并且总和为 1(最终的“得票百分比”)。关键的区别在于,Softmax 不是简单按比例缩放,它通过指数函数 放大了输入之间的差异,让得分高的获得更高权重,得分低的则被进一步压制。
1.2 基本定义
Softmax 函数,也叫 softargmax 或归一化指数函数,其作用是把任意实数向量转化为概率分布。给定一个 K 维实数向量 ,它对每个元素 的输出为:
其中 是自然对数的底。输出自然满足两个条件,确保它成为一个合法的概率分布:每个值都在 (0,1) 之间,且所有值之和恰好为 1。
2. 核心公式
Softmax 的计算其实就分两步。第一步是“指数化”:对每个输入 计算 。第二步是“归一化”:将每个指数值除以所有指数值的总和。
#### 2.1 为什么要用指数函数 ? 指数函数在这里扮演了三个关键角色。首先,它把任意实数映射为正数—— 对任何实数 x 都成立,这保证了输出为正。其次,它放大了差异——指数函数的增长速度极快, 而 ,即使输入只差 2,输出已经差了将近 7 倍——这让高分者能脱颖而出。最后,它保持了单调性: 严格递增,输入的顺序被忠实地保留下来。2.2 为什么分母要用求和?
分母 的作用就是归一化。把所有指数值加起来作为“总基数”,每个指数值除以这个总基数,结果就是每个输出变成了相对占比,范围在 0 到 1 之间,而且所有输出加起来恰好等于 1——一个标准的概率分布。
3. 手算示例
光说不练假把式。假设输入向量 ,咱们一步步来算。
第一步,计算指数值:,,。
第二步,计算分母:。
第三步,计算每个 Softmax 值:,,。验算一下,总和 ,完美。
注意到输入最高的 2.0 获得了 65.9% 的权重,而最低的 0.1 只拿到了 9.9%。输入之间的原始差距是 1.9,而输出权重的差距被放大到了 0.56。这就是指数函数在起作用。
4. 核心性质
4.1 保序性(Order Preservation)
这个性质很好理解:如果 ,那么 。简单说,打分最高的同学,最终得票率也是最高的。Softmax 不会“碘伏”排名。数学上这是因为指数函数严格单调递增,而且除以同一个正分母不会改变大小关系。
4.2 平移不变性(Translation Invariance)
这个性质非常有用:如果对输入向量的所有元素同时加上同一个常数 c,Softmax 的输出不变。证明也很直接,分子分母同时提取出一个 约掉就行了。直观理解就是,假设所有同学的分数都加了 10 分,大家加的一样多,最终得票百分比不变。这个性质是后面数值稳定性技巧的理论基础——我们可以安全地减去最大值来防止溢出,而不改变结果。
