深度学习激活函数全解析
·
| 激活函数 | 公式 | 导数 | 优点 | 缺点 | 是否缓解梯度消失 | 典型应用场景 |
|---|---|---|---|---|---|---|
| Sigmoid | 输出在 (0,1),适合概率 | 易梯度消失、非零均值 | ❌ | 二分类输出层 | ||
| Tanh |
| 输出零均值,收敛更快 | 仍易梯度消失 | ⚠️ 较差 | RNN 中间层(旧模型) | |
| ReLU | | 计算快、有效缓解梯度消失 | 负区“神经元死亡” | ✅✅ | CNN、MLP 等主流网络 | |
| Leaky ReLU | 避免神经元死亡 | 效果提升有限 | ✅✅✅ | 替代 ReLU 的通用选择 | ||
| ELU | 输出接近零均值,训练稳定 | 计算稍慢 | ✅✅✅ | 深层网络、自动编码器 | ||
| GELU |
近似(计算高效) | 平滑非线性,性能优异 | 计算开销略高 | ✅✅✅✅ | Transformer、BERT、GPT 系列 | |
| Swish | 无解析式,需自动微分 | 实验中表现优于 ReLU | 不是处处可导(理论上) | ✅✅✅ | Google 内部模型、NAS 发现 | |
| Softmax | 用于多类概率输出 | 输出为概率分布 | 仅用于输出层 | ❌ | 多分类任务输出层 |
详细解析与比较
1. Sigmoid
- ✅ 优点:输出范围 (0,1),天然解释为“概率”
- ❌ 缺点:
- 最大导数仅 0.25 → 多层后梯度迅速衰减
- 输出非零均值 → 导致后续层输入偏移(影响收敛)
- 🚫 不推荐用于隐藏层!
✔️ 只适用于二分类输出层
2. Tanh
- ✅ 优于 Sigmoid 的地方:输出关于 0 对称(零均值),加快收敛
- ❌ 仍然存在梯度消失问题(两端导数趋近 0)
- 📉 在现代深度学习中已被淘汰
✔️ 曾用于 RNN/LSTM,现在也逐渐被替代
3. ReLU(Rectified Linear Unit)
- ✅ 最经典的激活函数,几乎成为默认选择
- 优势:
- 正区导数恒为 1 → 不压缩梯度 → 有效缓解梯度消失
- 计算极其简单(
max(0,x))
- ❌ 缺陷:当 x<0x<0 时梯度为 0 → “Dead ReLU Problem”
✔️ 广泛应用于 CNN、MLP、ResNet 等模型的隐藏层
4. Leaky ReLU
- 改进版 ReLU,在负区引入小斜率 αα(通常 0.01)
- 避免神经元永久“死亡”
- 尤其适合输入可能长期为负的任务
✔️ 推荐作为 ReLU 的替代品,尤其在自编码器或GAN中
5. ELU(Exponential Linear Unit)
- 更进一步:负区指数衰减,输出更接近零均值
- 优势:
- 减少内部协变量偏移(类似 BatchNorm 效果)
- 训练更稳定,准确率更高
- 缺点:计算成本略高
✔️ 适合深层网络、对精度要求高的任务
6. GELU(Gaussian Error Linear Unit)
- 当前 Transformer 类模型的标准激活函数
- 结合了 ReLU 和 Dropout 的思想,基于高斯累积分布函数
- 在 BERT、GPT、T5 等模型中广泛使用
✅ 推荐用于所有 Transformer 架构中的 FFN 层
7. Swish
- 由 Google 提出,形式为 x⋅σ(x)x⋅σ(x)
- 实验表明在某些任务上优于 ReLU
- 是通过神经架构搜索(NAS)发现的
✅ 可尝试用于新模型设计,但不如 GELU 普及
8. Softmax
- ❗ 注意:这不是隐藏层激活函数!
- 作用:将任意实数向量转换为概率分布
- 必须用在多分类任务的输出层
✅ 输出层专用,不可用于中间层
📊 激活函数选择决策树
你的任务是什么?
├── 是输出层?
│ ├── 二分类? → Sigmoid
│ └── 多分类? → Softmax
└── 是隐藏层?
├── 使用 Transformer 架构? → GELU
├── 需要高性能且资源充足? → ELU / Swish
├── 担心神经元死亡? → Leaky ReLU / ELU
└── 默认选择? → ReLU
🎯 总结:各场景下的推荐选择
| 场景 | 推荐激活函数 | 原因 |
|---|---|---|
| CNN / MLP 隐藏层 | ReLU 或 Leaky ReLU | 简单高效,缓解梯度消失 |
| RNN / LSTM(旧) | Tanh(历史原因) | 输出零均值 |
| Transformer FFN 层 | GELU | BERT/GPT 标准配置 |
| 自编码器 / GAN | ELU 或 Leaky ReLU | 避免死神经元,训练更稳 |
| 轻量化模型(移动端) | Hardswish(ReLU 变体) | 近似 Swish,适合部署 |
| 二分类输出 | Sigmoid | 输出解释为概率 |
| 多分类输出 | Softmax | 归一化概率分布 |
🖼️ 可视化建议(Python代码片段)
你可以运行以下代码查看各种激活函数及其导数曲线:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 100)
# 定义函数
sigmoid = 1 / (1 + np.exp(-x))
tanh = np.tanh(x)
relu = np.maximum(0, x)
leaky_relu = np.where(x > 0, x, 0.01 * x)
gelu = 0.5 * x * (1 + np.tanh(np.sqrt(2/np.pi) * (x + 0.044715*x**3)))
# 绘图
plt.figure(figsize=(12, 6))
plt.plot(x, sigmoid, label='Sigmoid')
plt.plot(x, tanh, label='Tanh')
plt.plot(x, relu, label='ReLU')
plt.plot(x, leaky_relu, label='Leaky ReLU')
plt.plot(x, gelu, label='GELU')
plt.axhline(y=0, color='k', linewidth=0.5)
plt.axvline(x=0, color='k', linewidth=0.5)
plt.grid(True)
plt.legend()
plt.title("常见激活函数对比")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.show()
更多推荐



所有评论(0)