激活函数:ReLU/GELU/Swish 对比
没有激活函数,多层线性层叠加仍等价于一个线性层。激活函数提供非线性,是深度网络表达能力的来源。不同激活在梯度、稀疏性、训练稳定性上各有取舍。
早期选择:Sigmoid 与 Tanh
Sigmoid 把输出压到 0 到 1,Tanh 压到 -1 到 1。两者在深层都容易饱和,梯度趋近零,导致梯度消失。如今它们多用于输出层(二分类、归一化),隐藏层已较少使用。
ReLU 与它的改进
ReLU 在正值线性通过、负值置零,计算简单且缓解梯度消失,但会出现「神经元死亡」(负区永久不激活)。LeakyReLU、PReLU 给负值一个小的非零斜率来缓解。ELU 用指数负区,使均值更接近零。
GELU 与 Swish
GELU 用输入按正态分布的累积概率加权,是 Transformer 类模型的主流选择。Swish(又名 SiLU)是 x·sigmoid(βx),平滑非单调,在深层网络常优于 ReLU。两者都需要更精细的数值实现,但现代框架已原生支持。
import torch.nn as nn
act = nn.ReLU() # 最常用基线
gelu = nn.GELU() # Transformer 默认
swish = nn.SiLU() # 等同 Swish
x = act(torch.randn(8, 64))
怎么选
卷积网络常用 ReLU/LeakyReLU;Transformer 与大规模预训练多用 GELU;Swish 在移动端等轻量场景表现好。输出层按任务定:二分类用 Sigmoid,多分类用 Softmax。
小结
激活函数决定网络的非线性能力。ReLU 简单高效是默认基线,GELU/Swish 在深层与 Transformer 中更优,Sigmoid/Tanh 主要退居输出层。选型应结合网络结构与框架支持。
参考与延伸阅读
- Swish 论文(Ramachandran 等, 2017, Google Brain)。已核验。https://arxiv.org/abs/1710.05941
- GELU 说明(Hendrycks 与 Gimpel, 2016)。已核验。https://arxiv.org/abs/1606.08415
- PyTorch 激活函数文档。已核验。https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-bias
本文累计阅读 — 次