几种激活函数对比(一)

sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:(1)“非饱和激活函数”能解决所谓的“梯度消失”问题。(2)能加快收敛速度。

sigmoid将实值输出压缩在[0,1]范围内;tanh函数将实值输出压缩在[-1, 1]的范围。

sigmoid函数在历史上曾非常常用,输出值范围为[0, 1]之间的实数。但是现在它已经不太受欢迎了,实际中很少使用。原因如下:

(1)sigmoid函数饱和使梯度消失(sigmoidsaturate and kill gradients)。我们从导函数中可以看出sigmoid的导数都是小于0.25的,那么在进行反响传播的时候,梯度相乘结果会慢慢的趋近于0。这样,几乎就没有梯度信号通过神经元传递到前面层的梯度更新中,因此这时前面层的权值几乎没有更新,这就叫梯度消失。除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,致使神经元不能很好的更新权重提前饱和,神经网络就几乎不学习。

(2)sigmoid函数输出不是“零中心”(zero-centered)。一个多层的sigmoid神经网络,如果你的输入x都是正数,那么在反向传播中w的梯度传播到网络的某一处时,权值的变化要么全正要么全负。当梯度从上层传播下来,w的梯度都是用x乘以f的梯度,因此如果神经元输出的梯度是正的,那么所有w的梯度就会是正的,反之依然。这就造成你的w只能往同一个方向走,模型拟合的过程就会十分缓慢。

(3)指数函数的计算是比较消耗计算资源的。

tanh函数

tanh函数跟sigmoid外形上是很像的,实际上,tanh是sigmoid的变形,

tanh与sigmoid不同的是,tanh是“零为中心”的。因此,在实际应用中,tanh会比sigmoid更好一些。但是在饱和神经元的情况下,tanh还是没有解决梯度消失问题。

优点:(1)tanh解决了sigmoid的输出非“零中心”的问题

缺点:(1)依然有sigmoid函数过饱和的问题。(2)依然进行的是指数运算。

ReLU

近年来,ReLU函数变得越来越受欢迎。全称是Rectified Linear Unit,中文名是:修正线性单元。

优点:(1)ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和;

(2)由于ReLU线性、非饱和的形式,在SGD中能够快速收敛;

(3)计算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。

缺点:(1)ReLU的输出不是“零中心”;

(2)随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。

总结:训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入的是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。在实际训练中,如果学习率设置的太高,可能会发现网络中40%的神经元都会死掉,且在整个训练集中这些神经元都不会被激活。所以,设置一个合适的较小的学习率会降低这种情况的发生。所以必须设置一个合理的学习率。为了解决神经元节点死亡的情况,有人提出了Leaky ReLU、P-ReLU、R-ReLU、ELU等激活函数。

引出的问题:神经网络中ReLU是线性还是非线性函数?为什么ReLU这种“看似线性”的激活函数所形成的网络,居然能够增加非线性的表达能力?

(1)ReLU是非线性激活函数。

线性网络:如果把线性网络看成一个大的矩阵M。那么输入样本A和B,则会经过同样的线性变换MA,MB(这里A和B经历的线性变换矩阵M是一样的)

(2)的确对于单一的样本A,经过由ReLU激活函数所构成神经网络,其过程确实可以等价是经过了一个线性变换M1,但是对于样本B,在经过同样的网络时,由于每个神经元是否激活(0或者Wx+b)与样本A经过时情形不同了,因此B所经历的线性变换M2并不等于M1。因此,ReLU构成的神经网络虽然对每个样本都是线性变换,但是不同样本之间所经历的线性变换M并不一样,所以整个样本空间在经过ReLU构成的网络时其实是经历了非线性变换的。

 参考:https://blog.csdn.net/qq_42422981/article/details/89561955

posted @ 2020-02-20 20:37  我们都是大好青年  阅读(1580)  评论(0编辑  收藏  举报