一文搞懂激活函数

article/2025/9/27 8:27:48

目录

1、什么是激活函数

2、激活函数的用途(为什么需要激活函数)?

3、常见的激活函数介绍

3.1 Sigmoid函数

3.2 tanh函数

3.3.RelU函数

3.4 Leaky ReLU函数 和 PReLU 函数 --- ReLU 变体的提出

3.5 ELU (Exponential Linear Units) 函数

3.6 Swish, SiLU

3.7 hard-Swish

3.8 Mish激活函数

​编辑

4、应用中如何选择合适的激活函数?


1、什么是激活函数

     神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

2、激活函数的用途(为什么需要激活函数)?

1. 对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希望的输出是一个概率       

2、线性的表达能力太有限了:  如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,即使经过多层网络的叠加,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。

总结,激活函数的作用: 激活函数是用来加入非线性因素的,因为线性模型的表达能力不够,引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)

当然,激活函数需要满足一下要求:

  1. 非线性,这样增加网络的深度才有意义

  2. 可导的,不然怎么做梯度下降

  3. 易于计算的

  4. 输出空间最好是有限的,这条好像也不是必须的,Relu就没有遵循这条

3、常见的激活函数介绍

     常用的激活函数SigmoidTanhReLULeaky-ReLUP-ReLUELU ,还有一些他们的变体以及其他的函数

总览图:

3.1 Sigmoid函数

sigmod 函数图形:

sigmoid激活函数
sigmoid函数导数

         Sigmoid函数是传统神经网络中最常用的激活函数,虽然现在已经不常用,但当年还是十分受欢迎的。Sigmoid函数也叫Logistic 函数,值域在0到1之间。

Sigmoid函数的表达式及其求导:

特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,当x的值趋近负无穷的时候,y趋近于0;x趋近于正无穷的时候,y趋近于1。在 [−2,2]  区间内,梯度变化比较明显,即x发生很小的变化,y变化的也比较明显。

sigmoid的优缺点:

优点:

  • Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定
  • 求导容易

缺点:

缺点1:容易出现梯度弥散,反向传播时,很容易就会出现梯度消失和梯度爆炸的情况,从而无法完成深层网络的训练,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。

        如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍(由sigmod导数图知道,梯度值最少减小为原来的0.25倍),如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为(1,+∞) 区间内的值,则会出现梯度爆炸情况。

缺点2:Sigmoid 的 output 不是0均值(即zero-centered,不是以0为中心),导致收敛速度下降。

             为什么要以0为中心,参考这里:谈谈激活函数以零为中心的问题

                                                        参考2:训练深度神经网络尽量使用zero-centered数据呢? - 知乎

         这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x > 0,  f= wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。

缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

3.2 tanh函数

tanh 函数图形

tanh激活函数                                                                                          tanh函数导数

tanh函数的表达式及其求导:

求导

tanh函数的优缺点:

解决了Sigmoid函数的不是zero-centered输出问题。

但是梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

3.3.RelU函数

参考: ReLU激活函数 - 知乎

tanh 函数图

ReLu激活函数                                                                                                  ReLu函数导数

ReLu (Rectified Linear Unit)修正线性单元函数,函数的表达式:

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,

ReLu有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2) 计算速度非常快,只需要判断输入是否大于0
3) 梯度不饱和,
收敛速度远快于sigmoid和tanh

ReLU的缺点:
1)ReLU的输出不是zero-centered ,ReLU的输出均值大于0,影响网络收敛
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,影响网络收敛。
有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 。 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。 解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

3)对参数初始化和学习率非常敏感

尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

      从ReLu图上可以看出,当 x ≤ 0 的时候,ReLu有饱和问题,当 x > 0的时候,则存在硬饱和(当x<0时,导数恒等于0;软饱和:导数趋近于0)。所以当 x > 0 的时候不会存在梯度消失的问题。为了解决左硬饱和问题,提出了Leaky ReLU、PReLU解决方法。

3.4 Leaky ReLU函数 和 PReLU 函数 --- ReLU 变体的提出

Leaky ReLu 图:

函数表达式:

 为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 αx 而非0,通常 α=0.01,即Leaky ReLU。另外一种直观的想法是基于参数的方法,即PReLU,其形式Leaky ReLU想同,不同点是其中的α可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

使用Leaky ReLU作为激活函数的优点就是在反向传播过程中也可以计算输入小于零部分的梯度,而不是像ReLU激活函数对于输入小于零部分的计算得到的梯度值为0,这样就避免了梯度方向锯齿问题。

Leaky ReLU 优点:

  1)Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度;

  2)由于不包含指数运算,所以计算速度比 ELU 快。

Leaky ReLU 缺点:

   1)无法避免梯度爆炸问题;

   2)神经网络不学习 α 值;

   3)在微分时,两部分都是线性的;而 ELU 的一部分是线性的,一部分是非线性的。

3.5 ELU (Exponential Linear Units) 函数

RLU 函数图:

ELU激活函数                                                                                          ELU函数导数

ELU函数表达式:

ELU也是为解决ReLU存在的问题而提出,由导数图可以看出,这里成功避开了死亡 ReLU 问题,同时仍保有 ReLU 激活函数的一些计算速度增益——也就是说,网络中仍还有一些死亡的分量(在[-5 , 负无穷] 区域,导数接近为0)。

优点:

   1)不会有Dead ReLU问题

   2)输出的均值接近0,zero-centered 。 能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化

缺点:

   1)由于包含指数运算,所以计算量稍大;

   2)无法避免梯度爆炸问题;

   3)神经网络不学习 α 值。

  理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

3.6 Swish, SiLU

激活函数(ReLU, Swish, Maxout) - 康行天下 - 博客园

Swish激活函数具备无上界有下届、平滑、非单调的特性,Swish在深层模型上效果优于ReLU。

Swish函数只有在更深的网络层使用才能体现其优势

表达式:

 β是个常数或者可训练的参数,当β=1时,我们也称作SiLU激活函数。

导数图:

3.7 hard-Swish

该激活函数在MobileNetV3论文中提出,相较于swish函数,具有数值稳定性好,计算速度快等优点。

表达式:

 

 或者好理解一些:

 hardswish激活函数是对swish激活函数 的改进,因为swish非线性激活函数作为ReLU非线性激活函数的替代,在一定程度上可以提高神经网络的准确性。尽管swish非线性激活函数提高了检测精度,但不适合在嵌入式移动设备上使用,因为“S”型函数在嵌入式移动设备上的计算成本更高,求导较为复杂,在量化时计算较慢。在实验中使用hardswish非线性激活函数在准确性上没有明显差别,但从部署在嵌入式移动设备上而言具有多重优势。首先,几乎所有软件和硬件框架都提供了ReLU的优化实现。其次,在量化模式下,它消除了由于近似Sigmoid形的不同实现而导致的潜在数值精度损失。最后,在实践中,hardswish激活函数可以实现为分段功能,以减少内存访问次数,从而大大降低了等待时间成本。

3.8 Mish激活函数

https://zhuanlan.zhihu.com/p/152333029

Mish激活函数是Diganta Misra等人提出的一种平滑的非单调的激活函数。其数学表达式:

   函数图:

Mish激活函数主要有一下四个特点:无上界、有下界、平滑、非单调。这四个特性提高了函数的性能。

Mish的性能详细说明如下:

  1. 无上界有下界:无上界是任何激活函数都需要的特性,因为它避免了导致训练速度急剧下降的梯度饱和。因此,加快训练过程。无下界属性有助于实现强正则化效果(适当的拟合模型)。(Mish的这个性质类似于ReLU和Swish的性质,其范围是[≈0.31,∞))                               无上限:它可以防止网络饱和,即梯度消失。有下界:提高网络的正则化效果。
  2. 非单调函数:这种性质有助于保持小的负值,从而稳定网络梯度流。大多数常用的激活函数,如ReLU [f(x) = max(0, x)], Leaky ReLU [f(x) = max(0, x), 1],由于其差分为0,不能保持负值,因此大多数神经元没有得到更新。
  3. 无穷阶连续性和平滑性:Mish是光滑函数,具有较好的泛化能力和结果的有效优化能力,可以提高结果的质量。在图中,可以看到ReLU和Mish之间的一个随机初始化的神经网络在宏观平滑度上的剧烈变化。然而,在Swish和Mish的情况下,宏观上或多或少还是相似的。
  4. 与ReLU相比,在0值点连续可以减少一些不可预测的问题。它可以使网络更容易优化,提高泛化性能,一些较小的负输入可以保留为负输出,以提高网络的可解释性和梯度流。

4、应用中如何选择合适的激活函数?

这个问题目前没有确定的方法,凭一些经验吧。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

5、一个激活函数需要具有哪些必要的属性?

1. 非线性:即导数不是常数。这个条件是多层神经网络的基础,保证多层网络不退化成单层线性网络。这也是激活函数的意义所在。

2. 几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU,只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响[1]。

3. 计算简单:非线性函数有很多。极端的说,一个多层神经网络也可以作为一个非线性函数,类似于Network In Network[2]中把它当做卷积操作的做法。但激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。

4. 非饱和性(saturation):饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。最经典的例子是Sigmoid,它的导数在x为比较大的正值和比较小的负值时都会接近于0。更极端的例子是阶跃函数,由于它在几乎所有位置的梯度都为0,因此处处饱和,无法作为激活函数。ReLU在x>0时导数恒为1,因此对于再大的正值也不会饱和。但同时对于x<0,其梯度恒为0,这时候它也会出现饱和的现象(在这种情况下通常称为dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是为了解决这一问题。

5. 单调性(monotonic):即导数符号不变。这个性质大部分激活函数都有,除了诸如sin、cos等。个人理解,单调性使得在激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。

6. 输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH。但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。因此现在这类函数仅用于某些需要特定输出范围的场合,比如概率输出(此时loss函数中的log操作能够抵消其梯度消失的影响[1])、LSTM里的gate函数。

7. 接近恒等变换(identity):即约等于x。这样的好处是使得输出的幅值不会随着深度的增加而发生显著的增加,从而使网络更为稳定,同时梯度也能够更容易地回传。这个与非线性是有点矛盾的,因此激活函数基本只是部分满足这个条件,比如TanH只在原点附近有线性区(在原点为0且在原点的导数为1),而ReLU只在x>0时为线性。这个性质也让初始化参数范围的推导更为简单[5][4]。额外提一句,这种恒等变换的性质也被其他一些网络结构设计所借鉴,比如CNN中的ResNet[6]和RNN中的LSTM。

8. 参数少:大部分激活函数都是没有参数的。像PReLU带单个参数会略微增加网络的大小。还有一个例外是Maxout[7],尽管本身没有参数,但在同样输出通道数下k路Maxout需要的输入通道数是其它函数的k倍,这意味着神经元数目也需要变为k倍;但如果不考虑维持输出通道数的情况下,该激活函数又能将参数个数减少为原来的k倍。

9. 归一化(normalization):这个是最近才出来的概念,对应的激活函数是SELU[8],主要思想是使样本分布自动归一化到零均值、单位方差的分布,从而稳定训练。在这之前,这种归一化的思想也被用于网络结构的设计,比如Batch Normalization[9]。


http://chatgpt.dhexx.cn/article/U1TgvWIh.shtml

相关文章

激活函数(Relu,sigmoid,Tanh,softmax)详解

目录 1 激活函数的定义 2 激活函数在深度学习中的作用 3 选取合适的激活函数对于神经网络有什么样的重要意义 4 常用激活函数 4.1 Relu 激活函数 4.2 sigmoid 激活函数 4.3 Tanh激活函数 4.4 softmax 激活函数 1 激活函数的定义 激活函数&#xff08;Activation Funct…

激活函数(Activation Function)

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗的理解一下激活函数(图文结合) 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳定问题 2.3 产生梯度消…

常用的激活函数合集(详细版)

目录 一、定义以及作用 二、常用激活函数解析 1、Sigmoid函数 1.1 公式 1.2 对应的图像 1.3 优点与不足之处 1.4 对应pytorch的代码 2、Tanh函数 2.1 公式 2.2 对应的图像 2.3 优点与不足之处 2.4 对应pytorch的代码 3、ReLU 3.1 公式 3.2 对应的图像 3.3 优点与不…

优化算法——FTRL

ctr预测中&#xff0c;单个样本由向量x表示&#xff0c;w是模型参数&#xff0c;预测样本x被点击的概率psigmoid(w * x)&#xff0c;sigmoid(x) 1/(1exp(x))。样本label为{0, 1}表示是否被点击。模型损失函数为交叉熵损失&#xff1a; L -ylog - (1-y)log(1-p)&#xff0c;梯…

【深度学习】优化算法-Ftrl

脑图 代码实现 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSEVersion 2, December 2004Copyright (C) 2004 Sam Hocevar <samhocevar.net>Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is all…

谷歌13年提出来的类似于lr的算法 - ftrl论文翻译(七)

论文链接&#xff1a;https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/41159.pdf 概要 预测广告点击率&#xff08;CTR&#xff09;是一个巨大的规模学习问题&#xff0c;是在线广告业数十亿美元的核心问题。 我们从最近的实验中选择出…

FTRL 算法

本文会尝试总结FTRL的发展由来&#xff0c;总结从LR -> SGD -> TG -> FOBOS -> RDA -> FTRL 的发展历程。本文的主要目录如下&#xff1a; 一、 反思魏则西事件。 二、 LR模型 三、 SGD算法 四、 TG算法 五、 FOBOS算法 六、 RDA算法 七、 FTRL算法 注&…

排序模型进阶-FMFTRL

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; 5.8 排序模型进阶-FM&FTRL 学习目标 目标 无应用 无 5.8.1 问题 在实际项目的时候&#xff0c;经常会遇到训练数据非常大导致一些算法实际…

以我视角深入理解FTRL模型原理

以我视角深入理解FTRL模型原理 FTRL算法是吸取了FOBOS算法和RDA算法的优点而衍生而来的算法。 1.FOBOS算法 小结&#xff1a; 2. RDA算法 RDA也叫正则对偶平均算法&#xff0c;特征权重更新如下&#xff1a; 小结&#xff1a; 3.FTRL算法原理 从loss function的形式来看&am…

FTRL实战之LR+FTRL(代码采用的稠密数据)

理解要点&#xff1a;主要是梯度更新的方法使用了FTRL。即更改了梯度的update函数。 相关参考&#xff1a;https://github.com/wan501278191/OnlineLearning_BasicAlgorithm/blob/master/FTRL.py FTRL&#xff08;Follow The Regularized Leader&#xff09;是一种优化…

DL基本知识(七)FTRL优化器

契机 最近工作方向为缩减模型规模&#xff0c;切入点为L1正则化&#xff0c;选择该切入点的理由如下&#xff0c; 众所周知&#xff0c;L1正则化能令权重矩阵更稀疏。在推荐系统中特征多为embedding&#xff0c;权重矩阵稀疏意味着一些embedding_weight为0&#xff0c;模型部…

FTRL算法详解

一、算法原理 二、算法逻辑 三、个人理解 从loss function的形式来看&#xff1a;FTRL就是将RDA-L1的“梯度累加”思想应用在FOBOS-L1上&#xff0c;并施加一个L2正则项。【PS&#xff1a;paper上是没有加L2正则项的】这样达到的效果是&#xff1a; 累积加和限定了新的迭代结果…

FTRL算法理解

本文主要是对FTRL算法来源、原理、应用的总结和自己的思考。 解决的问题 1、训练数据层面&#xff1a;数据量大、特征规模大 2、常用的LR和FM这类模型的参数学习&#xff0c;传统的学习算法是batch learning算法&#xff0c;无法有效地处理大规模的数据集&#xff0c;也无法…

ftrl 流式更新 java_深入理解FTRL

FTRL算法是吸取了FOBOS算法和RDA算法的两者优点形成的Online Learning算法。读懂这篇文章&#xff0c;你需要理解LR、SGD、L1正则。 FOBOS算法 前向后向切分(FOBOS&#xff0c;Forward Backward Splitting)是 John Duchi 和 Yoran Singer 提出的。在该算法中&#xff0c;权重的…

排序模型-FTRL

排序模型进阶-FTRL 1 问题 在实际项目的时候&#xff0c;经常会遇到训练数据非常大导致一些算法实际上不能操作的问题。比如在推荐行业中&#xff0c;因为DSP的请求数据量特别大&#xff0c;一个星期的数据往往有上百G&#xff0c;这种级别的数据在训练的时候&#xff0c;直接…

FTRL代码实现

FTRL&#xff08;Follow The Regularized Leader&#xff09;是一种优化方法&#xff0c;就如同SGD&#xff08;Stochastic Gradient Descent&#xff09;一样。这里直接给出用FTRL优化LR&#xff08;Logistic Regression&#xff09;的步骤&#xff1a; 其中ptσ(Xt⋅w)ptσ(X…

FTRL算法

概述 GBDT算法是业界比较好用筛选特征的算法&#xff0c;在线学习考虑效率和数据量&#xff0c;经常用GBDT离线筛选特征&#xff0c;输入到在线模型进行实时训练&#xff0c;如今比较好用的方法是GBDTLR&#xff0c;而FTRL是另外一种很高效的算法&#xff0c;与其类似的有OGD&…

FTRL-Proximal

Ad Click Prediction: a View from the Trenches ABSTRACT 广告点击率预测是一个大规模的学习问题&#xff0c;对数十亿美元的在线广告行业至关重要。我们从部署的CTR预测系统的设置中提供了一些案例研究和从最近的实验中提取的话题&#xff0c;包括基于FTRL-Proximal在线学习…

FTRL

一、算法原理 二、算法逻辑 三、个人理解 从loss function的形式来看:FTRL就是将RDA-L1的“梯度累加”思想应用在FOBOS-L1上,并施加一个L2正则项。【PS:paper上是没有加L2正则项的】 这样达到的效果是: 累积加和限定了新的迭代结果W**不要离“已迭代过的解”太远**; 因为…

在线学习算法FTRL基本原理

文章目录 相关介绍SGD: Stochastic Gradient DescentTG简单加入L1范数简单截断法梯度截断法 FOBOS: Forward Backward Splitting[^4]RDA: Regularized dual averaging[^5] FTRL: Follow-the-Regularized-Leader总结 相关介绍 SGD: Stochastic Gradient Descent 由于批量梯度下…