6.5 常见激活函数深入
前面介绍了四种激活函数的基本形态,这里深入讲几个关键细节。
6.5.1 ReLU的死亡神经元问题
ReLU的公式 f(x) = max(0, x) 有一个致命缺陷:一旦某个神经元的所有输入都让它输出0(即加权和+bias为负),该神经元的梯度就永远是0——梯度为0意味着参数不再更新,这个神经元就”死”了。它再也不会对任何输入产生反应,相当于脑细胞坏死。
死亡神经元常见于以下场景:
- 学习率过大,一次更新把bias推到了很负的区域
- 权重初始化不当,导致大量神经元一开始就输出负值
- 梯度爆炸后参数被推到极端值
解决方案:Leaky ReLU(f(x) = max(0.01x, x))给负数区域一个很小的斜率,让梯度不至于完全为零。不过实践中,合理的权重初始化和适中的学习率已经能大幅缓解ReLU死亡问题,所以Leaky ReLU反而不如ReLU常见。
6.5.2 GELU:为什么平滑更好
GELU(Gaussian Error Linear Unit)的公式是 f(x) = x * Φ(x),其中Φ是标准正态分布的累积分布函数。与ReLU的硬截断(负数直接归零)不同,GELU在x=0附近是平滑过渡的——负数不会完全消失,而是被”软性抑制”。
平滑的好处在于梯度的连续性。ReLU在x=0处梯度不连续(左导数为0,右导数为1),这会让优化路径在零点附近”抖动”。GELU处处可导,梯度流动更稳定,训练更平滑。这也是为什么Transformer全系列(BERT、GPT、T5、Llama)都用GELU——在大规模训练中,梯度稳定性的微小优势会放大成显著的收敛速度差异。
6.5.3 Swish / SiLU:ReLU的进化版
Swish由Google Brain在2017年通过自动化搜索发现,公式为 f(x) = x * sigmoid(βx)。当β=1时就是SiLU(Sigmoid Linear Unit),已被PyTorch、Llama等广泛采用。
Swish/SiLU的特点:
- 非单调:在x<0区域不是单调递减的,有一个小”凸起”,这给了网络更多表达空间
- 无上界:正数区域不受限,避免了Sigmoid/Tanh的梯度饱和问题
- 平滑:处处可导
Llama 2和Llama 3都使用SiLU作为前馈网络的激活函数,实践验证了它在LLM训练中的效果优于ReLU和GELU。
6.5.4 激活函数选择指南
| 场景 | 推荐激活函数 | 原因 |
|---|---|---|
| 简单分类/回归(小网络) | ReLU | 简单高效,死亡神经元问题在小网络上不明显 |
| Transformer / LLM 前馈层 | Swish/SiLU 或 GELU | 平滑梯度,大规模训练收敛更稳定 |
| CNN 图像分类(ResNet等) | ReLU | 经典搭配,BatchNorm已缓解死亡问题 |
| 二分类输出层 | Sigmoid | 输出天然在(0,1),可直接解释为概率 |
| 多分类输出层 | Softmax | 输出和为1的多类别概率分布 |
| RNN / LSTM | Tanh + Sigmoid | LSTM门控结构的历史惯例 |
| 2026年新架构默认 | Swish/SiLU | 新一代模型(Llama 3/4、Gemma等)的标配 |
← 上一节:6.4 激活函数:为什么不能全用线性 | 下一节:6.6 归一化层:BatchNorm 与 LayerNorm →