Softmax与Sigmoid函数详解

引言

在机器学习和深度学习中,SoftmaxSigmoid是两个最常用的激活函数,尤其常见于分类任务的输出层设计。尽管它们都能将实数映射到概率空间,但其数学特性、应用场景和底层逻辑存在显著差异。本文将从数学推导、梯度行为、应用场景和代码实现四个维度对二者进行全面对比分析。


一、Sigmoid函数

1.1 数学定义

Sigmoid函数定义为:
σ(z)=11+e−z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
它将任意实数zzz映射到(0,1)(0,1)(0,1)区间,输出可解释为概率值。
Sigmoid

1.2 导数特性

Sigmoid的导数具有以下关键性质:
dσdz=σ(z)(1−σ(z)) \frac{d\sigma}{dz} = \sigma(z)(1 - \sigma(z)) dzdσ=σ(z)(1σ(z))
导数在z=0z=0z=0时达到最大值0.25,随着∣z∣|z|z增大快速趋近于0,导致梯度消失问题。

Sigmoid

1.3 应用场景

  • 二分类问题:输出层单个节点表示正类概率
  • 门控机制:如LSTM中的遗忘门、输入门
  • 概率校准:将回归输出转化为概率

二、Softmax函数

2.1 数学定义

对于KKK类分类问题,Softmax函数定义为:
Softmax(zi)=ezi∑j=1Kezj(i=1,...,K) \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} \quad (i=1,...,K) Softmax(zi)=j=1Kezjezi(i=1,...,K)
它确保所有输出值的和为1,构成完整的概率分布。

2.2 导数与雅可比矩阵

Softmax的梯度计算涉及雅可比矩阵:
∂Si∂zj={Si(1−Sj)i=j−SiSji≠j \frac{\partial S_i}{\partial z_j} = \begin{cases} S_i(1 - S_j) & i = j \\ -S_i S_j & i \neq j \end{cases} zjSi={Si(1Sj)SiSji=ji=j
该特性使得梯度计算与所有节点的输出相关。

2.3 应用场景

  • 多分类任务:输出层生成互斥类别概率
  • 注意力机制:如Transformer中的注意力权重计算
  • 概率归一化:多任务学习的输出标准化

三、关键差异对比

特性 Sigmoid Softmax
输出空间 独立概率 (0,1) 归一化概率分布 (∑=1)
互斥性 支持多标签分类 单标签分类
梯度依赖 仅与当前节点相关 与所有节点相关
计算复杂度 O(1) O(K)
典型应用 二分类/多标签 多分类

四、数值稳定性实践

4.1 Softmax的溢出问题

原始实现可能因ezie^{z_i}ezi过大导致数值溢出。改进方案:
Softmax(zi)=ezi−max(z)∑ezj−max(z) \text{Softmax}(z_i) = \frac{e^{z_i - \text{max}(z)}}{\sum e^{z_j - \text{max}(z)}} Softmax(zi)=ezjmax(z)ezimax(z)

4.2 Sigmoid的边界情况

极端输入时可能出现梯度消失:

def sigmoid(z):
    return np.where(z >= 0, 1/(1 + np.exp(-z)), np.exp(z)/(1 + np.exp(z)))

五、PyTorch实现对比

5.1 Sigmoid层

Sigmoid
Sigmoid

import torch.nn as nn

model = nn.Sequential(
    nn.Linear(128, 1),
    nn.Sigmoid()  # 二分类输出
)
loss_fn = nn.BCELoss()

5.2 Softmax层

Softmax

model = nn.Sequential(
    nn.Linear(128, 10),
    nn.Softmax(dim=1)  # 10类分类
)
# PyTorch CrossEntropyLoss已包含Softmax
loss_fn = nn.CrossEntropyLoss() 

六、常见问题解答

Q1: 二分类能否用Softmax?
可以,但等效于同时使用两个Sigmoid节点。此时Softmax输出[p,1−p][p, 1-p][p,1p],与单Sigmoid输出ppp数学等价,但计算效率更低。

Q2: 多标签分类如何处理?
应使用多个Sigmoid节点(每个类别独立判断),而非Softmax。例如图像中同时包含"猫"和"狗"的场景。

Q3: 为什么推荐CrossEntropyLoss而非手动实现?
框架级实现融合了LogSoftmax与NLL Loss,兼具数值稳定性和计算效率。


七、总结与选择建议

  • 明确问题类型:单标签 → Sigmoid ;多标签 → Softmax
  • 关注计算效率:类别数超过1000时,Softmax计算成本显著增加
  • 梯度动态:Sigmoid需注意梯度消失,适当使用Xavier初始化
  • 概率解释:需要严格概率分布时优先Softmax

总的来说,Softmax 和 Sigmoid 函数都是神经网络中使用的激活函数。它们之间的主要区别在于 Softmax 函数适用于多类分类问题,而 Sigmoid 函数更适合二分类问题。

Softmax 函数用于预测模型中的多类目标变量,当其输出值总和为 1 时,可以将其解释为这些类的概率。它将输入压缩在 0 和 1 之间,因此它的行为类似于范围从 0 到 1 而不是 -1 到 +1 的广义逻辑激活函数,因此它比 sigmoid 更适合多类分类,sigmoid 每个输入向量只返回一个数字,每个示例只提供一个类预测。

另一方面,Sigmoid 函数最适合二元分类问题,因为它的输出范围从 0 到 1,代表这两个结果(0 或 1)。这种类型的模型也称为逻辑回归,可以通过使用权重 w 进行线性组合过程,根据输入 x 值估计任意概率。这个概率将决定应该应用哪个类标签:如果 p(x) > 阈值,则我们应用 A 类,否则应用 B 类。

当比较 softmax 或 sigmoid 函数带来的性能提升时,并没有一个严格的结果,而是取决于几个因素,例如数据集的大小/复杂性/特征等。但是,如果正确实施,一般来说,这两个模型应该提供相似的性能,这也取决于计算成本等因素(Softmax 在标准化之前可能由于值较高而存在一些数值稳定性问题)。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐