原文站点:https://senitco.github.io/2017/09/05/deep-learning-activation-function/git
神经网络的激活函数(activation function)经过引入非线性因素,使得网络能够逼近任何非线性函数,提升网络模型的表达能力,更好地解决复杂问题。
github
激活函数一般具备如下性质:
- 非线性:使用非线性激活函数的多层神经网络能够逼近全部函数
- 可微性:对于常见的优化方法——梯度降低法,可微性是必要的
- 单调性:单调激活函数可以保证单层网络是凸函数
- 输出范围:激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,由于特征的表示受有限权值的影响更显著;当输出值的范围无界时,模型训练会更加高效,不过这种状况下通常须要更小的学习率(learning rate),以保证收敛web
Sigmoid的数学公式为
算法
Sigmoid函数曾被普遍使用,但如今使用较少,主要是存在如下缺点:
- 函数饱和形成梯度消失(Sigmoids saturate and kill gradients):神经元的激活值在趋近0或1时会饱和,在这些区域梯度值几乎为0,并且梯度值非0的输入范围很是有限。在反向传播时,此处局部梯度值将与损失函数关于该神经元输出的梯度相乘,若是局部梯度很是小,那么相乘的结果也会趋近于0,形成梯度消失,使得前面网络的权值参数没法更新。为了防止饱和,初始化权重不易过大,不然大多数神经元将会饱和,致使网络难以学习。
- Sigmoid输出不是0均值(Sigmoid outputs are not zero-centered):这一性质会致使后面网络层获得的输入数据不是零中心的,影响梯度降低的运做。由于若是输入神经元的数据老是正数(好比在
此外,Sigmoid函数涉及到指数运算,增长了计算量。app
双曲正切函数的数学表达式为
dom
tanh函数一样存在饱和和梯度消失问题,但输出是0均值的,所以在必定程度上,性能略优于Sigmoid。svg
ReLU应用较为普遍,其数学表达式为
函数
ReLU激活函数主要有以下优缺点:
- (+)相比于Sigmoid和tanh,ReLU对于随机梯度降低(SGD)的收敛有显著的加速做用(在AlexNet中,比tanh收敛快6倍)。据称这是由其(分段)线性、非饱和致使的
- (+)Sigmoid、tanh包含指数运算,耗费计算资源,而ReLU经过和阈值比较便可获得激活值,不涉及复杂运算
- (-)ReLU的缺点是在训练时神经元比较脆弱,可能会“死掉”。当一个很大的梯度反向传播通过ReLU神经元时,可能会致使权值更新事后,对任何数据都再也不出现激活现象,全部流过该神经元的梯度都将变为0。也就是说,ReLU单元在训练中将不可逆转的死亡,致使数据多样性的丢失。实际上,若是学习率设置得太高,网络中约40%的神经元都会死掉,在整个训练集中都不会再激活。所以须要合理设置学习率。性能
leaky-ReLU是用于解决ReLU中神经元死亡的尝试方案,其数学公式以下:
在训练过程当中,
Maxout源于大神Goodfellow在2013年发表的一篇论文Maxout Network,能够将其看做网络中的激活函数层。假设网络某一层的输入特征向量为
论文中给出了相关定理:对于任意的一个连续分段线性函数
一般来讲,在一个网络中不多使用多种激活函数。若是使用ReLU,须要合理设置学习率,避免出现过多死亡神经元,也可使用leaky-ReLU或者Maxout来解决该问题。