激活函数: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 主要退居输出层。选型应结合网络结构与框架支持。

参考与延伸阅读

本文累计阅读