Deep Learning中常用的激活函数(activation)
1. sigmoid
表达式:
a = s i g m o i d ( z ) = 1 1 + e − z a = sigmoid(z) = \frac {1} {1 + e^{-z}} a=sigmoid(z)=1+e−z1
函数图像:
适用范围:
\quad
s
i
g
m
o
i
d
sigmoid
sigmoid 函数适用于刚接触机器学习的同学,使用
s
i
g
m
o
i
d
sigmoid
sigmoid函数可以很容易的与逻辑回归等算法结合,进行代价损失函数
J
(
θ
)
J(\theta)
J(θ)的优化。
\quad
对于高阶的深度学习开发者而言, 会很少使用
s
i
g
m
o
i
d
sigmoid
sigmoid 函数作为激活函数,因为有很多其他激活函数,比如,
t
a
n
h
tanh
tanh的表现几乎总是要比
s
i
g
m
o
i
d
sigmoid
sigmoid 好。
\quad
只有在二分类时,最后的输出层才会用
s
i
g
m
o
i
d
sigmoid
sigmoid 函数,因为其函数取值范围为:
0
≤
s
i
g
m
o
i
d
(
z
)
≤
1
0 \leq sigmoid(z) \leq 1
0≤sigmoid(z)≤1。
2. tanh(双曲正切函数)
表达式:
a = t a n h ( z ) = e z − e − z e z + e − z a = tanh(z) = \frac {e^z - e^{-z} } {e^z + e^{-z}} a=tanh(z)=ez+e−zez−e−z
函数图像:
适用范围:
\quad t a n h tanh tanh是较为常用的激活函数,但它的缺点是在导数值接近“0”时,学习速率会降低,这会直接导致更长的训练时间。
3. ReLU(修正线性单元)
表达式:
a = m a x ( 0 , z ) a = max(0, z) a=max(0,z)
函数图像:
适用范围:
\quad
ReLU线性修正单元是目前最为常用和流行的激活函数,尤其是其大量的应用于卷积神经网络中,还有就是,ReLU函数构成简单,易于实现。
\quad
我们从它的函数图像可以看出,在z > 0时,其导数值恒为1,所以,相较于其他激活函数而言,它可以极大的提高训练速度,降低算法的运行时间。
\quad
注
: 当z = 0时,由于此点导数未定义,所以将此点的导数值赋为0或1。
4. Leaky-ReLU(带泄露的ReLU)
表达式:
a = m a x ( 0.01 z , z ) a = max(0.01z, z) a=max(0.01z,z)
函数图像:
适用范围:
\quad Leaky-ReLU能够出现原因是因为,当z < 0时,ReLU的导数值为0,这不利于神经网络进行学习。所以,在z < 0时,为其赋予一定的斜率(导数)。
\quad 如果你问,为什么在z < 0时取斜率值 = 0.01?
\quad 实际上,你可以把这个斜率作为参数输入,但是实际上,很少有人会这么做;所以,如果你想用Leaky-ReLU,那么在z < 0时,取斜率值 = 0.01,即可。
\quad
注
:但,实际上,神经网络中有足够多的隐藏单元使z > 0,所以,在大多数情况下,还是ReLU更加常用。
最后,还要说明的一点是,为什么神经网络一定要使用非线性激活函数?
答:
\quad
根据吴恩达(Andrew Ng)老师的神经网络与深度学习课程中讲到的,如果使用线性激活函数(activation)或者不使用激活函数(activation),那么神经网络只是对输入做线性组合,则只会得到经线性变换
后的函数,无法很好的拟合数据集,无法通过反向传播学习到有趣的函数。
\quad
而且,若习得的函数为线性函数,那么实际上隐藏层并没有做什么,莫不如去除隐藏层,降低训练时间。