常用激活函数的优缺点

非线性激活函数是深度学习网络重要的组成部分,随着近几年的快速发展,越来越多的激活函数被提出与改进。选择一个合适的激活函数将决定了模型的最终结果。下文总结了13种常见的激活函数的计算方式与对应图像,文中的计算方式来自于pytorch。


1.Sigmoid

这是一款比较早的激活函数,其计算公式如下所示:

a0f18793ada9a92d7f7152cd82aac616.png

其图示如下:

e1f0517ce6d38715fc5eeb14ad014eea.png

优点:

  1. Sigmoid函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层。

  2. 连续函数,便于求导。

缺点:

  1. 需要幂运算,计算成本高。

  2. 输出不是以0为均值的,导致收敛速度下降。

  3. 容易出现梯度弥散,在反向传播时,当梯度接近于0,权重基本不会更新,从而无法完成深层网络的训练。

2.LogSigmoid

其计算公式如下所示:

3b3f929667b07dc4985ceac48f5e0eb6.png

其图示如下:

c6c3284490077fe94251ad802214c917.png

3.Relu

深度神经网络中最常用的激活函数之一,其计算公式如下所示:

0b79dc6cb246fdd727210262a27eefa7.png

其图示如下:

f5bcb8070686da76002e24caf94fe8a2.png

优点:

  1. 在x>0区域上,不会出现梯度饱和、梯度消失的问题,收敛速度快。

  2. 不需要进行指数运算,因此运算速度快,复杂度低。

缺点:

  1. 输出的均值非0.

  2. 存在神经元死亡,在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。

4.LeakyRelu

上述的Relu对x小于0的情况均输出0,而LeakyRelu在x小于0时可以输出非0值,其计算公式如下所示:

3963887e1e7af58deb8c84b1ffd6a431.png

其图示如下:

030fab5d6d901c12c6bdf05e4d400c2a.png

优点:

  1. 解决了Relu的神经元死亡问题问,在负区域具有小的正斜率,因此即使对于负输入值,它也可以进行反向传播。

  2. 具有Relu函数的优点。

缺点:

  1. 结果不一致,无法为正负输入值提供一致的关系预测

5.Elu

同样是针对ReLU的负数部分进行的改进,ELU激活函数对x小于零的情况采用类似指数计算的方式进行输出,其计算公式如下所示:

fa47d792fc85fad61fb5448258fdfdd6.png

其图示如下:

a8c2a063087562b8e8be42cd228b0bd3.png

优点:

  1. 在所有点上都是连续可微的。

  2. 与其他线性非饱和激活函数(如Relu及其变体)相比,有着更快的训练时间。

  3. 没有神经元死亡的问题。

  4. 作为非饱和激活函数,它不会遇到梯度爆炸或消失的问题,并且拥有更高的准确性。

缺点:

  1. 涉及到幂运算,计算速度较慢。

6.PRelu

其中a不是固定的,是通过反向传播学习出来的。其计算公式如下所示:

7de0b1c6a4c460619432d8dab9e460fc.png

其图示如下:

f76012d6131679867334ec3d1714c99d.png

7.Relu6

Relu6限制Relu的的输出不超过6,其计算公式如下所示:

752298b165b165cb5e7a6059f4acb3a2.png

其图示如下:

5c90525425464716349a1391d16c8d87.png

Relu在x>0的区域使用x进行线性激活,有可能造成激活后的值太大,影响模型的稳定性,为抵消ReLU激励函数的线性增长部分,可以使用Relu6函数。

8.RRelu

“随机纠正线性单元”RRelu也是LeakyRelu的一个变体。在RRelu中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。其计算公式如下所示:

2092995cafec843dd0975534af998ff1.png

其图示如下:

d401941e2cf4bd5b2638309ec58184c4.png

9.SElu

SElu和Elu的形式比较类似,但是多出一个scale参数。其计算公式如下所示:

5b9367992ce9ccf2cdf7c7743a609df9.png

其图示如下:

0ba2018c719e89813382e8b472ba8752.png

pytorch中acale=1.0507009873554804934193349852946。

10.CElu

与上述的SElu类似,CElu同样采用负数区间为指数计算,整数区间为线性计算,其计算公式如下所示:

0b14c49e5cbe5b709473b3dd38a91f3a.png

其图示如下:

f7fa85c85894e25ad70ff292defa0c52.png

11.GElu

在激活函数中加入正则化的方式,其计算公式如下所示:

64371c9908b452f37037e2c032da8990.png

因为erf无解析表达式,原论文给出了近似解。

cb3cee8a105ad0cf905435f23bf0fa6b.png

其图示如下:

9a6739456f68aa64d83b792d99907a47.png

12.Tanh

数学中的双曲正切函数Tanh也是一种神经网络常用的激活函数,尤其是用于图像生成任务的最后一层,其计算公式如下所示:

4dfb02095e095b76e1afbff08be4cdb4.png

其图示如下:

a65d1036068f5a518cc0310a659faa56.png

优点:

  1. 输出均值为0,使其收敛速度要比sigmoid快,可以减少迭代次数。

缺点:

  1. 它的缺点是需要幂运算,计算成本高

  2. 同样存在梯度消失,因为在两边一样有趋近于0的情况。

13.Tanhshrink

Tanhshrink直接采用输入减去双曲正切值,其计算公式如下所示:

9affe1eada6fe6b2688a973f6595a238.png

其图示如下:

60111e3f381d3d2f897843b9faff69b4.png

总结:

首先使用ReLU,速度最快,然后观察模型的表现。

如果ReLU效果不是很好,可以尝试LeakyRelu等变种

在深度不是特别深的CNN中,激活函数的影响一般不会太大。

猜你喜欢

转载自blog.csdn.net/weixin_41202834/article/details/121173761