激活函数(Activation Function)是神经网络中的核心组件,为模型引入非线性变换能力。没有激活函数的深度学习模型会退化为线性变换的堆叠,表达能力极其有限。本文将系统梳理主流激活函数的数学原理、特性对比、适用场景,并通过具体数值例子直观展示每种激活函数的行为。
考虑一个没有激活函数的两层网络:
无论堆叠多少层,最终输出等价于单层线性变换 。这意味着:
引入激活函数 后:
多层的非线性变换可以逼近任意复杂函数(通用逼近定理,Universal Approximation Theorem)。直观上,激活函数允许网络将输入空间分割为复杂的决策区域。
输出范围:,导数:
| 输入 | 输出 | 梯度 | |
|---|---|---|---|
| -5.0 | 148.41 | 0.0067 | 0.0067 |
| -2.0 | 7.39 | 0.119 | 0.105 |
| 0.0 | 1.0 | 0.5 | 0.25 |
| 2.0 | 0.135 | 0.881 | 0.105 |
| 5.0 | 0.0067 | 0.993 | 0.0067 |
| 优势 | 劣势 |
|---|---|
| 输出在 ,天然适合概率表示 | 饱和区梯度消失( 时梯度接近零) |
| 平滑可微,便于梯度计算 | 输出非零中心(导致梯度更新方向单一) |
| 历史经典,理论分析成熟 | 指数运算计算开销大 |
| 非常适合二分类输出层 | 深层网络中严重减缓收敛速度 |
输出范围:,导数:
| 输入 | 输出 | 梯度 |
|---|---|---|
| -3.0 | -0.995 | 0.0099 |
| -1.0 | -0.762 | 0.420 |
| 0.0 | 0.0 | 1.0 |
| 1.0 | 0.762 | 0.420 |
| 3.0 | 0.995 | 0.0099 |
Tanh 的输出以零为中心(zero-centered),这使得反向传播时的梯度更新方向更合理。具体来说:
| 优势 | 劣势 |
|---|---|
| 零中心输出,优化效率高 | 仍有梯度消失问题( 时梯度接近零) |
| 梯度幅度可达到 1.0(优于 Sigmoid 的 0.25) | 指数运算计算开销大 |
| 理论成熟,使用广泛 | 比 ReLU 收敛慢 |
定义:
导数:
数值示例:
| 输入 | -3 | -1 | -0.01 | 0 | 0.01 | 1 | 3 |
|---|---|---|---|---|---|---|---|
| 输出 | 0 | 0 | 0 | 0 | 0.01 | 1 | 3 |
| 梯度 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
优缺点:
| 优势 | 劣势 |
|---|---|
| 计算极快(只需 max 操作) | 神经元死亡(Dying ReLU):一旦权重使 ,梯度为零,神经元永远不再激活 |
| 正区间梯度恒为 1,缓解梯度消失 | 输出非零中心 |
| 经验上收敛速度是 Tanh 的约 6 倍 | 对学习率敏感,过大学习率易导致神经元死亡 |
| 稀疏激活,正则化效果 | 不可微在 处(实践中不影响) |
为什么 ReLU 有效? 当输入为正值时,梯度为 1,解决了 Sigmoid/Tanh 在深层网络中梯度消失的根本问题。这使得训练 10+ 层的深度网络成为可能。
定义:
其中 是一个小的正常数(通常取 0.01)。
数值示例():
| 输入 | -3 | -1 | -0.1 | 0 | 1 | 3 |
|---|---|---|---|---|---|---|
| 输出 | -0.03 | -0.01 | -0.001 | 0 | 1 | 3 |
| 梯度 | 0.01 | 0.01 | 0.01 | 0.01 | 1 | 1 |
与 ReLU 的区别: Leaky ReLU 在负半轴保留了小的负梯度,避免了"神经元死亡"问题。在 处也做次梯度处理,通常定义为微分为 1。
PReLU 将 变为可学习参数:
通过反向传播进行优化,每个通道可独立学习不同的 值。在 ImageNet 分类任务中,PReLU 比 ReLU 提升了约 1.2% 的 Top-5 准确率。
定义:
数值示例():
| 输入 | -3 | -1 | -0.1 | 0 | 1 | 3 |
|---|---|---|---|---|---|---|
| 输出 | -0.95 | -0.632 | -0.095 | 0 | 1 | 3 |
特性: 负区间平滑趋近于 ,使得输出均值接近零,且梯度不会完全消失。但指数运算增加了计算开销。
| 特性 | ReLU | Leaky ReLU | PReLU | ELU |
|---|---|---|---|---|
| 负半轴梯度 | 0 | (固定) | (可学习) | |
| 零中心输出 | ❌ | ❌ | ❌ | ✅(接近) |
| 计算复杂度 | 最低 | 低 | 低 | 中等(含指数) |
| 神经元死亡 | ⚠️ 可能 | ✅ 避免 | ✅ 避免 | ✅ 避免 |
| 可微性 | 次梯度 | 次梯度 | 可微 | 可微 |
| ImageNet 准确率(相对 ReLU) | 基准 | +0.5% | +1.2% | +0.8% |
定义:
其中 是 Sigmoid 函数, 为可学习参数(默认 )。当 时也称为 SiLU(Sigmoid Linear Unit)。
数值示例():
| 输入 | -3 | -1 | 0 | 1 | 3 | 5 |
|---|---|---|---|---|---|---|
| 0.047 | 0.269 | 0.5 | 0.731 | 0.953 | 0.993 | |
| Swish 输出 | -0.142 | -0.269 | 0 | 0.731 | 2.86 | 4.97 |
关键特性: Swish 在负区间有一个"非单调"凹槽(约 处取最小值 ),这个特性被证明能增强网络的表达能力。Google Brain 的实验表明,Swish 在深层网络(如 40+ 层)上优于 ReLU。
定义:
其中 是标准正态分布的累积分布函数(CDF)。实际计算常用近似:
数值示例:
| 输入 | -3 | -2 | -1 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|---|---|---|
| 0.001 | 0.023 | 0.159 | 0.5 | 0.841 | 0.977 | 0.999 | |
| GELU 输出 | -0.004 | -0.045 | -0.159 | 0 | 0.841 | 1.955 | 2.999 |
| 特性 | Swish | GELU |
|---|---|---|
| 提出时间 | 2017 (Google Brain) | 2016 (Hendrycks & Gimpel) |
| 函数形式 | ||
| 负区间最小值 | 在 | 在 |
| 计算复杂度 | 中(含指数) | 中(含 tanh 近似) |
| 知名应用 | EfficientNet, MobileNetV3 | BERT, GPT-3, ViT |
| 在 Transformer 中的表现 | 良好 | 最佳(BERT/GPT 默认) |
GELU 结合了 ReLU 的线性正区间与一种概率化的"门控"行为。它根据输入值相对于零的正态分布概率来决定激活强度,这种平滑的非线性行为:
BERT、GPT-2/3/4、LLaMA、T5 等主流 Transformer 模型均使用 GELU(或近似变体)作为前馈网络的激活函数。
考虑一个三分类任务,网络输出 logits 为 :
| 类别 | Logit | Softmax 概率 | |
|---|---|---|---|
| 猫 | 2.0 | 7.389 | 0.732 |
| 狗 | 0.5 | 1.649 | 0.163 |
| 鸟 | -1.0 | 0.368 | 0.036 |
| 总和 | — | 10.095 | 1.0 |
关键特性: Softmax 将任意实数向量转换为概率分布(所有输出为正且和为 1)。指数运算放大了 logits 差异,使得最高分类的概率更加突出。
实际应用中常引入温度 :
| 温度 | 猫的概率 | 狗的概率 | 鸟的概率 | 效果 |
|---|---|---|---|---|
| 0.5 | 0.936 | 0.058 | 0.006 | 更"尖锐"(hard) |
| 1.0 | 0.732 | 0.163 | 0.036 | 默认 |
| 5.0 | 0.397 | 0.312 | 0.291 | 更"平滑"(soft) |
调整温度的效果: 低温 使分布更尖锐,适合需要明确决策的场景;高温 使分布更均匀,常用于知识蒸馏和文本生成中的采样。
| 网络类型 | 推荐激活函数 | 原因 |
|---|---|---|
| 全连接网络(浅层) | ReLU / Leaky ReLU | 简单高效,收敛快 |
| 深层 CNN | ReLU / Swish | 避免梯度消失,SE 模块使用 Swish |
| Transformer | GELU | BERT/GPT 系列验证,梯度稳定 |
| RNN / LSTM | Tanh + Sigmoid | Tanh 零中心适合循环,Sigmoid 用于门控 |
| GAN | Leaky ReLU | 避免鉴别器神经元死亡 |
| 二分类输出 | Sigmoid | 输出范围 天然概率 |
| 多分类输出 | Softmax | 输出归一化概率分布 |
| 回归输出 | 线性(无激活)或恒等映射 | 输出任意实数 |
初始化阶段:
训练中期:
后期调优:
| 激活函数 | 最大梯度 | 梯度消失风险 | 适用深度 |
|---|---|---|---|
| Sigmoid | 0.25 | 极高 | ≤5 层 |
| Tanh | 1.0 | 高 | ≤10 层 |
| ReLU | 1.0(正区间) | 低 | 数十至数百层 |
| Swish | ~1.1 | 低 | 数百层 |
| GELU | ~1.0 | 低 | 数百层至上千层 |
Dying ReLU 现象:当输入 时,ReLU 输出为 0 且梯度为 0,该神经元参数停止更新,永远输出 0。
缓解方法:
Sigmoid 和 ReLU 的输出均非零中心:
缓解方案: 配合 Batch Normalization 使用,将每层输出归一化为零中心分布。
对于大多数深度学习任务,推荐的默认选择:
全连接 / CNN → ReLU(简单高效)
Transformer → GELU(业界标准)
输出层 → 根据任务(Sigmoid / Softmax / 线性)
问题:损失下降缓慢 → 检查是否存在梯度消失(可用梯度直方图)
问题:损失震荡不收敛 → 检查学习率是否过大,切换为 Leaky ReLU
问题:大量神经元输出恒定 → 检查 Dying ReLU,切换为 Swish
问题:NaN 损失 → 检查是否梯度爆炸,考虑梯度裁剪