激活函数
问题
激活函数的作用是什么?常见的激活函数有哪些?为什么 ReLU 取代了 Sigmoid?LLM 中为什么使用 GELU/SwiGLU?
答案
激活函数为神经网络引入非线性——没有激活函数,多层线性变换仍是线性,网络表达能力等同于单层。
一、常见激活函数对比
| 激活函数 | 公式 | 输出范围 | 特点 |
|---|---|---|---|
| Sigmoid | (0, 1) | 经典,但梯度消失严重 | |
| Tanh | (-1, 1) | 零中心,但仍有梯度消失 | |
| ReLU | [0, +∞) | 简单高效,深度学习默认 | |
| Leaky ReLU | (-∞, +∞) | 解决 ReLU "死神经元" | |
| GELU | (-0.17, +∞) | Transformer/BERT 默认 | |
| Swish | (-0.28, +∞) | Google 搜索发现,效果好 | |
| SwiGLU | GLU 门控 + Swish | - | LLaMA/GPT 等 LLM 使用 |
二、为什么 ReLU 取代了 Sigmoid?
| 问题 | Sigmoid | ReLU |
|---|---|---|
| 梯度消失 | 严重(梯度最大 0.25,多层累乘趋近 0) | 正区间梯度恒为 1 |
| 计算开销 | 指数运算,较慢 | 只需比较和取值,极快 |
| 零中心 | 输出全为正,导致梯度偏移 | 正区间保持,负区间为 0 |
| 稀疏性 | 所有神经元都"激活" | 约 50% 为 0——稀疏激活 |
ReLU 的问题——Dead Neurons
如果某个神经元的输入始终为负,它的输出永远为 0,梯度也永远为 0——这个神经元"死了",永远不会更新。
解决方案:
- Leaky ReLU:负区间给一个小斜率(如 0.01x)
- Parametric ReLU(PReLU):负区间斜率可学习
- ELU:负区间指数衰减
三、GELU——Transformer 的默认激活
GELU 是 BERT、GPT 等 Transformer 模型的标准激活函数。它的特点:
- 平滑版 ReLU:不像 ReLU 在 0 处有"尖角"
- 概率解释: 是标准正态分布的累积分布函数,GELU 可以理解为"以概率 保留 "
- 效果更好:在 NLP 任务上比 ReLU 一致性地更好
四、SwiGLU——LLM 的最新选择
SwiGLU 是 LLaMA、PaLM、GPT-4 等现代 LLM 使用的激活函数,结合了 Swish 激活和门控线性单元(GLU):
相比 GELU 的优势:门控机制让模型可以学习性地控制信息流通,在相同参数量下效果更好。
五、不同场景的选择建议
| 场景 | 推荐激活函数 |
|---|---|
| CNN 隐藏层 | ReLU(或 Leaky ReLU) |
| Transformer 隐藏层 | GELU |
| 现代 LLM(FFN) | SwiGLU |
| 二分类输出层 | Sigmoid |
| 多分类输出层 | Softmax |
| 回归输出层 | 无激活(线性) |
常见面试问题
Q1: Softmax 的作用是什么?温度参数有什么影响?
答案:
Softmax 将一组实数转换为概率分布(和为 1)。温度参数 T 控制分布的"尖锐"程度:
- T → 0:输出趋近 one-hot(最大值对应概率 → 1,其余 → 0)
- T = 1:标准 Softmax
- T → ∞:输出趋近均匀分布
在 LLM 中,Temperature 控制生成的随机性——低温更确定、高温更多样。
Q2: 为什么 Sigmoid 不适合做隐藏层的激活函数?
答案:
- 梯度消失:Sigmoid 的导数最大值仅 0.25,多层累乘后梯度趋近 0
- 非零中心:输出都是正数,导致后一层权重梯度要么全正要么全负(zig-zag 更新)
- 指数运算慢:相比 ReLU 的 max 操作,计算成本高
但 Sigmoid 在输出层(二分类概率)和门控结构(LSTM 的遗忘门)中仍然适用。
Q3: 什么是 GLU(Gated Linear Unit)?为什么它对 LLM 有效?
答案:
GLU 将输入分成两部分:一部分做线性变换,另一部分经过 Sigmoid 作为"门控"——决定哪些信息通过、哪些被抑制。
对 LLM 有效的原因:
- 选择性信息过滤:门控机制让模型可以动态地选择保留哪些特征
- 梯度流动更好:门控结构提供了额外的梯度路径
- 实验验证:PaLM 论文发现 SwiGLU 在同参数量下比 GELU FFN 效果更好