激活函数
没有激活函数,多层神经网络等价于单层线性变换。激活函数提供非线性,让网络能拟合任意复杂函数。
为什么 Sigmoid 被淘汰了?
Section titled “为什么 Sigmoid 被淘汰了?”Sigmoid 曾经是标准选择,但有两个致命问题:
- 梯度消失:当 时,梯度 ,深层网络几乎无法学习
- 非零中心:输出恒为正,导致梯度更新锯齿形震荡
import torchimport torch.nn.functional as F
x = torch.tensor([5.0], requires_grad=True)y = torch.sigmoid(x)y.backward()print(f"Sigmoid'(5.0) = {x.grad.item():.6f}") # ≈ 0.0066
x2 = torch.tensor([5.0], requires_grad=True)y2 = F.relu(x2)y2.backward()print(f"ReLU'(5.0) = {x2.grad.item()}") # 1.0ReLU 的死亡神经元问题
Section titled “ReLU 的死亡神经元问题”ReLU 在 时输出和梯度都为 0。如果学习率太大,可能导致神经元永久”死亡”:
# 模拟死亡神经元x = torch.randn(1000, 10)w = torch.randn(10, 10) * -10 # 负权重导致输出恒为负out = F.relu(x @ w)dead_ratio = (out.sum(dim=0) == 0).float().mean()print(f"死亡神经元比例: {dead_ratio:.1%}")GELU:高斯误差线性单元
Section titled “GELU:高斯误差线性单元”GELU 是 Transformer 的标准选择。它给负值一个非零输出,解决了 ReLU 的死亡问题:
近似公式(GPT-2 使用):
SwiGLU:现代大模型的选择
Section titled “SwiGLU:现代大模型的选择”SwiGLU 是 Llama 使用的激活函数,在 GELU 基础上进一步改进:
其中 ,也称为 Swish。
| 场景 | 推荐 | 原因 |
|---|---|---|
| CNN 隐藏层 | ReLU | 简单高效 |
| Transformer | GELU | 平滑、性能好 |
| 大模型 (Llama等) | SwiGLU | 最新最优 |
| 二分类输出 | Sigmoid | 输出概率 |
| 多分类输出 | Softmax | 概率分布 |