当前位置: 首页 > article >正文

神经网络 - 激活函数(ReLU 函数)

一、ReLU函数:

ReLU(Rectified Linear Unit,修正线性单元),也叫 Rectifier 函数 ,是目前深度神经网络中经常使用的激活函数,ReLU 实际上是一个斜坡(ramp)函数,其定义为:

   也即:   ReLU(x)=max(0,x).

(一)如何理解ReLU函数

  1. 基本概念

    • 对于任意输入 x,如果 x 小于0,ReLU 的输出为0;如果 x 大于或等于0,输出就是 x 本身。
    • 这种简单的“截断”操作使得ReLU函数具有非线性特性,同时计算非常高效。
  2. 引入非线性

    • 在神经网络中,如果只使用线性变换(例如加权求和),多个线性层的组合依然是线性变换,无法捕捉数据中的复杂非线性关系。
    • ReLU函数的非线性性质使得网络能够学习和表示复杂的非线性映射,从而提高模型的表达能力。
  3. 稀疏激活

    • 当输入为负时,ReLU输出0,这就导致在某些层中只有一部分神经元被激活。
    • 这种稀疏性不仅可以提高计算效率,还能在一定程度上减轻过拟合问题。
  4. 梯度传播

    • ReLU函数在 x>0 时的导数为1,使得梯度传播时不会因激活函数本身导致梯度衰减。
    • 但在 x<0 的区域,其导数为0,这可能会导致“死神经元”问题,即某些神经元长时间不更新。为了解决这个问题,后来发展出了改进版本,如 Leaky ReLU 和 Parametric ReLU。
  5. 直观理解

    • 可以将ReLU函数看作是一扇“开关”:只有当输入足够大(大于0)时,“开关”才会打开,让信号通过;否则,“关掉”信号,不让它传递下去。
    • 这种机制简单直观,且在实际神经网络中表现出色,尤其在深层网络中能够加速训练和改善梯度传播。
  6. 优缺点

       (1)优点:

         采用 ReLU 的神经元只需要进行加、乘和比较的操作,计算上更加高效。

         ReLU 函数也被认为具有生物学合理性(Biological Plausibility),比如单侧抑 制、宽兴奋边界(即兴奋程度可以非常高)。在生物神经网络中,同时处于兴奋状态的神经元非常稀疏。人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃状态。Sigmoid 型激活函数会导致一个非稀疏的神经网络,而 ReLU 却具有很好的稀疏性,大约 50% 的神经元会处于激活状态。

          在优化方面,相比于 Sigmoid 型函数的两端饱和,ReLU 函数为左饱和函数, 且在 𝑥 > 0 时导数为 1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。

        (2)缺点:

           ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移, 会影响梯度下降的效率。

           此外,ReLU 神经元在训练时比较容易“死亡”。在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个 ReLU 神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是 0,在以后的训练过程中永远不能被激活.这种现象称为死亡 ReLU 问题(Dying ReLU Problem),并且也有可能会发生在其他隐藏层。

(二)举例说明

例子1:单个神经元的激活
假设一个神经元计算得到的加权和 zz 为:

  • 如果 z=−2,则 ReLU(-2) = 0;
  • 如果 z=0,ReLU(0) = 0;
  • 如果 z=3.5,ReLU(3.5) = 3.5。

这意味着只有当神经元收到正向足够强的激活时,才会有正输出,否则输出为0。

例子2:深度网络中的应用
在卷积神经网络(CNN)中,每层卷积操作后通常会加上ReLU激活函数。假设某层卷积后的输出是一个特征图,其中包含正值和负值。经过ReLU激活后,所有负值会被截断为0,只保留正值部分。这不仅引入了非线性,还使得特征图变得稀疏,从而有助于提高网络的表达能力和减少计算量。

ReLU函数是一种简单而有效的激活函数,通过将负输入截断为0,保留正输入原值,从而实现非线性映射。它具有计算简单、梯度稳定、稀疏激活等优点,在深度神经网络中得到广泛应用。理解ReLU函数有助于深入认识神经网络的非线性特性和梯度传递机制。

二、ReLU函数的变种

在实际使用中,为了避免ReLU函数的缺点,有几种 ReLU 的变种也会被广泛使用,下面我们逐一介绍。

(一)带泄露的 ReLU

带泄露的 ReLU(Leaky ReLU)是一种改进版的 ReLU 激活函数,其主要目的是解决传统 ReLU 的“死神经元”问题。

1. 标准 ReLU 的问题

  • 标准 ReLU 定义

    当 x≥0 时,输出 x;当 x<0 时,输出 0。

  • 死神经元问题
    如果一个神经元在训练过程中大量接收到负值,标准 ReLU 会将其输出全部截断为 0,且梯度为 0,导致该神经元长时间不更新,进而“死亡”。

2. 带泄露的 ReLU 的原理

  • 定义
    带泄露的 ReLU 改进了标准 ReLU,对于 x<0 的部分,不再输出 0,而是输出一个很小的线性值。常见定义为:

    其中 α 是一个很小的正数,通常取值如 0.01。

        LeakyReLU(𝑥) = max(0, 𝑥) + α min(0, 𝑥),

        其中 α 是一个很小的常数,比如 0.01。当 α < 1 时,带泄露的 ReLU 也可以写为

        LeakyReLU(𝑥) = max(𝑥, α𝑥)(相当于是一个比较简单的 maxout 单元)       

  • 作用
    这样,即使输入为负,神经元也会产生一个小的负输出,并且其梯度为 α\alpha(而非0),从而使得这些神经元在训练过程中仍能接收梯度并更新参数,缓解“死神经元”问题。

3. 直观理解

  • 软性“泄露”
    想象标准 ReLU 就像是一扇只有“关”或“开”的门——当输入为负时门完全关闭(输出为0);而带泄露的 ReLU 就像是一扇带有微小“泄露”的门,即使门基本关闭(输入为负),也会让少量信号泄露出去,从而保持一定的信息流动和梯度传递。

  • 梯度传递
    在 x<0 时,标准 ReLU 的梯度为0,可能导致该神经元永远无法恢复;而 Leaky ReLU 使得即使输入为负,梯度仍然为 α\alpha,保证了神经元有机会在未来输入正信号时重新激活。

  • 标准 ReLU 的梯度为0时,为什么可能导致该神经元永远无法恢复?

      (1)权重无法更新
反向传播过程中,参数(权重和偏置)的更新依赖于梯度信息。如果梯度为0,那么对应权重不会得到任何调整,神经元无法根据数据调整其参数。

     (2)“死”神经元问题
如果一个神经元长时间处于 x<0x < 0x<0 的区域,它的输出始终为0,且梯度为0,这样即使后续输入发生变化,也无法通过梯度更新使该神经元输出恢复到非零状态。这种现象被称为“死神经元”(Dead ReLU)问题,导致该神经元在整个训练过程中失去作用。

     (3)无法捕捉信息
一个“死”神经元不再对任何输入产生响应,从而降低了网络的表达能力和整体性能。

4. 举例说明

例子1:单个神经元输出对比

例子2:深层神经网络中的应用
在一个深度神经网络中,假设某一层大量使用标准 ReLU,部分神经元由于长期接收负输入而“死亡”,导致模型性能下降。如果替换为 Leaky ReLU,即使在负输入区域也能获得微弱梯度,整个网络的训练更加稳定,最终可能得到更高的准确率。

带泄露的 ReLU(Leaky ReLU)通过在 x<0 时输出 αx(而不是0),解决了标准 ReLU 的死神经元问题。它确保在负输入区域仍有微小的梯度传递,从而让神经元有机会在未来恢复激活。通过这个改进,深度神经网络能够更稳定地训练,并提高模型的整体性能。

(二)带参数的 ReLU

PReLU𝑖(𝑥) = = max(0, 𝑥) + 𝛾𝑖 min(0, 𝑥),

带参数的 ReLU(Parametric ReLU,简称PReLU)是一种 ReLU 激活函数的改进版本,其主要区别在于负半轴上的斜率不再固定,而是作为一个可学习的参数。这种设计允许网络在训练过程中自动调整负输入区域的响应程度,从而在一定程度上缓解“死神经元”问题,并提高模型的表达能力。

1. 基本定义

  • 标准 ReLU

    当 x < 0 时,输出为0;当 x≥0 时,输出为 x。

  • 带参数的 ReLU (PReLU)
    定义为:

    其中 α 是一个可学习的参数。
    与 Leaky ReLU 类似,Leaky ReLU 通常固定 α 为一个小值(例如0.01);而 PReLU 则允许 α在训练过程中通过反向传播自动调整,以适应具体任务和数据的需要。

  • 也可以这样理解带参数的 ReLU PReLU

       带参数的 ReLU(Parametric ReLU,PReLU)引入一个可学习的参数,不同神经元可以有不同的参数 .对于第 𝑖 个神经元,      

其中 𝛾_𝑖 为 𝑥 ≤ 0 时函数的斜率.因此,PReLU 是非饱和函数。如果 𝛾_𝑖 = 0,那么 PReLU就退化为ReLU。如果𝛾_𝑖 为一个很小的常数,则PReLU可以看作带泄露的 ReLU。PReLU 可以允许不同神经元具有不同的参数,也可以一组神经元共享一 个参数。

2. 为什么需要带参数的 ReLU

  • 缓解死神经元问题
    在标准 ReLU 中,若神经元长时间接收负输入,其输出恒为0,梯度也为0,导致该神经元无法更新权重(“死神经元”)。PReLU 允许在负区域也有非零梯度(梯度为 α),使得即使在负输入时神经元也能获得更新信号。

  • 自适应学习
    让 α 成为可学习的参数,使得网络可以根据数据自动选择在负区域的最佳激活强度,而不必依赖人工设定的常数。这为网络提供了更大的灵活性,有助于提升模型的性能。

       与Leaky ReLU最大的区别,这个点请注意!!!

  • 提高模型表达能力
    在某些任务中,允许负输入部分有适度的激活(而不是完全屏蔽)能够更好地捕捉数据中的特征分布,从而提高整个网络的表达能力。

3. 举例说明

例子1:单个神经元输出比较

假设输入 x 的取值范围较广,对于某个神经元:

  • 当 x=2 时:

    • 标准 ReLU 输出:ReLU(2)=2
    • PReLU 输出(假设 α=0.2):PReLU(2)=2
      对于正输入,两者输出一致。
  • 当 x=−3 时:

    • 标准 ReLU 输出:ReLU(−3)=0
    • PReLU 输出(α=0.2):PReLU(−3)=0.2×(−3)=−0.6
      这里 PReLU 允许负输入传递一部分信息,同时在反向传播中提供非零梯度(即 0.2),从而有助于该神经元在未来输入变化时能够更新权重。

例子2:深度网络中的应用

在一个深度神经网络中,假设某层使用标准 ReLU,由于训练数据或权重初始化问题,部分神经元可能经常接收负输入,导致它们长时间输出0,无法恢复。如果这一层改为使用 PReLU,尽管负输入仍较低,但神经元输出为 αx(例如 α=0.1),这样即使负输入,神经元也会有微弱的激活,同时反向传播的梯度也不会完全消失。这种机制有助于保持神经元的活跃性,提高整个网络的训练效果和泛化性能。

带参数的 ReLU(PReLU)是一种改进的激活函数,通过将负半轴的斜率设为可学习参数 α,使得神经元在负输入区域仍能保持一定的激活和梯度传递,从而缓解“死神经元”问题,并使网络能够自适应地调整激活行为。
这种灵活性提高了模型的表达能力和训练稳定性,在实际应用中,PReLU 常被用在深度神经网络中,以期达到更好的性能。

4. 单个神经元的激活比较(Leaky ReLU vs PReLU)

例子:

  • 假设一个神经元的输入 x 可能为正也可能为负。

  • 使用 Leaky ReLU(例如 α=0.01):

    • 当 x=−5 时,输出为 0.01×(−5)=−0.05;
    • 当 x=3 时,输出为3。
      这里,负输入处的斜率固定为0.01,无论训练数据如何变化。
  • 使用 PReLU

    • 初始时可能设置 α为0.25,但在训练过程中,网络会根据数据自动调整这个参数。
    • 当 x=−5 时,如果训练过程中认为较小的负斜率更合适,可能最终调整为 α=0.05,输出为 −0.25;或者如果需要更大的斜率,可能调整为 α=0.3,输出为 −1.5。
      这种自适应调整使得模型可以更灵活地处理负输入数据。

(三)ELU 函数

ELU(Exponential Linear Unit,指数线性单元)是一种常用于神经网络中的激活函数,旨在同时获得ReLU的计算效率和缓解“死神经元”及梯度消失问题的优势。其定义通常为:

其中 α 是一个正的超参数,通常设置为1.0。

亦可这样理解,ELU(Exponential Linear Unit,指数线性单元)是一个近似的零中心化的非线性函数:

其中 𝛾 ≥ 0 是一个超参数,决定 𝑥 ≤ 0 时的饱和曲线,并调整输出均值在 0 附近.

如何理解ELU函数

  1. 正区间行为

    • 当 x > 0 时,ELU函数与ReLU函数类似,直接输出 x;
    • 这部分保留了ReLU的简单和高效计算的优点。
  2. 负区间行为

    • 当 x≤0 时,ELU输出为 α(e^x - 1);
    • 对于较大的负输入,e^x 迅速趋近于0,故 ELU(x)→−α;
    • 这意味着函数输出不会一直保持为0,而是趋于一个负的饱和值,从而使得负区间的梯度不为零,缓解了“死神经元”问题,同时保持一定的非线性。
  3. 平滑性和连续性

    • ELU函数在 x=0 处连续且可微,与ReLU相比具有更平滑的梯度,这有助于训练过程中梯度的稳定传递和模型的收敛。
  4. 带来的优势

    • 改善梯度传播:由于在负区间不完全截断梯度,ELU可以在某种程度上缓解梯度消失问题,使得深层网络训练更为稳定。
    • 加快收敛:平滑的负区域和输出的零中心化(因为ELU的输出范围是 (−α,∞) )有助于加速网络收敛。
    • 抗噪声性:通过允许负激活值,ELU为网络提供了更丰富的表达能力和鲁棒性。

举例说明

例子1:数值行为比较

这样可以看出,正区间表现线性,而负区间输出平滑地趋向于-1,而不是突兀地截断为0。

例子2:在神经网络中的应用
在一个深层神经网络中,如果使用标准ReLU,可能会遇到某些神经元在负输入时长期输出0,导致梯度消失,从而影响模型训练。而如果采用ELU函数,即使输入为负,神经元也能输出非零值(接近-α),使得这些神经元在反向传播时仍能接收梯度更新,从而有助于模型在训练过程中保持较好的信息流动和稳定性。
ELU函数通过在正输入时保留线性特性、在负输入时采用指数映射并趋向于一个负饱和值,结合了ReLU的简单高效和改善负区间梯度的优势。它的平滑性和连续性有助于缓解梯度消失问题,加速网络收敛,并在实际应用中提升模型的性能和鲁棒性。

(四)Softplus 函数

Softplus 函数是一种常见的激活函数,定义为:

Softplus 函数其导数刚好是 Logistic 函数。Softplus 函数虽然也具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。

它可以被看作是 ReLU(Rectified Linear Unit)的平滑(光滑)近似,具有以下特点和理解方式:

  1. 平滑性与连续性

    • 与 ReLU 不同,ReLU 在 x=0 处不可导(梯度不连续),而 Softplus 函数是光滑且处处可微的。这使得在某些需要平滑梯度传递的场景中,Softplus 更加合适。
  2. 输出范围与行为

  3. 梯度特点

    • Softplus 的导数为 也就是 Sigmoid 函数。这意味着 Softplus 在反向传播中提供平滑且非零的梯度,有助于缓解梯度消失问题。
  4. 直观理解与应用

    • 可以把 Softplus 想象为“软化”后的 ReLU。ReLU 会硬性地将所有负值截断为0,而 Softplus 则会以平滑的方式逐渐将负值压缩到接近0,同时在正值区域近似保持线性。这种平滑过渡可以使网络在训练过程中更加稳定。
    • 在某些应用中,如深度神经网络中,当需要更平滑的梯度传播或者为了避免在激活函数处产生梯度不连续的问题时,可以选择 Softplus 作为激活函数。

Softplus 函数通过 log(1+e^x) 的形式实现了对 ReLU 的平滑近似,既能在正区间近似线性,又能在负区间平滑地趋近于0,同时保持处处可微。它的梯度正好是 Sigmoid 函数,这为梯度下降和反向传播提供了平滑、稳定的梯度,从而帮助神经网络更高效地学习。

三、ReLU、Leaky ReLU、PReLU、ELU 以及 Softplus 函数的对比

结合图示,通过表格对比如下:

函数名称数学表达式核心特点优点缺点适用场景
ReLUf(x)=max⁡(0,x)简单分段线性1. 计算高效;
2. 缓解梯度消失;
3. 稀疏激活。
1. 负区间梯度为零(神经元死亡);
2. 输出非零中心化。
大多数深度网络(默认选择)
Leaky ReLU引入固定负斜率1. 缓解神经元死亡;
2. 保留计算高效性。
1. 需手动调参 αα;
2. 输出仍非零中心化。
需避免神经元死亡的场景(如GAN)
PReLU参数化负斜率1. 自适应学习负区间斜率;
2. 比Leaky ReLU更灵活。
1. 增加参数量;
2. 可能过拟合。
复杂模型(如深层CNN)
ELU负区间指数平滑1. 输出均值接近零,加速收敛;
2. 缓解神经元死亡。
1. 计算指数复杂度稍高;
2. 需调参 αα。
深层网络或噪声敏感任务
Softplus平滑近似ReLU1. 处处可导;
2. 输出更柔和。
1. 计算复杂(含指数和对数);
2. 梯度衰减快(类似Sigmoid)。
理论分析或需平滑性的模型

选择建议

  • 通用场景:ReLU(简单高效,默认选择)。

  • 防止神经元死亡:Leaky ReLU(轻量)或 ELU(深层网络)。

  • 高性能复杂模型:PReLU(自适应学习负斜率,如ResNet)。

  • 理论平滑性需求:Softplus(实际应用较少)。

  • 噪声敏感任务:ELU(如医疗图像分析)。


http://www.kler.cn/a/565346.html

相关文章:

  • 第12章_管理令牌和会话
  • AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障
  • 提示学习(Prompting)
  • 使用ssh客户端完成Linux远程登录
  • 【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界
  • 网络测试仪在测量传输速率
  • Flutter 学习之旅 之 flutter 使用 webview_flutter 进行网页加载显示
  • 文本数据格式转换备份
  • CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀
  • CSS 媒体查询:从入门到精通,打造跨设备完美体验
  • Python 爬虫实战案例 - 获取社交平台事件热度并进行影响分析
  • WordPress Course Booking System SQL注入漏洞复现 (CVE-2025-22785)(附脚本)
  • DOM Node
  • 51单片机测试题AI作答测试(DeepSeek Kimi)
  • 基于MATLAB的短时傅里叶变换和小波变换及图像处理
  • C++初阶——类与对象(上)
  • 自然语言处理:稀疏向量表示
  • 点云 PCL 滤波在自动驾驶的用途。
  • 第14天:C++异常处理实战指南 - 构建安全的文件解析系统
  • 数据结构☞泛型