激活函数

发布于 23 天前  68 次阅读


🧠 激活函数全解析

激活函数是神经网络中不可或缺的核心组件。它的作用是在每一层神经元的输出上施加一个非线性变换,使网络具备拟合复杂函数的能力。如果没有激活函数,无论神经网络有多少层,最终都只能等价于一个线性模型,无法解决复杂的非线性问题。


📌 为什么需要激活函数?

神经网络每一层的基本运算是线性组合:

如果去掉激活函数,多层网络的叠加仍然是线性运算:

无论堆叠多少层,本质上都只是一个线性变换。而引入激活函数后,网络可以逼近任意复杂的非线性函数,这正是深度学习强大的根本原因。


🔍 常见激活函数详解

Sigmoid 函数

  • 特点:将任意实数映射到 0 和 1 之间,输出可以理解为概率
  • 优点:输出平滑、可微,适合二分类任务的输出层
  • 缺点
    • 梯度消失:当输入值较大或较小时,梯度趋近于 0,导致深层网络难以训练
    • 输出非零均值:会导致下一层权重更新时出现锯齿形震荡
    • 计算涉及指数运算,相对较慢

Tanh 函数

  • 特点:Sigmoid 的平移缩放版本,输出以 0 为中心
  • 优点:零均值输出,收敛速度通常比 Sigmoid 快
  • 缺点:同样存在梯度消失问题,在深层网络中表现不佳

ReLU 函数

  • 特点:当输入为正时直接输出,为负时输出 0
  • 优点
    • 计算极其简单高效
    • 正区间梯度恒为 1,有效缓解梯度消失问题
    • 产生稀疏激活,有助于模型泛化
  • 缺点
    • Dead ReLU 问题:一旦输入为负,梯度为 0,该神经元可能永远无法恢复
    • 输出非零均值

Leaky ReLU

  • 特点:给负区间一个很小的斜率,避免 Dead ReLU
  • 优点:解决了 ReLU 的神经元死亡问题

ELU 函数

  • 特点:负区间使用指数函数,输出接近零均值
  • 优点:兼具 ReLU 的高效和零均值输出的优势,抗噪声能力更强
  • 缺点:负区间涉及指数运算,计算成本略高

Swish 函数

  • 特点:Google Brain 提出,在深层网络中表现优异
  • 优点:平滑、非单调,在 ResNet 等深层架构中效果显著
  • 缺点:计算涉及 Sigmoid,开销比 ReLU 大

GELU 函数

  • 特点:Transformer 架构(如 BERT、GPT)的标准激活函数
  • 优点:结合了 Dropout 和 Zoneout 的思想,在自然语言处理任务中表现卓越
  • 缺点:计算相对复杂

Softmax 函数

  • 输出范围:$(0, 1)$,且所有输出之和为 1
  • 特点:将一组实数转化为概率分布
  • 用途:几乎专用于多分类任务的输出层

📊 激活函数对比总览

激活函数 输出范围 是否零均值 梯度消失风险 计算开销 典型应用场景
Sigmoid (0, 1) 二分类输出层
Tanh (-1, 1) RNN / LSTM
ReLU [0, +∞) CNN / 通用隐藏层
Leaky ReLU (-∞, +∞) 需要避免 Dead ReLU
ELU (-α, +∞) 接近 需要零均值输出
Swish (-∞, +∞) 深层网络
GELU (-∞, +∞) 中高 Transformer / NLP
Softmax (0, 1) 多分类输出层

💡 如何选择激活函数?

隐藏层选择策略:

  • 默认首选 ReLU:简单高效,绝大多数场景下表现良好,是隐藏层的"万金油"选择
  • 深层网络 / Transformer:优先考虑 GELU 或 Swish,它们在深层架构中已被广泛验证
  • 希望避免 Dead ReLU:使用 Leaky ReLU 或 ELU
  • RNN / LSTM:Tanh 仍然是经典选择,与门控机制配合良好

输出层选择策略:

  • 二分类:Sigmoid,输出可直接解释为概率
  • 多分类:Softmax,输出为各类别的概率分布
  • 回归任务:通常不使用激活函数(即恒等映射),或根据目标值范围选择

⚠️ 常见问题与注意事项

梯度消失

  • Sigmoid 和 Tanh 在饱和区的导数接近 0,深层网络中梯度逐层衰减
  • 解决方案:使用 ReLU 系列或配合 Batch Normalization

Dead ReLU

  • ReLU 神经元一旦进入负区间就"死亡",学习率过大时尤其容易发生
  • 解决方案:使用 Leaky ReLU、合理初始化权重、控制学习率

爆炸梯度

  • 某些激活函数在特定区间可能导致梯度爆炸
  • 解决方案:梯度裁剪(Gradient Clipping)、权重正则化

初始化配合

  • ReLU 系列推荐使用 He 初始化
  • Sigmoid / Tanh 推荐使用 Xavier / Glorot 初始化
  • 正确的初始化与激活函数搭配,能显著加速收敛

📝 总结:激活函数是神经网络从"线性"走向"非线性"的关键。选择合适的激活函数需要综合考虑网络深度、任务类型和计算资源。对于大多数场景,ReLU 系列是隐藏层的安全选择;而在 Transformer 等现代架构中,GELU 已成为事实标准。理解每种激活函数的特性与适用场景,是构建高效深度学习模型的基本功。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。