DeepLearning: 归纳几种常用的激活函数(activation)

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}}

函数图像:

在这里插入图片描述

适用范围:

\quad s i g m o i d sigmoid 函数适用于刚接触机器学习的同学,使用 s i g m o i d sigmoid 函数可以很容易的与逻辑回归等算法结合,进行代价损失函数 J ( θ ) J(\theta) 的优化。
\quad 对于高阶的深度学习开发者而言, 会很少使用 s i g m o i d sigmoid 函数作为激活函数,因为有很多其他激活函数,比如, t a n h tanh 的表现几乎总是要比 s i g m o i d sigmoid 好。
\quad 只有在二分类时,最后的输出层才会用 s i g m o i d sigmoid 函数,因为其函数取值范围为: 0 s i g m o i d ( z ) 1 0 \leq sigmoid(z) \leq 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}}

函数图像:

在这里插入图片描述

适用范围:

\quad t a n h tanh 是较为常用的激活函数,但它的缺点是在导数值接近“0”时,学习速率会降低,这会直接导致更长的训练时间。

3. ReLU(修正线性单元)

表达式:

a = m a x ( 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)

函数图像:

在这里插入图片描述

适用范围:

\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 而且,若习得的函数为线性函数,那么实际上隐藏层并没有做什么,莫不如去除隐藏层,降低训练时间。

\quad 因此,在神经网络中一定要使用非线性激活函数,才能更好的拟和数据集,这样,神经网络才能学到有趣的东西。