Sigmoid / Tanh / ReLU / Softmax 4个激活函数 主要分别都解决的什么问题 以及这4个的区别

已深度思考
5 tokens
我们根据要求回答。
结论
- Sigmoid:解决输出范围限制问题,把任意实数压到 (0,1),但带来梯度消失和输出非0均值两个新问题。
- Tanh:解决Sigmoid 输出非0均值问题,输出范围 (-1,1),但没解决梯度消失。
- ReLU:解决梯度消失和计算慢问题,让深层网络真正能训练起来。
- Softmax:解决多分类输出不是概率问题,把一组实数变成总和为1的概率分布。
各自解决什么问题(重点)
| 激活函数 | 解决的问题 | 没解决/新产生的坑 |
|---|---|---|
| Sigmoid | 输出要落在 (0,1),解释成概率,便于二分类 | 梯度消失;输出均值不是0;计算有指数,稍慢 |
| Tanh | Sigmoid 输出非0均值,导致下层输入偏移,Tanh 输出 (-1,1) 均值接近0 | 梯度消失依旧;仍有指数运算 |
| ReLU | 梯度消失(负数区间梯度为0不代表消失,正数区间梯度恒为1);计算快(max操作) | 负数部分直接置0,某些神经元可能“坏死”;输出无上界 |
| Softmax | 把多个输出变成“谁的概率大”,且所有概率和为1,适合多分类 | 只能用于输出层;同样有指数溢出问题(需数值稳定) |
4 个之间的核心区别
1. 公式与输出范围
| 函数 | 公式 | 输出范围 |
|---|---|---|
| Sigmoid | 1/(1+e^(-x)) | (0,1) |
| Tanh | (e^x - e^(-x))/(e^x + e^(-x)) | (-1,1) |
| ReLU | max(0,x) | [0,+∞) |
| Softmax | e^(xi)/Σ e^(xj)(对所有输出计算) | 每个值(0,1),总和=1 |
2. 解决的问题不同
- Sigmoid 和 Softmax 都是输出层专用(二分类用 Sigmoid,多分类用 Softmax)
- Tanh 和 ReLU 是隐藏层专用(Tanh 旧时代用,ReLU 现代默认)
3. 梯度行为不同
- Sigmoid:输入很大/很小时,梯度接近0 → 梯度消失
- Tanh:同样在两端饱和,梯度接近0 → 梯度消失
- ReLU:正数区梯度恒为1 → 不消失;负数区梯度恒为0 → 神经元可能坏死
- Softmax:常用交叉熵损失时,梯度形式简洁,但它的输出“此消彼长”(一个增大,另一个减小)
4. 应用场景不同
- Sigmoid:二分类输出,或者门控机制(如 LSTM 的门)
- Tanh:RNN/LSTM 内部状态更新,或早先 MLP 隐藏层
- ReLU:CNN、MLP、Transformer 里 Feed-Forward 层的默认激活
- Softmax:多分类概率、注意力权重、多标签归一化
一句话总结区别
Sigmoid = 单开关,输出0~1
Tanh = 双开关,输出-1~1(解决了均值偏移)
ReLU = 整流器,负数直接扔(解决了梯度消失)
Softmax = 排名分配,一组数变成一组概率(总和为1)
配合代码演示对比
import torch
import torch.nn.functional as F
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0])
print("Sigmoid:", torch.sigmoid(x))
print("Tanh:", torch.tanh(x))
print("ReLU:", F.relu(x))
logits = torch.tensor([1.0, 2.0, 3.0])
print("Softmax:", F.softmax(logits, dim=0))
输出:
Sigmoid: tensor([0.0474, 0.2689, 0.5000, 0.7311, 0.9526])
Tanh: tensor([-0.9951, -0.7616, 0.0000, 0.7616, 0.9951])
ReLU: tensor([0.0000, 0.0000, 0.0000, 1.0000, 3.0000])
Softmax: tensor([0.0900, 0.2447, 0.6652])
记住这个关系图
- Sigmoid 是 Softmax 的特例(Softmax 处理两个类别时退化为 Sigmoid)
- Tanh 是 Sigmoid 的伸缩变换:
tanh(x) = 2*sigmoid(2x) - 1 - ReLU 是 max(0,x),最简单粗暴,隐藏层首选
注意点
- 千万别把 Sigmoid 用在多分类输出层(那样概率和不为1,拟合效果差)。
- 千万别把 Softmax 用在隐藏层(会导致所有输出总和为1,模型表达力受限)。
- 隐藏层默认用 ReLU,如果神经元大量死亡,可换 LeakyReLU / ELU。
