常用的激活函数对比

本文介绍了神经网络中激活函数的作用及各类常见激活函数(如Sigmoid、Tanh、ReLU及其变种)的特点与适用场景,帮助读者理解如何根据任务需求选择合适的激活函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。

在ICML2016的一篇论文Noisy Activation Functions中,作者将激活函数作出了形象的定义,如下图所示:
这里写图片描述

在实际的应用中,我们需要先了解以下概念:

  • 饱和

    当一个激活函数h(x)满足 limn+h(x)=0 时,我们称之为右饱和
    当一个激活函数h(x)满足 limnh(x)=0 时,我们称之为左饱和
    当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和

  • 硬饱和与软饱和

    对任意的x,如果存在常数c,当 x > c 时恒有 h(x)=0 则称其为右硬饱和
    对任意的x,如果存在常数c,当 x < c 时恒有 h(x)=0 则称其为左硬饱和
    若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和
    如果只有在极限状态下偏导数等于0的函数,称之为软饱和

从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。下文将依次对它们进行总结。

Sigmoid

Sigmoid 是使用范围最广的一类激活函数,具有指数函数形状 。正式定义为:

f(x)=11+ex

这里写图片描述

可见,sigmoid 在定义域内处处可导,根据上述对饱和的定义,其可被定义为软饱和激活函数。

Sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

这里给出一个关于梯度消失的通俗解释:

Sigmoid 函数能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是 f(x)=f(x)(1f(x)) 。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新。

最后总结一下 Sigmoid 函数的优缺点:

优点:

  1. Sigmoid 函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。它在物理意义上最为接近生物神经元。
  2. 求导容易。

缺点:

  1. 由于其软饱和性,容易产生梯度消失,导致训练出现问题。
  2. 其输出并不是以0为中心的。
Tanh

f(x)=1e2x1+e2x

函数位于[-1, 1]区间上,对应的图像是:
这里写图片描述

同样的,Tanh 激活函数也具有软饱和性。Tanh 网络的收敛速度要比 Sigmoid 快。因为 Tanh 的输出均值比 Sigmoid 更接近 0,SGD 会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。

总结一下 Tanh 激活函数的优缺点:

优点:

  1. 比Sigmoid函数收敛速度更快。
  2. 相比Sigmoid函数,其输出以0为中心。

缺点:

还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。

ReLU

ReLU 是近几年非常受欢迎的激活函数。被定义为:
这里写图片描述
其对应的函数图像为:
这里写图片描述

可见,ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。

最后总结一下 ReLU 函数的优缺点:

优点:

  1. 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。据称,这是因为它线性、非饱和的形式。
  2. Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
  3. 有效缓解了梯度消失的问题。
  4. 在没有无监督预训练的时候也能有较好的表现。
  5. 提供了神经网络的稀疏表达能力。

缺点:

随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

LReLU 与 PReLU

PReLU 是 ReLU 和 LReLU 的改进版本,具有非饱和性:
这里写图片描述

下面给出 LReLU 的函数图像:
这里写图片描述

ai 比较小且固定的时候,我称之为 LReLU。LReLU 最初的目的是为了避免梯度消失。但在一些实验中,我们发现 LReLU 对准确率并没有太大的影响。很多时候,当我们想要应用 LReLU 时,我们必须要非常小心谨慎地重复训练,选取出合适的 a,LReLU 的表现出的结果才比 ReLU 好。因此有人提出了一种自适应地从数据中学习参数的 PReLU。

PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。

ELU

ELU 融合了sigmoid和ReLU,具有左侧软饱性。其正式定义为:
这里写图片描述

这里写图片描述

右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。

激活函数选用总结

在进行深度学习的研究中,如何选择激活函数,仍需依靠实验指导。一般来说,在分类问题上建议首先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。

该博文主要参考资料:
1.深度学习中的激活函数导引
2.浅谈深度学习中的激活函数

### 常见深度学习激活函数详解及对比 #### 1. **Sigmoid 激活函数** Sigmoid 是一种经典的激活函数,其定义域为实数集,值域位于 (0, 1)。它常用于二分类问题中作为输出层的激活函数。 公式如下: \[ f(x) = \frac{1}{1 + e^{-x}} \] 优点包括平滑性和非线性特性[^3]。然而,在深层网络中,Sigmoid 容易引发梯度消失问题,因为当输入较大或较小时,导数值接近于零[^4]。 ```python import torch.nn as nn activation_sigmoid = nn.Sigmoid() ``` --- #### 2. **Tanh 激活函数** Tanh 可视为 Sigmoid 的改进版本,它的值域扩展到 (-1, 1),这使得模型训练初期更易于收敛。尽管如此,Tanh 同样存在梯度消失的问题。 公式如下: \[ f(x) = \tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} \] ```python activation_tanh = nn.Tanh() ``` --- #### 3. **ReLU 激活函数** ReLU(Rectified Linear Unit)是一种简单而高效的激活函数,广泛应用于卷积神经网络(CNN)。对于正向输入,ReLU 输出等于输入本身;而对于负向输入,则将其截断为零。 公式如下: \[ f(x) = \max(0, x) \] 相比 sigmoidtanhReLU 不仅计算效率高,还有效缓解了梯度消失现象[^1]。不过,ReLU 存在一个潜在缺陷——“死亡神经元”,即某些权重更新后始终无法激发。 ```python activation_relu = nn.ReLU() ``` --- #### 4. **Leaky ReLU 激活函数** 为了克服标准 ReLU 中存在的“死亡神经元”问题,提出了 Leaky ReLU。该变体允许少量负斜率通过,从而保留部分信号传递能力。 公式如下: \[ f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{otherwise} \end{cases} \] 其中 \( \alpha \) 表示一个小的正值系数。 ```python activation_leakyrelu = nn.LeakyReLU(negative_slope=0.01) ``` --- #### 5. **Swish 激活函数** 作为一种新兴的自门控激活函数,Swish 结合了 sigmoid 和乘法操作的优势。研究表明,这种设计有助于提升模型性能,尤其是在大型复杂任务上表现优异[^2]。 公式如下: \[ f(x) = x \cdot \sigma(\beta x), \quad \text{where } \sigma(z) = \frac{1}{1 + e^{-z}} \] 值得注意的是,\( \beta \) 参数控制 Swish 的非线性程度。 ```python class Swish(nn.Module): def __init__(self, beta=1.0): super(Swish, self).__init__() self.beta = beta def forward(self, x): return x * torch.sigmoid(self.beta * x) activation_swish = Swish(beta=1.0) ``` --- #### 总结与应用场景分析 每种激活函数都有特定的应用场景和局限性: - 对于浅层网络或者需要概率解释的任务,可以选择 **Sigmoid** 或 **Tanh**。 - 如果目标是最优速度与效果平衡,推荐使用 **ReLU** 或其变体(如 Leaky ReLU)。 - 当面对高度复杂的建模需求时,尝试采用新型激活函数比如 **Swish** 来进一步提高精度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值