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