Deep Learning -- Activation Function
原文站点:https://senitco.github.io/2017/09/05/deep-learning-activation-function/
神经网络的**函数(activation function)通过引入非线性因素,使得网络可以逼近任何非线性函数,提高网络模型的表达能力,更好地解决复杂问题。
Overview
**函数通常具有以下性质:
- 非线性:使用非线性**函数的多层神经网络可以逼近所有函数
- 可微性:对于常见的优化方法——梯度下降法,可微性是必要的
- 单调性:单调**函数能够保证单层网络是凸函数
- 输出范围:**函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当输出值的范围无界时,模型训练会更加高效,不过这种情况下一般需要更小的学习率(learning rate),以保证收敛
Sigmoid
Sigmoid的数学公式为
Sigmoid函数曾被广泛使用,但现在使用较少,主要是存在以下缺点:
- 函数饱和造成梯度消失(Sigmoids saturate and kill gradients):神经元的**值在趋近0或1时会饱和,在这些区域梯度值几乎为0,而且梯度值非0的输入范围非常有限。在反向传播时,此处局部梯度值将与损失函数关于该神经元输出的梯度相乘,如果局部梯度非常小,那么相乘的结果也会趋近于0,造成梯度消失,使得前面网络的权值参数无法更新。为了防止饱和,初始化权重不易过大,否则大多数神经元将会饱和,导致网络难以学习。
- Sigmoid输出不是0均值(Sigmoid outputs are not zero-centered):这一性质会导致后面网络层得到的输入数据不是零中心的,影响梯度下降的运作。因为如果输入神经元的数据总是正数(比如在
此外,Sigmoid函数涉及到指数运算,增加了计算量。
tanh
双曲正切函数的数学表达式为
tanh函数同样存在饱和和梯度消失问题,但输出是0均值的,因此在一定程度上,性能略优于Sigmoid。
Rectified Linear Units(ReLU)
ReLU应用较为广泛,其数学表达式为
ReLU**函数主要有如下优缺点:
- (+)相比于Sigmoid和tanh,ReLU对于随机梯度下降(SGD)的收敛有显著的加速作用(在AlexNet中,比tanh收敛快6倍)。据称这是由其(分段)线性、非饱和导致的
- (+)Sigmoid、tanh包含指数运算,耗费计算资源,而ReLU通过和阈值比较即可得到**值,不涉及复杂运算
- (-)ReLU的缺点是在训练时神经元比较脆弱,可能会“死掉”。当一个很大的梯度反向传播经过ReLU神经元时,可能会导致权值更新过后,对任何数据都不再出现**现象,所有流过该神经元的梯度都将变为0。也就是说,ReLU单元在训练中将不可逆转的死亡,导致数据多样性的丢失。实际上,如果学习率设置得过高,网络中约40%的神经元都会死掉,在整个训练集中都不会再**。因此需要合理设置学习率。
leaky-ReLU、P-ReLU、R-ReLU、ELU
leaky-ReLU是用于解决ReLU中神经元死亡的尝试方案,其数学公式如下:
在训练过程中,
Maxout
Maxout源于大神Goodfellow在2013年发表的一篇论文Maxout Network,可以将其看作网络中的**函数层。假设网络某一层的输入特征向量为
式中,
论文中给出了相关定理:对于任意的一个连续分段线性函数
Summary
通常来说,在一个网络中很少使用多种**函数。如果使用ReLU,需要合理设置学习率,避免出现过多死亡神经元,也可以使用leaky-ReLU或者Maxout来解决该问题。
reference
- http://cs231n.github.io/neural-networks-1/
- https://zhuanlan.zhihu.com/p/21462488
- http://blog.****.net/cyh_24/article/details/50593400
- http://blog.****.net/hjimce/article/details/50414467
- Paper: Maxout Networks
- Paper: Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
- Code: Tensorflow implement of Maxout