一文搞懂激活函数

目录

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]。

  • 30
    点赞
  • 249
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CAN(Controller Area Network,控制器局域网)总线协议是一种广泛应用于工业自动化、汽车电子等领域的串行通讯协议。其帧格式如下: <img src="https://img-blog.csdnimg.cn/20200925125252655.png" width="400"> CAN总线协议的帧分为标准帧和扩展帧两种,其中标准帧包含11位标识符,扩展帧包含29位标识符。在CAN总线上,所有节点都可以同时发送和接收数据,因此需要在帧中包含发送方和接收方的信息。 帧格式的具体解释如下: 1. 帧起始符(SOF):一个固定的位模式,表示帧的起始。 2. 报文控制(CTRL):包含几个控制位,如IDE、RTR等。其中IDE表示标识符的类型,0表示标准帧,1表示扩展帧;RTR表示远程请求帧,0表示数据帧,1表示远程请求帧。 3. 标识符(ID):11位或29位的标识符,用于区分不同的CAN消息。 4. 控制域(CTL):包含几个控制位,如DLC、EDL等。其中DLC表示数据长度,即数据域的字节数;EDL表示数据长度是否扩展,0表示标准数据帧,1表示扩展数据帧。 5. 数据域(DATA):0~8字节的数据。 6. CRC:用于校验数据是否正确。 7. 确认位(ACK):由接收方发送的确认信息,表示数据是否正确接收。 8. 结束符(EOF):一个固定的位模式,表示帧的结束。 以上就是CAN总线协议的帧格式。在实际应用中,节点之间通过CAN总线进行数据交换,通过解析帧中的各个字段,可以判断消息的发送方、接收方、数据内容等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值