激活函数公式导数优点缺点是否缓解梯度消失典型应用场景
Sigmoidf(x) = \frac{1}{1 + e^{-x}}f'(x) = f(x) (1 - f(x))
 
输出在 (0,1),适合概率易梯度消失、非零均值二分类输出层
Tanhf(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

f'(x) = 1 - \tanh^2(x)

输出零均值,收敛更快仍易梯度消失⚠️ 较差RNN 中间层(旧模型)
ReLUf(x) = \max(0, x)f(x) = \begin{cases} x & x > 0 \\ 0 & x \leq 0 \end{cases}计算快、有效缓解梯度消失负区“神经元死亡”✅✅CNN、MLP 等主流网络
Leaky ReLUf(x) = \max(\alpha x, x), \quad \alpha = 0.01f(x) = \begin{cases} x & x > 0 \\ \alpha x & x \leq 0 \end{cases}避免神经元死亡效果提升有限✅✅✅替代 ReLU 的通用选择
ELUf(x) = \begin{cases} x & x > 0 \\ \alpha (e^x - 1) & x \leq 0 \end{cases}, \quad \alpha > 0f'(x) = \begin{cases} 1 & x > 0 \\ f(x) + \alpha & x < 0 \\ \text{undefined} & x = 0 \end{cases}输出接近零均值,训练稳定计算稍慢✅✅✅深层网络、自动编码器
GELU

近似(计算高效)

f(x) \approx \frac{1}{2} x \left( 1 + \tanh\left( \sqrt{\frac{2}{\pi}} (x + 0.044715 x^3) \right) \right)

f'(x) = \Phi(x) + x \cdot \phi(x)平滑非线性,性能优异计算开销略高✅✅✅✅Transformer、BERT、GPT 系列
Swishf(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}}无解析式,需自动微分实验中表现优于 ReLU不是处处可导(理论上)✅✅✅Google 内部模型、NAS 发现
Softmaxf(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}, \quad i = 1,2,\ldots,n用于多类概率输出输出为概率分布仅用于输出层多分类任务输出层

详细解析与比较

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 层GELUBERT/GPT 标准配置
自编码器 / GANELU 或 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()

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐