深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)

摘要

本文总结了深度学习领域最常见的10中激活函数(sigmoid、Tanh、ReLU、Leaky ReLU、ELU、PReLU、Softmax、Swith、Maxout、Softplus)及其优缺点。

前言

什么是激活函数?

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。

在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。因此,激活函数是确定神经网络输出的数学方程式。

典型的阶跃函数作为激活函数为例,下图展示了一个神经元是如何喂入激活函数以及如何得到该神经元最终的输出 y ^ \hat{y} y^
深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第1张图片

为什么需要激活函数?

如果不使用激励函数(相当于激励函数是 f ( x ) = x f(x) = x f(x)=x),那么每一层节点的输入都是上层输出的线性函数,无论你神经网络有多少层,输出都是输入的线性组合。不使用激活函数相当于最原始的感知机(Perceptron),也没有隐藏层的效果,那么网络的逼近能力就非常有限。因此,引入非线性函数作为激励函数,能够使深层神经网络表达能力更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

常见的10种激活函数

1. Sigmoid

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第2张图片
函数表达式为
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
导数为
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma^{\prime}(x)=\sigma(x)(1-\sigma(x)) σ(x)=σ(x)(1σ(x))

什么情况下适合使用Sigmoid?
  1. sigmoid函数的输出范围是0到1。由于输出值在0和1之间,它相当于将每个神经元的输出归一化。
  2. 特别适合用于需要将预测概率作为输出的模型。因为任何概率值的范围是[0,1],而且我们往往希望概率值尽量确定(即概率值远离0.5),所以s型曲线是最理想的选择。
  3. 平滑梯度。显然,sigmoid函数在定义域上处处可导。
  4. sigmoid函数是可微的,这意味着我们可以找到任意两点之间的斜率。
  5. 明确的预测值。也就是说倾向于接近0或1。
Sigmoid有哪些缺点?
  1. 倾向于梯度消失。当输入值 z z z的绝对值过大时,导数很小(远小于1),这将导致梯度消失以及深度神经网络学习能力变差。
  2. 函数输出不以0为中心,这会降低权值更新的效率。具体证明可以参考文章谈谈激活函数以零为中心的问题
  3. sigmoid需要指数运算,计算机运算较慢。

2. Tanh - 双曲正切函数

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第3张图片
函数表达式为
tanh ⁡ ( x ) = 2 σ ( 2 x ) − 1 = 2 1 + e − 2 x − 1 = e x − e − x e x + e − x \tanh(x) = 2\sigma(2x)-1 = \frac{2}{1+e^{-2x}} - 1 = \frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=2σ(2x)1=1+e2x21=ex+exexex
导数为
tanh ⁡ ′ ( x ) = 1 − tanh ⁡ 2 ( x ) \tanh^{\prime}(x) = 1 - \tanh^2(x) tanh(x)=1tanh2(x)

tanh函数的函数图像和sigmoid的曲线很想,但tanh有一些优点。

  1. 当输入过大或过小时,输出几乎是平滑的,梯度小,不利于权值的更新。区别在于输出间隔。tanh的输出区间为1,整个函数以0为中心,优于sigmoid。
  2. 其主要优点是负数输入将被映射为接近-1,而零输入将被映射为tanh图中接近零的地方。

Note: 在二分类问题中,一般tanh被用在隐层,而sigmoid被用在输出层。但这不是一成不变的,应当根据网络结构以及问题的特点进行灵活调整。

3. ReLU (Rectified Linear Unit)

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第4张图片
函数表达式为
R e L U ( x ) = { x , x > 0 0 , x ≤ 0 ReLU(x)= \begin{cases} x&, x>0 \\ 0&, x\le0 \end{cases} ReLU(x)={x0,x>0,x0
ReLU (Rectified Linear Unit) 函数是目前在深度学习中较其他激活函数更受欢迎的激活函数。与sigmoid和tanh相比,ReLU有如下优点

  1. 当输入值为正时,不存在梯度饱和问题(训练过程中,梯度逐渐接近0,导致权重几乎不更新)。
  2. 计算速度快。
    缺点:
  3. Dead ReLU问题。当输入值为负数时,将直接舍弃该输入值并用0代替,这样就导致使用链式求导法则求导时,求到这就中断了(或者说梯度为0)。这个问题在有些领域是敏感的,有些是不敏感的。但是在反向传播过程中,如果输入一个负数,梯度将完全为零,这与sigmoid函数和tanh函数的问题是一样的。
  4. ReLU函数的输出要么为0,要么为正数,这意味着ReLU函数不是以0为中心的函数。

4. Leaky ReLU - 有漏洞的ReLU

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第5张图片
Leaky ReLU试图解决ReLU的缺点。如上图右边图像即为Leaky ReLU。
L e a k y R e L U ( x ) = { x , x ≥ 0 a x , x < 0 , 0 < a < 1 Leaky ReLU(x)= \begin{cases} x&,x\ge0 \\ ax&,x<0, 0LeakyReLU(x)={xax,x0,x<0,0<a<1

  1. Leaky ReLU通过给负数输入一个非常小的线性分量(如 0.01 x 0.01x 0.01x)来调整负数输入的梯度为零的问题。
  2. 漏洞增加了ReLU的范围 ( − ∞ , + ∞ ) (-\infin, +\infin) (,+),通常 a = 0.01 a=0.01 a=0.01

注:理论上,Leaky ReLU具备ReLU的所有优点,而且也没有Dead ReLU问题,但在实际操作中,还没有充分证据证明Leaky ReLU总是优于ReLU。

5. ELU (Exponential Linear Units)

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第6张图片
E L U ( x ) = { x , x > 0 α ( e x − 1 ) , x ≤ 0 ELU(x)= \begin{cases} x&,x>0\\ \alpha (e^x-1)&,x\le0 \end{cases} ELU(x)={xα(ex1),x>0,x0
ELU也致力于解决ReLU存在的问题。ELU存在负值并迫使数据均值靠近0,从而避免非0均值带来的降低权值更新效率的问题(参考谈谈激活函数以零为中心的问题)。

ELU不仅拥有ReLU的所有优点,还有如下:

  1. 没有Dead ReLU问题。
  2. 输出均值接近0,像batch normalization一样,但是具有更低的计算复杂度。同时,均值向零移动,使正常梯度更接近单位自然梯度,从而加快学习速度,因为减少了偏移效应。

6. PReLU (Parametric ReLU)

g ( x ) = { x , x ≥ 0 a x , x < 0 g(x)= \begin{cases} x&,x\ge0 \\ ax&,x<0 \end{cases} g(x)={xax,x0,x<0
PReLU是ReLU的一个改进版本。来看看ReLU、Leaky ReLU、PReLU三者的区别:

  • 如果 a = 0 a=0 a=0,那么上式就是ReLU
  • 如果 a > 0 a>0 a>0,那么上式就是Leaky ReLU
  • 如果 a a a是一个可学习参数,那么上式就是PReLU

PReLU优点如下:

  1. 在负定义域内,PReLU有斜率(梯度),避免了ReLU的Dead ReLU问题。
  2. 相比于ELU,PReLU在负定义域内是线性函数,计算复杂度更低并且梯度不会趋近于0。

7. softmax

softmax一般作为多分类模型的输出层,以输出一个关于类别(离散型)的概率分布。例如:

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第7张图片
对于第 i i i个类别:
f ( x i ) = e x i ∑ k = 1 k = N e x k f(x_i) = \frac{e^{x_i}}{\sum_{k=1}^{k=N} e^{x_{k}}} f(xi)=k=1k=Nexkexi

8. Swish (A Self-Gated)

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第8张图片
Swish函数表达式为
f ( x ) = x ⋅ σ ( x ) f(x)=x \cdot \sigma(x) f(x)=xσ(x)
导数为
f ′ ( x ) = f ( x ) + σ ( x ) ( 1 − f ( x ) ) f^{\prime}(x)=f(x)+\sigma(x)(1-f(x)) f(x)=f(x)+σ(x)(1f(x))

详细介绍及其争议:https://zhuanlan.zhihu.com/p/30332306

9. Maxout

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

10. Softplus

深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)_第9张图片
y = l o g ( 1 + e x ) y=log(1+e^x) y=log(1+ex)
softplus可以看作是ReLu的平滑。

你可能感兴趣的:(深度学习,神经网络,机器学习,激活函数)