激活函数

激活函数为神经网络引入非线性,使网络能够学习复杂的模式和关系。从经典的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/LSTMTanh

经验法则

  • 隐藏层优先尝试ReLU
  • 遇到死亡神经元问题用LeakyReLU
  • Transformer类模型用GELU
  • 输出层根据任务选择
----