激活函数
激活函数为神经网络引入非线性,使网络能够学习复杂的模式和关系。从经典的Sigmoid到现代的GELU,激活函数的选择深刻影响着模型的性能。
学习难度:入门·阅读时间:约10分钟
为什么需要激活函数
线性模型的局限
没有激活函数时:
- 多层线性变换仍然等价于单层
- 无法学习非线性关系
- 表达能力极其有限
非线性的力量
激活函数的作用:
- 引入非线性变换
- 使网络能拟合任意函数
- 增加模型的表达能力
理想激活函数
好的激活函数应该:
- 非线性:提供非线性变换能力
- 可微:便于计算梯度
- 计算简单:提高训练效率
- 缓解梯度问题:避免梯度消失/爆炸
Sigmoid与Tanh
Sigmoid函数
σ(x) = 1 / (1 + e⁻ˣ)
输出范围:(0, 1)
特点
- ✅ 输出有界,适合表示概率
- ✅ 处处可微
- ❌ 梯度消失问题:两端梯度接近0
- ❌ 输出非零中心
- ❌ 计算exp开销大
Tanh函数
tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
输出范围:(-1, 1)
Tanh优势
- 输出零中心,收敛更快
- 但仍有梯度消失问题
ReLU及其变体
ReLU
ReLU(x) = max(0, x)
ReLU的优点
- ✅ 计算极快(简单比较)
- ✅ 正区间梯度恒为1,缓解梯度消失
- ✅ 稀疏激活:负值输出为0
- ✅ 生物学上有一定合理性
ReLU的问题
- ❌ 死亡ReLU:负区间梯度为0
- ❌ 神经元可能永久失活
- ❌ 输出非零中心
ReLU变体
LeakyReLU
f(x) = max(αx, x),α通常为0.01
负区间有小的梯度,解决死亡ReLU问题。
PReLU
α可学习
自适应调整负区间的斜率。
ELU
负区间使用指数函数
输出更接近零中心,但计算稍慢。
Softmax函数
定义
softmax(x_i) = eˣⁱ / Σ eˣʲ
用途
- 多分类问题的输出层
- 将输出转换为概率分布
- 所有输出和为1
与交叉熵配合
Softmax通常与交叉熵损失函数配合使用,用于多分类任务。
现代激活函数
GELU
Gaussian Error Linear Unit,Transformer模型广泛使用:
GELU(x) = x × Φ(x),其中Φ是标准正态分布的CDF
GELU平滑且非单调,在BERT、GPT等大模型中表现优异。
Swish
Swish(x) = x × sigmoid(x)
Google提出的自门控激活函数,在深层网络中表现优于ReLU。
GLU
Gated Linear Unit,用于LLaMA等模型:
- 结合了门控机制
- 在FFN层中使用
- 提升模型表达能力
如何选择
推荐选择
| 场景 | 推荐激活函数 |
|---|---|
| 隐藏层(通用) | ReLU 或 LeakyReLU |
| Transformer模型 | GELU |
| 多分类输出层 | Softmax |
| 二分类输出层 | Sigmoid |
| RNN/LSTM | Tanh |
经验法则
- 隐藏层优先尝试ReLU
- 遇到死亡神经元问题用LeakyReLU
- Transformer类模型用GELU
- 输出层根据任务选择