激活函数(Activation Function)的特点:
- 非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。
- 可微: 当优化方法是基于梯度的时候,这个性质是必须的。
- 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
- f(x)≈x: 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效。
- 输出值范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的学习率。
-
激活函数 Sigmoid/Tanh/ReLU
Sigmoid 的数学形式:
它能够把输入的连续实值“压缩”到0和1之间。特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
sigmoid 函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它的一些 缺点:
- 当输入非常大或者非常小的时候,这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。
- Sigmoid 的 输出不是0均值,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
Tanh的数学形式:
Tanh是Sigmoid的变形,与 sigmoid 不同的是,tanh 是0均值的。因此,实际应用中,tanh 会比 sigmoid 更好。
ReLU的数学形式:
很显然,从图左可以看出,输入信号<0时,输出都是0,>0 的情况下,输出等于输入。
二维情况下,使用ReLU之后的效果如下:
ReLU 的优点:
- 使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
ReLU 的缺点: 训练的时候很容易就”die”了。
如果这个情况发生了,那么这个神经元的梯度就永远都会是0。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 如果你设置了一个合适的较小的learning rate,这个问题发生的可能性也不大。
ReLU变体(Leaky-ReLU/P-ReLU/R-ReLU):
Leaky ReLU:
Leaky Relu是用来解决ReLU这个 “dead” 的问题的。与 ReLU 不同的是:
这里的 α 是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。
关于Leaky ReLU 的效果,有说好的,也有说不好的。
Parametric ReLU:
对于 Leaky ReLU 中的α,通常都是通过先验知识人工赋值的。
然而可以观察到,损失函数对α的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢?
Kaiming He的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。
原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%.
Randomized ReLU:
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α 是random的)。在训练过程中,
α 是从一个高斯分布 U(l,u) 中 随机出来的,然后在测试过程中进行修正。
选择激活函数的建议:
一般情况下,使用ReLU会比较好
1、使用 ReLU,就要注意设置 learning rate,不要让网络训练过程中出现很多 “dead” 神经元;
2、如果“dead”无法解决,可以尝试 Leaky ReLU、PReLU 、RReLU等Relu变体来替代ReLU;
3、不建议使用 sigmoid,如果一定要使用,也可以用 tanh来替代。