1.3.2【Deep Learning翻译系列】Activation Functions 激活函数

1、Sigmoid与双曲正切

当建立神经网络,要做出的选择之一是在隐藏层、输出单元使用什么激活函数。
常见如的Sigmoid函数:

σ ( z ) = 1 1 + e z . \sigma(z)=\frac {1}{1+e^{-z}}.

其导数为:

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

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

其导数为:

d tanh ( z ) d z = 1 tanh 2 ( z ) \frac {d\tanh(z)}{dz}=1-\tanh^2(z)

事实证明,双曲正切几乎总是比Sigmoid工作的更好,因为它的值域在-1到1之间,并且均值更接近0。
正如有时当你训练学习算法时 ,你可能会将数据中心化。
双曲正切具有中心化数据的能力,它的输出的均值接近0而不是0.5。
反过来,如果上一层数据有0均值,用双曲正切而不是Sigmoid函数是更好的选择:
这实际上使学习下一层变得稍微容易一些。

但是,吴恩达说他在大部分情况下都不会使用Sigmoid。
双曲正切函数几乎总是严格优越于Sigmoid,唯一的例外是输出层:
因为如果输出 y y 为0到1之间的概率,那么有意义的 y ^ \hat y 也应当是在0到1之间,而不是在-1和1之间。

所以在分类的情况下,使用Sigmoid激活输出层更合理。
所以在这个例子中使用双曲正切作为隐含层的激活函数,使用Sigmoid作为输出层的激活函数。

2、整流线性单元

双曲正切与Sigmoid的共同缺点是:如果 z z 是很大或非常小的,此处的梯度或斜率变得非​​常小。
所以,如果 z z 是非常大或很小,此处函数的斜率最终会接近0。这会减缓梯度下降。这被称为“梯度消失”。
机器学习中非常流行的另一种激活函数是整流线性单元:
R e L U ( z ) = m a x ( 0 , z ) . ReLU(z)=max(0,z).

z z 是正的,导数为1;当 z z 是负的,导数为0。
理论上来说0是不可导点,但在计算机实际实现时,在0处的导数为0.00000x,这是一个很小的数值。
在实际工作中,你把0处的导数假装成0或1都好。

这里有选择激活函数的一些经验法则:
如果你将神经网络用于二元分类,Sigmoid则是输出层很自然的选择。
对于其他的隐藏层,用ReLU去激活越来越成为一个默认的选择。

所以,如果你不知道用什么你隐藏层,那么用ReLU激活函数会比较好。大多数人都这么做。
当然人们有时候也用双曲正切激活函数。

ReLU的一个缺点是:当 z z 小于0时,导数为0。
ReLU的另一版本被称为leaky ReLU。它在当 z z 小于0时的导数不是0,而是一个很小的数值。举一个例子,可能是 a = max ( 0.01 z , z ) a=\max(0.01z,z)
这通常工作比ReLU激活功能较好,但吴恩达说它们在实践中好像没有被经常使用。
如果必须选择一个,他通常只使用ReLU。

ReLU和leaky ReLU的优点是, z z 空间的相当大一部分的导数都不趋于0。
因此在实践中,使用ReLU激活函数在训练时要比Sigmoid或者双曲正切快得多。
最主要的原因是,它不会有“梯度消失”现象。

ReLU的值域的一半的斜率为0,但在实践中,有足够多的隐藏单元的 z z 是大于0的。
所以学习过程对于大多数训练样本而言还是很快的。

3、各种激活函数的优劣

afunc
吴恩达说他几乎从来不用Sigmoid函数,除了在输出层(如果你正在做的是二元分类)。
原因是因为双曲正切是非常严格的优越于Sigmoid。最常用的激活函数是ReLU。
所以如果你不知道使用什么激活,就使用ReLU,也许有时候还要使用leaky RELU。

猜你喜欢

转载自blog.csdn.net/u014625530/article/details/84587887