代码改变世界

Softmax 函数全面而详细的解读,原理、图像、应用 - 详解

2025-11-15 20:18  tlnshuju  阅读(0)  评论(0)    收藏  举报

1. 什么是 Softmax?—— 直观理解

想象一个场景:你训练了一个模型来识别图片中的动物,模型最终输出了三个原始分数(称为Logits),分别对应“猫”、“狗”和“兔子”,数值为 [3.0, 1.0, 0.2]

猫吗?大家需要一种方法,将这些就是这些数字本身很难解释。它们代表可能性吗?3.0 是 0.2 的 15 倍,因而肯定任意实数的分数转化为一个概率分布

概率分布需要满足两个条件:

  1. 每个概率值都在0 到 1 之间。
  2. 所有概率之和等于 1

Softmax 正是搞定这个转换的数学函数。它接收一组任意实数值的向量,并将其压缩到 (0, 1) 区间内,同时保证所有输出值的和为 1。

对于上面的例子 [3.0, 1.0, 0.2],应用 Softmax 后,我们可能会得到 [0.84, 0.11, 0.05]
这意味着:

  • 图片是猫的概率为84%
  • 图片是狗的概率为11%
  • 图片是兔子的概率为5%

这个结果就非常直观且易于理解了。


2. 原理与数学公式

公式

给定一个输入向量z= [z₁, z₂, …, zₙ],其中 zᵢ 是第 i 个类别的 Logit 值,Softmax 的计算公式为:

σ(zi)=ezi∑j=1nezjfor i=1,2,…,n \sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} \quad \text{for } i = 1, 2, \dots, nσ(zi)=j=1nezjezifor i=1,2,,n

其中:

  • $\sigma(z_i) $是第 i 个类别的输出概率。
  • ezie^{z_i}ezi是对第 i 个 Logit 取指数,确保结果为正数
  • ∑j=1nezj\sum_{j=1}^{n} e^{z_j}j=1nezj是所有类别指数值的总和,起到归一化的作用,确保所有概率之和为 1。
计算过程详解(以 [3.0, 1.0, 0.2] 为例)
  1. 计算指数(Exponentiate):对每个 Logit 计算 (e^{z_i})。

    • e3.0≈20.0855e^{3.0} ≈ 20.0855e3.020.0855
    • e1.0≈2.7183e^{1.0} ≈ 2.7183e1.02.7183
    • e0.2≈1.2214e^{0.2} ≈ 1.2214e0.21.2214
  2. 计算指数和(Sum)

    • (总和 = 20.0855 + 2.7183 + 1.2214 ≈ 24.0252)
  3. 归一化(Normalize):将每个指数值除以总和,得到概率。

    • P(猫)=20.0855/24.0252≈0.836P(猫) = 20.0855 / 24.0252 ≈ 0.836P()=20.0855/24.02520.836
    • P(狗)=2.7183/24.0252≈0.113P(狗) = 2.7183 / 24.0252 ≈ 0.113P()=2.7183/24.02520.113
    • P(兔子)=1.2214/24.0252≈0.051P(兔子) = 1.2214 / 24.0252 ≈ 0.051P(兔子)=1.2214/24.02520.051

最终得到概率分布 [0.836, 0.113, 0.051]

关键特性
  • 放大差异:指数函数会放大高分值的效应。最高分(3.0)对应的概率(0.836)远高于其他,使其在概率上占据绝对主导地位。
  • 平移不变性:如果给所有 Logits 都加上一个常数 C,Softmax 的输出结果不变。
    • 证明: ezi+C∑ezj+C=ezi⋅eC(∑ezj)⋅eC=ezi∑ezj\frac{e^{z_i + C}}{\sum e^{z_j + C}} = \frac{e^{z_i} \cdot e^C}{(\sum e^{z_j}) \cdot e^C} = \frac{e^{z_i}}{\sum e^{z_j}}ezj+Cezi+C=(ezj)eCezieC=ezjezi
    • 这个性质在数值计算中极其有用。

“Softmax”?就是3. 为什么

这个名字来源于它与 “Hardmax” (或称 Argmax) 的对比。

  • Hardmax (Argmax): 它会将最大的分量置为 1,其余全部置为 0。

    • 对于 [3.0, 1.0, 0.2],Hardmax 输出为 [1, 0, 0]
    • 这是一个“非黑即白”的选择,没有提供任何关于其他可能性的信息。
  • Softmax: 它提供了一个“软化”的版本。虽然它仍然偏向于最大值,但保留了其他类别的相对可能性信息,输出是一个平滑的概率分布。

    • 对于 [3.0, 1.0, 0.2],Softmax 输出为 [0.84, 0.11, 0.05]
    • 狗”。就是这不仅是“猫”,而且是“很有可能是猫,但有一点点可能

这种“软化”的特性在模型训练中至关重要,因为它提供了梯度。Hardmax 在绝大多数地方梯度为0,无法进行梯度下降学习,而 Softmax 处处可微,非常适合与反向传播算法结合。


4. 应用场景

Softmax 几乎是现代深度学习中多分类问题 的标配。

  1. 图像分类

    • 场景:识别图片中是猫、狗、汽车、飞机等。
    • 流程:卷积神经网络 (CNN) 提取特征 → 全连接层输出 N 个 Logits (N=类别数) → Softmax 层将 Logits 转化为 N 个类别的概率。
  2. 自然语言处理 (NLP)

    • 场景:文本分类(如情感分析、新闻主题分类)、语言模型预测下一个词。
    • 流程:循环神经网络 (RNN) 或 Transformer 处理序列 → 最后输出层产生每个可能的词(在词汇表中)的 Logit → Softmax 计算出每个词的概率,选择概率最高的词作为下一个输出。
  3. 注意力机制

    • 在 Transformer 和 ChatGPT 等模型中,注意力权重的计算本质上就是一个 Softmax 运行。它接收一组“得分”(Query 和 Key 的相似度),然后通过 Softmax 将其归一化为加和为 1 的权重,表示在生成当前词时应该“注意”输入序列中各个部分的程度。

5. 关键细节与常见问题

1. 数值稳定性

直接计算 (e^{z_i}) 可能会导致数值溢出(如果 (z_i) 很大)。为了解决这个问题,在实践中我们使用一个数值稳定的版本

σ(zi)=ezi−max(z)∑j=1nezj−max(z) \sigma(z_i) = \frac{e^{z_i - \text{max}(z)}}{\sum_{j=1}^{n} e^{z_j - \text{max}(z)}}σ(zi)=j=1nezjmax(z)ezimax(z)

通过减去向量中的最大值(记为 max(z)),指数函数的参数最大为 0,从而避免了上溢,并且根据平移不变性,计算结果与原始公式完全相同。

2. 与交叉熵损失函数的搭配

在训练分类模型时,Softmax 通常与交叉熵损失 配对使用。

  • Softmax:将模型的原始输出转换为概率。
  • 交叉熵损失:衡量模型预测的概率分布与真实的概率分布(通常是 one-hot 编码,如 [1, 0, 0])之间的“距离”。

这是一个“黄金组合”,因为当 Softmax 作为输出层,交叉熵作为损失函数时,计算梯度会变得异常简单和高效,这大大加速了模型的训练过程。

3. Softmax 不是激活函数

虽然常被放在最后一层,但 Softmax 的性质与 Sigmoid、ReLU 等激活函数不同。Sigmoid/ReLU 是按元素操作的,输出的每个元素独立于其他元素。而 Softmax 是跨元素操作的,它的每个输出值都依赖于所有输入值(因为要计算总和)。因此,它更多地被看作一个归一化层


总结

方面描述
核心功能将一组任意实数值的向量归一化 为一个概率分布
数学本质对每个元素取指数,然后用指数和进行归一化。
输入任意实数的向量(Logits)。
输出(0, 1) 区间内的向量,且所有元素之和为 1。
关键特性放大高分值差异、平移不变性、处处可微。
主要应用多分类模型的输出层、注意力机制中的权重计算。
黄金搭档交叉熵损失函数。