1、Sigmoid与双曲正切
当建立神经网络,要做出的选择之一是在隐藏层、输出单元使用什么激活函数。
常见如的Sigmoid函数:
σ ( z ) = 1 1 + e − z . \sigma(z)=\frac {1}{1+e^{-z}}. σ(z)=1+e−z1.
其导数为:
d σ ( z ) d z = 1 1 + e − z ( 1 − 1 1 + e − z ) = σ ( z ) ( 1 − σ ( z ) ) \frac {d\sigma(z)}{dz}=\frac {1}{1+e^{-z}}(1-\frac {1}{1+e^{-z}})=\sigma(z)(1-\sigma(z)) dzdσ(z)=1+e−z1(1−1+e−z1)=σ(z)(1−σ(z))
Sigmoid函数的值域为0到1。激活函数也可以是一个不是Sigmoid的非线性函数。例如双曲(hyperbolic)正切函数:
tanh
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
.
\tanh(z)=\frac {e^{z}-e^{-z}}{e^{z}+e^{-z}}.
tanh(z)=ez+e−zez−e−z.
其导数为:
d tanh ( z ) d z = 1 − tanh 2 ( z ) \frac {d\tanh(z)}{dz}=1-\tanh^2(z) dzdtanh(z)=1−tanh2(z)
事实证明,双曲正切几乎总是比Sigmoid工作的更好,因为它的值域在-1到1之间,并且均值更接近0。
正如有时当你训练学习算法时 ,你可能会将数据中心化。
双曲正切具有中心化数据的能力,它的输出的均值接近0而不是0.5。
反过来,如果上一层数据有0均值,用双曲正切而不是Sigmoid函数是更好的选择:
这实际上使学习下一层变得稍微容易一些。
但是,吴恩达说他在大部分情况下都不会使用Sigmoid。
双曲正切函数几乎总是严格优越于Sigmoid,唯一的例外是输出层:
因为如果输出
y
y
y 为0到1之间的概率,那么有意义的
y
^
\hat y
y^ 也应当是在0到1之间,而不是在-1和1之间。
所以在分类的情况下,使用Sigmoid激活输出层更合理。
所以在这个例子中使用双曲正切作为隐含层的激活函数,使用Sigmoid作为输出层的激活函数。
2、整流线性单元
双曲正切与Sigmoid的共同缺点是:如果
z
z
z 是很大或非常小的,此处的梯度或斜率变得非常小。
所以,如果
z
z
z 是非常大或很小,此处函数的斜率最终会接近0。这会减缓梯度下降。这被称为“梯度消失”。
机器学习中非常流行的另一种激活函数是整流线性单元:
R
e
L
U
(
z
)
=
m
a
x
(
0
,
z
)
.
ReLU(z)=max(0,z).
ReLU(z)=max(0,z).
当
z
z
z 是正的,导数为1;当
z
z
z 是负的,导数为0。
理论上来说0是不可导点,但在计算机实际实现时,在0处的导数为0.00000x,这是一个很小的数值。
在实际工作中,你把0处的导数假装成0或1都好。
这里有选择激活函数的一些经验法则:
如果你将神经网络用于二元分类,Sigmoid则是输出层很自然的选择。
对于其他的隐藏层,用ReLU去激活越来越成为一个默认的选择。
所以,如果你不知道用什么你隐藏层,那么用ReLU激活函数会比较好。大多数人都这么做。
当然人们有时候也用双曲正切激活函数。
ReLU的一个缺点是:当
z
z
z 小于0时,导数为0。
ReLU的另一版本被称为leaky ReLU。它在当
z
z
z 小于0时的导数不是0,而是一个很小的数值。举一个例子,可能是
a
=
max
(
0.01
z
,
z
)
a=\max(0.01z,z)
a=max(0.01z,z)
这通常工作比ReLU激活功能较好,但吴恩达说它们在实践中好像没有被经常使用。
如果必须选择一个,他通常只使用ReLU。
ReLU和leaky ReLU的优点是,
z
z
z 空间的相当大一部分的导数都不趋于0。
因此在实践中,使用ReLU激活函数在训练时要比Sigmoid或者双曲正切快得多。
最主要的原因是,它不会有“梯度消失”现象。
ReLU的值域的一半的斜率为0,但在实践中,有足够多的隐藏单元的
z
z
z 是大于0的。
所以学习过程对于大多数训练样本而言还是很快的。
3、各种激活函数的优劣
吴恩达说他几乎从来不用Sigmoid函数,除了在输出层(如果你正在做的是二元分类)。
原因是因为双曲正切是非常严格的优越于Sigmoid。最常用的激活函数是ReLU。
所以如果你不知道使用什么激活,就使用ReLU,也许有时候还要使用leaky RELU。