本文总结了深度学习领域最常见的10中激活函数(sigmoid、Tanh、ReLU、Leaky ReLU、ELU、PReLU、Softmax、Swith、Maxout、Softplus)及其优缺点。
激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容。
在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。因此,激活函数是确定神经网络输出的数学方程式。
典型的阶跃函数作为激活函数为例,下图展示了一个神经元是如何喂入激活函数以及如何得到该神经元最终的输出 y ^ \hat{y} y^。
如果不使用激励函数(相当于激励函数是 f ( x ) = x f(x) = x f(x)=x),那么每一层节点的输入都是上层输出的线性函数,无论你神经网络有多少层,输出都是输入的线性组合。不使用激活函数相当于最原始的感知机(Perceptron),也没有隐藏层的效果,那么网络的逼近能力就非常有限。因此,引入非线性函数作为激励函数,能够使深层神经网络表达能力更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
函数表达式为
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
导数为
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma^{\prime}(x)=\sigma(x)(1-\sigma(x)) σ′(x)=σ(x)(1−σ(x))
函数表达式为
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+e−2x2−1=ex+e−xex−e−x
导数为
tanh ′ ( x ) = 1 − tanh 2 ( x ) \tanh^{\prime}(x) = 1 - \tanh^2(x) tanh′(x)=1−tanh2(x)
tanh函数的函数图像和sigmoid的曲线很想,但tanh有一些优点。
Note: 在二分类问题中,一般tanh被用在隐层,而sigmoid被用在输出层。但这不是一成不变的,应当根据网络结构以及问题的特点进行灵活调整。
函数表达式为
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,x≤0
ReLU (Rectified Linear Unit) 函数是目前在深度学习中较其他激活函数更受欢迎的激活函数。与sigmoid和tanh相比,ReLU有如下优点
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,x≥0,x<0,0<a<1
注:理论上,Leaky ReLU具备ReLU的所有优点,而且也没有Dead ReLU问题,但在实际操作中,还没有充分证据证明Leaky ReLU总是优于ReLU。
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α(ex−1),x>0,x≤0
ELU也致力于解决ReLU存在的问题。ELU存在负值并迫使数据均值靠近0,从而避免非0均值带来的降低权值更新效率的问题(参考谈谈激活函数以零为中心的问题)。
ELU不仅拥有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,x≥0,x<0
PReLU是ReLU的一个改进版本。来看看ReLU、Leaky ReLU、PReLU三者的区别:
PReLU优点如下:
softmax一般作为多分类模型的输出层,以输出一个关于类别(离散型)的概率分布。例如:
对于第 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
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)(1−f(x))
详细介绍及其争议:https://zhuanlan.zhihu.com/p/30332306
https://zhuanlan.zhihu.com/p/176988745
y = l o g ( 1 + e x ) y=log(1+e^x) y=log(1+ex)
softplus可以看作是ReLu的平滑。