激活函数 (Activation Functions)
📌 核心定义 (What)
Section titled “📌 核心定义 (What)”一句话定义:激活函数是神经网络中引入非线性的数学函数,它决定了神经元是否应该被”激活”(输出信号)。
没有激活函数,无论神经网络有多少层,最终都等价于一个线性变换(因为线性函数的组合还是线性的)。激活函数让网络能够学习复杂的非线性关系。
🎨 交互演示:激活函数对比 (Interactive)
Section titled “🎨 交互演示:激活函数对比 (Interactive)”点击按钮切换显示不同的激活函数,直观对比它们的形状差异。
⚡ 激活函数对比
ReLUmax(0, x)
Sigmoid1 / (1 + e⁻ˣ)
GELUx · Φ(x)
💡 点击按钮切换显示不同的激活函数,观察它们的形状差异
🏠 生活类比 (Analogy)
Section titled “🏠 生活类比 (Analogy)”🚦 “交通信号灯”
Section titled “🚦 “交通信号灯””- 线性函数:像一条直线公路,车子只能匀速前进,无法转弯。
- 激活函数:像交通信号灯,决定车子能不能通过、以什么速度通过。
- ReLU:绿灯全速通过,红灯完全停止(负数直接变 0)。
- Sigmoid:根据信号强度,平滑地从 0 加速到 1。
- GELU:更智能的信号灯,会根据”概率”决定通行速度。
📊 常见激活函数 (Math)
Section titled “📊 常见激活函数 (Math)”1. ReLU (Rectified Linear Unit)
Section titled “1. ReLU (Rectified Linear Unit)”最常用的激活函数,简单高效。
ReLU 公式
- : 输出 (线性通过)
- : 输出 (完全抑制)
- 优点: 计算快、缓解梯度消失
- 缺点: “死亡 ReLU”问题(神经元永久失活)
2. Sigmoid
Section titled “2. Sigmoid”将输出压缩到 (0, 1) 区间,常用于二分类输出层。
Sigmoid 公式
- 输出范围: ,可解释为概率
- 优点: 平滑可导,输出有界
- 缺点: 梯度消失、输出非零中心
3. Tanh (Hyperbolic Tangent)
Section titled “3. Tanh (Hyperbolic Tangent)”Sigmoid 的改进版,输出零中心。
Tanh 公式
- 输出范围: ,零中心
- 优点: 比 Sigmoid 收敛更快
- 缺点: 仍有梯度消失问题
4. GELU (Gaussian Error Linear Unit)
Section titled “4. GELU (Gaussian Error Linear Unit)”现代 Transformer (BERT, GPT) 的标准选择。
GELU 公式
- : 标准正态分布的累积分布函数
- 核心思想: 根据输入的”概率重要性”加权输出
- 优点: 平滑、非单调、NLP 任务 SOTA
- 论文: Hendrycks & Gimpel, 2016 (arXiv:1606.08415)
5. SiLU / Swish
Section titled “5. SiLU / Swish”Google Brain 提出,自门控机制。
SiLU/Swish 公式
- 特点: 非单调、自门控( 乘以自己的 Sigmoid)
- 优点: 深层网络表现优于 ReLU
- 应用: EfficientNet, Llama 2/3
📈 对比总结
Section titled “📈 对比总结”| 函数 | 公式 | 范围 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|---|
| ReLU | 计算快 | 死亡神经元 | CNN, 通用 | ||
| Sigmoid | 概率输出 | 梯度消失 | 二分类输出 | ||
| Tanh | 零中心 | 梯度消失 | RNN 隐藏层 | ||
| GELU | 平滑、SOTA | 计算稍慢 | Transformer | ||
| SiLU | 自门控 | 计算稍慢 | Llama, EfficientNet |
💻 代码实现 (Code)
Section titled “💻 代码实现 (Code)”import torchimport torch.nn.functional as F
x = torch.linspace(-3, 3, 100)
# ReLUrelu_out = F.relu(x)
# Sigmoidsigmoid_out = torch.sigmoid(x)
# Tanhtanh_out = torch.tanh(x)
# GELU (Transformer 标准)gelu_out = F.gelu(x)
# SiLU / Swish (Llama 使用)silu_out = F.silu(x)
print(f"ReLU(-2): {F.relu(torch.tensor(-2.0)).item()}") # 0.0print(f"Sigmoid(0): {torch.sigmoid(torch.tensor(0.0)).item()}") # 0.5print(f"GELU(1): {F.gelu(torch.tensor(1.0)).item():.4f}") # 0.8413🎯 如何选择? (When to Use)
Section titled “🎯 如何选择? (When to Use)”| 场景 | 推荐激活函数 | 原因 |
|---|---|---|
| CNN 图像分类 | ReLU / Leaky ReLU | 计算效率高 |
| Transformer / NLP | GELU | BERT/GPT 标准配置 |
| Llama / 现代 LLM | SiLU (Swish) | 深层网络表现好 |
| 二分类输出层 | Sigmoid | 输出概率 |
| 多分类输出层 | Softmax | 输出概率分布 |
| RNN 隐藏层 | Tanh | 零中心,梯度特性好 |
⚠️ 常见误区 (Pitfalls)
Section titled “⚠️ 常见误区 (Pitfalls)”📚 参考论文
Section titled “📚 参考论文”| 论文 | 激活函数 | 链接 |
|---|---|---|
| Nair & Hinton, 2010 | ReLU | ICML 2010 |
| Hendrycks & Gimpel, 2016 | GELU | arXiv:1606.08415 |
| Ramachandran et al., 2017 | Swish | arXiv:1710.05941 |
| Elfwing et al., 2018 | SiLU | Neural Networks |
🔗 相关概念
Section titled “🔗 相关概念”- 神经网络 - 激活函数的应用场景
- 反向传播 - 激活函数的梯度计算
- Transformer - GELU 的典型应用