深度神经⽹络中常⽤的激活函数的优缺点分析
深度神经⽹络中常⽤的激活函数的优缺点分析
本⽂主要总结了深度神经⽹络中常⽤的激活函数,根据其数学特性分析它的优缺点。
在开始之前,我们先讨论⼀下什么是激活函数(激活函数的作⽤)?
如果将⼀个神经元的输出通过⼀个⾮线性函数,那么整个神经⽹络的模型也就不在是线性的了,这个⾮线性函数就是激活函数。 显然⾮线性函数具有更强的表达能⼒。引⼊⾮线性函数作为激励函数,这样深层神经⽹络表达能⼒(泛化能⼒)就更加强⼤(不再是输⼊的线性组合,⽽是⼏乎可以逼近任意函数)。
1. Sigmoid 函数
Sigmoid函数是传统的神经⽹络和深度学习领域开始时使⽤频率最⾼的激活函数。
Sigmoid函数的数学表达式如下:
其导数为
它的函数图像如下。作为最早开始使⽤的激活函数之⼀, Sigmoid 函数具有如下优点。
连续,且平滑便于求导但是缺点也同样明显。
none-zero-centered(⾮零均值, Sigmoid 函数 的输出值恒⼤于0),会使训练出现 zig-zagging dynamics 现象,使得收敛速度变慢。
梯度消失问题。 由于Sigmoid的导数总是⼩于1,所以当层数多了之后,会使回传的梯度越来越⼩,导致梯度消失问题。⽽且在前向传播的过程中,通过观察Sigmoid的函数图像,当 x 的值⼤于2 或者⼩于-2时,Sigmoid函数的输出趋于平滑,会使权重和偏置更新幅度⾮常⼩,导致学习缓慢甚⾄停滞。
计算量⼤。由于采⽤了幂计算。
建议:基于上⾯Sigmoid的性质,所以不建议在中间层使⽤Sigmoid激活函数,因为它会让梯度消失。
1.2 Hard Sigmoid
f (x )=1+e −x
1
σ(x )=1+e −x
1
f (x )=σ(x )
f (x )=′σ(x )(1−σ(x ))
Hard sigmoid 是⼀种对于 sigmoid 的近似,主要优势是计算速度快,⽆需幂计算,所以当对对于速度要求⾼的情况下,hard sigmoid 是⼀种选择。在具体的实现形式上有多种⽅式,⽐如 pytorch 和 tensorflow 中的实现⽅式就有差别,但是总之都是对于 sigmoid 的⼀种近
似。下图是 tensorflow 中的 hard sigmoid。
linspace函数python
1.3 SiLU ( Sigmoid Linear Unit )
SiLU 也叫 Swish 激活函数,具体参考下⾯的 6.1 Swish 的内容。
2. Tanh 函数
tanh 函数的表达式为:
其倒数为
它们的函数图像如下。
通过观察其函数图像,可以发现它的优点主要是解决了none-zero-centered 的问题,但是缺点依然是梯度消失,计算消耗⼤。但是如果和上⾯的 sigmoid 激活函数相⽐, tanh 的导数的取值范围为(0, 1), ⽽ sigmoid 的导数的取值范围为(0,1/4),显然sigmoid 会更容易出现梯度消失,所以 tanh 的收敛速度会⽐ sigmoid 快。
3. ReLU 系列
3.1 ReLU
ReLU 是 Hinton ⼤神于 2010 在 中提出, 更多关于 ReLU 的介绍可以参考
ReLU 的函数表达式为:
f (x )=⎩⎪⎨⎪⎧0.2∗x +0.50  1  −2.5≤x ≤2.5
x <−2.5
x >2.5
tanh (x )=e +e x −x
e −e x −x
tanh ‘(x )=1−tanh (x )
2Relu (x )=max {0,x }
它的函数图像如下。其优点如下x ⼤于0时,其导数恒为1,这样就不会存在梯度消失的问题计算导数⾮常快,只需要判断 x 是⼤于0,还是⼩于0
收敛速度远远快于前⾯的 Sigmoid 和 Tanh函数缺点none-zero-centered
Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。因
为当x ⼩于等于0时输出恒为0,如果某个神经元的输出总是满⾜⼩于等于0 的话,那么它将⽆法进⼊计算。有两个主要原因可能导致这种情况产⽣:(1) ⾮常不幸的参数初始化,这种情况⽐较少见
(2) learning rate太⾼导致在训练过程中参数更新太⼤,不幸使⽹络进⼊这种状态。解决⽅法是可以采⽤ MSRA 初始化⽅法,以及避免将learning rate设置太⼤或使⽤adagrad等⾃动调节learning rate的算法。
这个激活函数应该是在实际应⽤中最⼴泛的⼀个。
3.2 ReLU6
ReLU6 最早由 Alex(就是提出 AlexNet 的那个 Alex)于2010年提出,具体可以参考 。
ReLU6 仅仅是在 ReLU 的基础上进⾏了 clip 操作,即限制了最⼤输出,⽐较典型的是在 mobile net v1 中有使⽤,可以参考 。
转换为更清晰的形式为:
⽐较有意思的是,为什么是6,不是7或者其他呢?结合原⽂的说明,可能是作者尝试了多种,ReLU6 效果最好。
... First, we cap the units at 6, so our ReLU activation function is y = min(max(x, 0), 6). In our tests, this
encourages the model to learn sparse features earlier. In the formulation of [8], this is equivalent to imagining
that each ReLU unit consists of only 6 replicated bias-shifted Bernoulli units, rather than an infinute amount.
We will refer to ReLU units capped at n as ReLU-n units.
f (x )=min(max(0,x ),6)
f (x )=⎩⎪⎨⎪⎧06x x ≤−3x ≥3otherwise
3.3 Leaky ReLU
Leaky ReLU 由 Andrew L. Maas 等⼈于 2014 年 在 中提出。
Leaky ReLU 函数表达式为
其函数图像为
Leaky ReLU 的提出主要是为了解决前⾯ Relu 提到的 Dead ReLUProblem 的问题,因为当 x ⼩于 0 时,其输出不再是 0.⽽同时 Leaky ReLU 具有 ReLU 的所有优点。听上去貌似很好⽤,只是在实际操作中并没有完全证明好于 ReLU 函数。
这⾥其实还有⼀个⼩的变种 PReLU,其函数表达式如下:
在实际的使⽤中PRelu使⽤的是⽐较多的。需要注意的是,在 pytorch/tensorflow等平台上提供的 leak
y-relu 其实是这⾥的 PReLU 。4 ELU(Exponential Lenear Unit)
ELU 是 Clevert, Djork-Arné 等⼈于 2015 年在 中提出。
ELU 函数表达式为:
f (x )=max {0.01x ,x }
f (x )=max {αx ,x }
f (x )={α(e −1),x ≤0
x x ,x >0
其函数图像为
ELU 主要是对⼩于等于 0 的部分进⾏了改进,使得函数在 x = 0 处可导, ⽽且 使得神经元的平均激活均值趋近为 0,对噪声更具有鲁棒性。
缺点是由于⼜引⼊了指数,计算量增⼤了。
5. SELU(Self_Normalizing Neural Networks)
SELU 函数表达式为:
显然仅仅是在 ELU 的基础上加了⼀个系数。其⽬的据说(是为了使输⼊在经过⼀定层数之后变成固定的分布。
6.Swish 系列
6.1 Swish
Swish 也叫 SiLU 激活函数,其表达式很明了。
Swish 具备⽆上界有下界、平滑、⾮单调的特性,这些都在 Swish 和类似激活函数的性能中发挥有利影响。效果较 ReLU 要好,特别是在较深的⽹络中优势更明显。YOLOV5 1.0 中的激活函数就是 Swish。
6.2 HardSwish f (x )=λ{α(e −1),x ≤0
x x ,x >0
f (x )=x ∗σ(x )  where  σ is  sigmoid  activation  function

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。