searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

如何选择激活函数?

2025-11-25 10:19:36
0
0

激活函数是神经网络的核心组件之一,它决定了神经元的输出,为网络引入了非线性,使得神经网络能够拟合极其复杂的函数。

如果没有激活函数,无论网络多深,都等价于一个线性回归模型,无法解决像图像识别、自然语言处理这样的复杂问题。

下面我将激活函数分为三大类进行介绍:经典常用型、进阶高性能型、和特殊用途型

一、 经典常用型

这类函数历史悠久,是入门必学且至今仍在广泛使用的函数。

1. Sigmoid(S型函数)

  • 公式f(x) = 1 / (1 + e^(-x))
  • 输出范围:(0, 1)
  • 特点与场景
    • 优点:输出平滑,易于求导;将输出压缩到(0,1),可以解释为概率(例如,二分类输出的最后一层)。
    • 缺点
      1. 梯度消失:当输入值的绝对值很大时,梯度会接近于0,在反向传播中导致深层网络的权重几乎不更新。
      2. 非零中心:输出恒大于0,导致梯度更新呈“Z”字形下降,收敛慢。
      3. 计算量较大(涉及指数运算)。
    • 应用场景现在主要用于二分类模型的输出层,在隐藏层中已很少使用。

2. Tanh(双曲正切函数)

  • 公式f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
  • 输出范围:(-1, 1)
  • 特点与场景
    • 优点零中心化,其输出以0为中心,收敛速度通常比Sigmoid快。
    • 缺点:依然存在梯度消失的问题。
    • 应用场景:在RNN(循环神经网络,如LSTM、GRU)的隐藏层中仍然比较常见,因其输出范围更适合表征序列数据的中间状态。在普通的前馈网络中,通常被ReLU及其变体所取代。

3. ReLU(整流线性单元)

  • 公式f(x) = max(0, x)
  • 输出范围:[0, +∞)
  • 特点与场景
    • 优点
      1. 计算极其高效:只需比较和取最大值。
      2. 在正区间解决了梯度消失问题,梯度恒为1。
      3. 收敛速度远快于Sigmoid和Tanh。
    • 缺点
      1. Dying ReLU(神经元死亡):当输入为负时,梯度为0,对应的神经元永远无法被激活。
      2. 非零中心
    • 应用场景目前最常用、默认的激活函数,尤其适用于CNN(卷积神经网络)和普通深度前馈网络的隐藏层。

二、 进阶高性能型

这类函数主要是为了克服ReLU的缺点而设计的,是现代深度网络的主流选择。

4. Leaky ReLU(带泄露ReLU)

  • 公式f(x) = max(αx, x) (α是一个很小的常数,如0.01)
  • 输出范围:(-∞, +∞)
  • 特点与场景
    • 优点:解决了Dying ReLU问题。在负区间有一个小的斜率α,使得负输入也有一个微小的梯度,神经元始终有被激活的可能。
    • 缺点:需要手动设定或作为超参数学习α值。
    • 应用场景:当担心出现“神经元死亡”时,可以作为ReLU的直接替代品。在实践中,效果有时优于ReLU。

5. PReLU(参数化ReLU)

  • 公式:与Leaky ReLU相同,但α作为一个可学习的参数,由模型在训练中自己确定。
  • 特点与场景:比Leaky ReLU更灵活,理论上性能更好,但增加了少量参数和计算量。在一些大型模型(如ImageNet上的大型CNN)中表现出色。

6. ELU(指数线性单元)

  • 公式f(x) = x (if x > 0), α(e^x - 1) (if x <= 0)
  • 输出范围:(-α, +∞)
  • 特点与场景
    • 优点
      1. 具有ReLU的所有优点。
      2. 输出更接近零中心化。
      3. 在负区域是平滑的曲线,可能比Leaky ReLU有更快的收敛速度。
    • 缺点:计算涉及指数运算,比ReLU慢。
    • 应用场景:在需要更高精度和稳定性的任务中,可以作为ReLU的强力竞争者。

7. GELU(高斯误差线性单元)

  • 公式f(x) = x * Φ(x),其中Φ(x)是标准高斯分布的累积分布函数。常用近似实现:0.5 * x * (1 + tanh[√(2/π) * (x + 0.044715 * x^3)])
  • 特点与场景
    • 优点:这是一个随机正则化器,它的输出取决于输入相对于其他输入的概率。思想是“在概率上屏蔽掉一些神经元”,这与Dropout的思想一致,但更平滑。
    • 应用场景在Transformer模型中已成为标配,例如BERT、GPT等NLP领域的SOTA模型都使用GELU作为其前馈网络的激活函数。

三、 特殊用途型

这类函数为特定类型的网络结构或任务而设计。

8. Softmax

  • 公式:将一组实数转换为概率分布,S(y_i) = e^(y_i) / Σ(j=1 to n) e^(y_j)
  • 输出范围:(0, 1),且所有输出之和为1。
  • 特点与场景
    • 应用场景专用于多分类神经网络的输出层。它将网络的原始输出转换为每个类别的概率。

9. Swish(由Google搜索发现)

  • 公式f(x) = x * sigmoid(βx) (β可以是常数或可学习参数)
  • 特点与场景
    • 优点:平滑、非单调。在实践中,它在某些深度模型上的表现被证明略优于ReLU。
    • 缺点:计算量较大。
    • 应用场景:在一些前沿研究和复杂模型中作为尝试,但尚未像ReLU那样成为绝对主流。

总结与选择指南

激活函数 优点 缺点 典型应用场景
Sigmoid 输出平滑,可表概率 梯度消失,非零中心,计算慢 二分类输出层
Tanh 零中心,收敛快于Sigmoid 梯度消失 RNN的隐藏层
ReLU 计算高效,缓解梯度消失 Dying ReLU,非零中心 CNN/深度前馈网络的隐藏层(默认首选)
Leaky ReLU/PReLU 解决Dying ReLU问题 需调参/PReLU增加参数 ReLU的替代方案,效果可能更好
ELU 近似零中心,收敛快 计算慢 对精度和稳定性要求高的网络
GELU 随机正则化思想,平滑 计算复杂 Transformer/BERT/GPT等NLP模型
Softmax 输出概率分布 仅用于输出层 多分类输出层

实践建议:

  1. 入门与默认:对于大多数情况,从ReLU开始,它是很好的基准选择。
  2. 遇到问题:如果怀疑网络中存在大量“死亡神经元”(例如,很多层的输出为0),可以尝试Leaky ReLUELU
  3. 特定架构
    • CNN/普通深度网络:隐藏层用 ReLU 或其变体。
    • RNN:隐藏层常用 TanhSigmoid
    • Transformer:隐藏层(特别是FFN)使用 GELU
  4. 输出层
    • 二分类Sigmoid
    • 多分类Softmax
    • 回归:通常不使用激活函数(线性输出)。
0条评论
0 / 1000
Maxwell
7文章数
0粉丝数
Maxwell
7 文章 | 0 粉丝
原创

如何选择激活函数?

2025-11-25 10:19:36
0
0

激活函数是神经网络的核心组件之一,它决定了神经元的输出,为网络引入了非线性,使得神经网络能够拟合极其复杂的函数。

如果没有激活函数,无论网络多深,都等价于一个线性回归模型,无法解决像图像识别、自然语言处理这样的复杂问题。

下面我将激活函数分为三大类进行介绍:经典常用型、进阶高性能型、和特殊用途型

一、 经典常用型

这类函数历史悠久,是入门必学且至今仍在广泛使用的函数。

1. Sigmoid(S型函数)

  • 公式f(x) = 1 / (1 + e^(-x))
  • 输出范围:(0, 1)
  • 特点与场景
    • 优点:输出平滑,易于求导;将输出压缩到(0,1),可以解释为概率(例如,二分类输出的最后一层)。
    • 缺点
      1. 梯度消失:当输入值的绝对值很大时,梯度会接近于0,在反向传播中导致深层网络的权重几乎不更新。
      2. 非零中心:输出恒大于0,导致梯度更新呈“Z”字形下降,收敛慢。
      3. 计算量较大(涉及指数运算)。
    • 应用场景现在主要用于二分类模型的输出层,在隐藏层中已很少使用。

2. Tanh(双曲正切函数)

  • 公式f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
  • 输出范围:(-1, 1)
  • 特点与场景
    • 优点零中心化,其输出以0为中心,收敛速度通常比Sigmoid快。
    • 缺点:依然存在梯度消失的问题。
    • 应用场景:在RNN(循环神经网络,如LSTM、GRU)的隐藏层中仍然比较常见,因其输出范围更适合表征序列数据的中间状态。在普通的前馈网络中,通常被ReLU及其变体所取代。

3. ReLU(整流线性单元)

  • 公式f(x) = max(0, x)
  • 输出范围:[0, +∞)
  • 特点与场景
    • 优点
      1. 计算极其高效:只需比较和取最大值。
      2. 在正区间解决了梯度消失问题,梯度恒为1。
      3. 收敛速度远快于Sigmoid和Tanh。
    • 缺点
      1. Dying ReLU(神经元死亡):当输入为负时,梯度为0,对应的神经元永远无法被激活。
      2. 非零中心
    • 应用场景目前最常用、默认的激活函数,尤其适用于CNN(卷积神经网络)和普通深度前馈网络的隐藏层。

二、 进阶高性能型

这类函数主要是为了克服ReLU的缺点而设计的,是现代深度网络的主流选择。

4. Leaky ReLU(带泄露ReLU)

  • 公式f(x) = max(αx, x) (α是一个很小的常数,如0.01)
  • 输出范围:(-∞, +∞)
  • 特点与场景
    • 优点:解决了Dying ReLU问题。在负区间有一个小的斜率α,使得负输入也有一个微小的梯度,神经元始终有被激活的可能。
    • 缺点:需要手动设定或作为超参数学习α值。
    • 应用场景:当担心出现“神经元死亡”时,可以作为ReLU的直接替代品。在实践中,效果有时优于ReLU。

5. PReLU(参数化ReLU)

  • 公式:与Leaky ReLU相同,但α作为一个可学习的参数,由模型在训练中自己确定。
  • 特点与场景:比Leaky ReLU更灵活,理论上性能更好,但增加了少量参数和计算量。在一些大型模型(如ImageNet上的大型CNN)中表现出色。

6. ELU(指数线性单元)

  • 公式f(x) = x (if x > 0), α(e^x - 1) (if x <= 0)
  • 输出范围:(-α, +∞)
  • 特点与场景
    • 优点
      1. 具有ReLU的所有优点。
      2. 输出更接近零中心化。
      3. 在负区域是平滑的曲线,可能比Leaky ReLU有更快的收敛速度。
    • 缺点:计算涉及指数运算,比ReLU慢。
    • 应用场景:在需要更高精度和稳定性的任务中,可以作为ReLU的强力竞争者。

7. GELU(高斯误差线性单元)

  • 公式f(x) = x * Φ(x),其中Φ(x)是标准高斯分布的累积分布函数。常用近似实现:0.5 * x * (1 + tanh[√(2/π) * (x + 0.044715 * x^3)])
  • 特点与场景
    • 优点:这是一个随机正则化器,它的输出取决于输入相对于其他输入的概率。思想是“在概率上屏蔽掉一些神经元”,这与Dropout的思想一致,但更平滑。
    • 应用场景在Transformer模型中已成为标配,例如BERT、GPT等NLP领域的SOTA模型都使用GELU作为其前馈网络的激活函数。

三、 特殊用途型

这类函数为特定类型的网络结构或任务而设计。

8. Softmax

  • 公式:将一组实数转换为概率分布,S(y_i) = e^(y_i) / Σ(j=1 to n) e^(y_j)
  • 输出范围:(0, 1),且所有输出之和为1。
  • 特点与场景
    • 应用场景专用于多分类神经网络的输出层。它将网络的原始输出转换为每个类别的概率。

9. Swish(由Google搜索发现)

  • 公式f(x) = x * sigmoid(βx) (β可以是常数或可学习参数)
  • 特点与场景
    • 优点:平滑、非单调。在实践中,它在某些深度模型上的表现被证明略优于ReLU。
    • 缺点:计算量较大。
    • 应用场景:在一些前沿研究和复杂模型中作为尝试,但尚未像ReLU那样成为绝对主流。

总结与选择指南

激活函数 优点 缺点 典型应用场景
Sigmoid 输出平滑,可表概率 梯度消失,非零中心,计算慢 二分类输出层
Tanh 零中心,收敛快于Sigmoid 梯度消失 RNN的隐藏层
ReLU 计算高效,缓解梯度消失 Dying ReLU,非零中心 CNN/深度前馈网络的隐藏层(默认首选)
Leaky ReLU/PReLU 解决Dying ReLU问题 需调参/PReLU增加参数 ReLU的替代方案,效果可能更好
ELU 近似零中心,收敛快 计算慢 对精度和稳定性要求高的网络
GELU 随机正则化思想,平滑 计算复杂 Transformer/BERT/GPT等NLP模型
Softmax 输出概率分布 仅用于输出层 多分类输出层

实践建议:

  1. 入门与默认:对于大多数情况,从ReLU开始,它是很好的基准选择。
  2. 遇到问题:如果怀疑网络中存在大量“死亡神经元”(例如,很多层的输出为0),可以尝试Leaky ReLUELU
  3. 特定架构
    • CNN/普通深度网络:隐藏层用 ReLU 或其变体。
    • RNN:隐藏层常用 TanhSigmoid
    • Transformer:隐藏层(特别是FFN)使用 GELU
  4. 输出层
    • 二分类Sigmoid
    • 多分类Softmax
    • 回归:通常不使用激活函数(线性输出)。
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0