激活函数 sigmoid、tanh、relu

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了激活函数 sigmoid、tanh、relu相关的知识,希望对你有一定的参考价值。

参考技术A 激活函数(activation functions)的目标是,将神经网络非线性化。激活函数是连续的(continuous),且可导的(differential)。

常见的激活函数:sigmoid,tanh,relu。

sigmoid是平滑(smoothened)的阶梯函数(step function),可导(differentiable)。sigmoid可以将任何值转换为0~1概率,用于二分类。细节可以 参考 。

公式:

导数:

导数2:

图(红色原函数,蓝色导函数):

当使用sigmoid作为激活函数时,随着神经网络隐含层(hidden layer)层数的增加,训练误差反而加大。表现为:

这种现象就是梯度弥散(vanishing gradient)。而另一种情况,梯度爆炸(exploding gradient),则是前面层的梯度,通过训练变大,导致后面层的梯度,以指数级增大。

由于sigmoid的导数值小于1/4,x变化的速率要快于y变化的速率,随着层数的增加,连续不断执行sigmoid函数,就会导致,前面更新较大的幅度,后面更新较小的幅度,因此,网络在学习过程中,更倾向于,更新后面(靠近输出层)的参数,而不是前面的参数(靠近输入层)。

sigmoid缺点:

参考1 、 参考2

tanh,即双曲正切(hyperbolic tangent),类似于幅度增大sigmoid,将输入值转换为-1至1之间。tanh的导数取值范围在0至1之间,优于sigmoid的0至1/4,在一定程度上,减轻了梯度消失的问题。tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP(back propagation)网络的梯度求解,容错性好,有界。

公式:

导数:

图(红色原函数,蓝色导函数):

sigmoid和tanh:

参考1 、 参考2 、 参考3

relu,即Rectified Linear Unit,整流线性单元,激活部分神经元,增加稀疏性,当x小于0时,输出值为0,当x大于0时,输出值为x.

公式:

图:

导数:

图:

relu对比于sigmoid:

relu的缺点:

在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度,流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。

如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

在神经网络中,隐含层的激活函数,最好选择ReLU。

关于RNN中为什么选择tanh,而不是relu, 参考 。

以上是关于激活函数 sigmoid、tanh、relu的主要内容,如果未能解决你的问题,请参考以下文章

神经网络中的激活函数具体是什么?为什么Relu要好过与tanh和sigmoid function

神经网络中的激活函数

学习经验分享NO.16超全代码-python画Sigmoid,ReLU,Tanh等十多种激活函数曲线及其梯度曲线(持续更新)

Relu激活函数的优点

深度学习调参体验

深度学习调参体验