激励函数:作用是提供规模化的非线性化能力,使得神经网络可以任意逼近任何非线性函数,模拟神经元被激发的状态变化。如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。目前主要有三种常用的激励函数:
1. Sigmoid激励函数 :也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),可以用来做二分类。
而Sigmoid函数的缺点有:
- 反向传播时,很容易就会出现梯度消失的情况(导数重0开始又消失于0),从而无法完成深层网络的训练。
- 函数输出并不是0均值(zero-centered),输出值恒大于0.
- 幂运算相对来讲比较耗时
2. Thah激励函数 :读作Hyperbolic Tangent,也称为双切正切函数,取值范围为[-1,1]。
thah(x)=2sigmoid(2x)-1
Tanh是Sigmoid的变形,与 sigmoid 不同的是,tanh 是0均值的。但是,梯度消失和幂运算的问题仍然存在。实际应用中,tanh 会比 sigmoid 更好。
3. ReLU激励函数(Rectified Linear Unit):输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入。
优点:
ReLU 使得SGD的收敛速度会比 sigmoid/tanh 快很多。相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值。
ReLU解决了梯度消失的问题。
缺点:
ReLU的输出不是0均值。
learning rate太高导致在训练过程中参数更新太大,训练的时候很容易就”die”了。某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,那么这个神经元的梯度就永远都会是0了。
如何选择合适的激活函数?
1. 一般情况下,使用ReLU会比较好。采用Relu激活函数,整个过程的计算量节省很多。使用 ReLU,就要注意设置 learning rate,不要让网络训练过程中出现很多 “dead” 神经元;如果“dead”无法解决,可以尝试 Leaky ReLU、PReLU 、RReLU等Relu变体来替代ReLU。
2、不建议使用 sigmoid,如果一定要使用,也可以用 tanh来替代,因为后者解决了0均值的输出问题。