Softmax函数:Sigmoid函数从二分类到多分类的推广
文章目录
1. Sigmoid与Softmax的关系
Softmax
函数可以看作是二分类函数Sigmoid
在多分类问题上的推广。当处理二分类问题时,两者在数学表达上是等价的。
Sigmoid函数表达式:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1
Softmax函数表达式(K分类场景):
Softmax ( z i ) = e z i ∑ j = 1 K e z j \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} Softmax(zi)=∑j=1Kezjezi
2. 二分类场景下的等价性
当K=2时,Softmax
可以简化为Sigmoid
形式:
Softmax ( z 1 ) = e z 1 e z 1 + e z 2 = 1 1 + e − ( z 1 − z 2 ) \text{Softmax}(z_1) = \frac{e^{z_1}}{e^{z_1}+e^{z_2}} = \frac{1}{1+e^{-(z_1-z_2)}} Softmax(z1)=ez1+ez2ez1=1+e−(z1−z2)1
此时相当于对特征差值 z 1 − z 2 z_1-z_2 z1−z2应用Sigmoid
函数。
3. 核心差异对比
特性 | Sigmoid | Softmax |
---|---|---|
输出范围 | (0,1) | (0,1)且概率和为1 |
适用场景 | 二分类/多标签分类 | 互斥多分类 |
梯度特性 | 存在梯度消失风险 | 更稳定的梯度传播 |
输出独立性 | 各节点独立计算 | 输出值相互依赖 |
4. 多分类实现示例(Python)
import torch.nn as nn
# 定义三层神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10) # 输出层节点数=类别数
)
def forward(self, x):
return self.fc(x)
# 使用交叉熵损失函数(内置Softmax)
criterion = nn.CrossEntropyLoss()
5. 应用场景选择建议
✅ 使用Softmax
:手写数字识别(MNIST)、图像分类等互斥类别场景
✅ 使用Sigmoid
:多标签分类
⚠️ 二分类时优先使用Sigmoid
(计算更简单),但Softmax
同样有效