激活函数的用途(为什么需要激活函数)?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
Sigmoid
Sigmoid函数的导数:
优点:引入非线性
缺点:梯度爆炸和梯度消失;Sigmoid 的 output 不是0均值;其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
tanh函数
tanh函数解析式:
它解决了Sigmoid函数的不是zero-centered输出问题,也可以缓解梯度消失问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
Relu函数
Relu函数的解析式:
ReLU函数在训练的时候,一不小心有可能导致梯度为零。由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,这个神经元有可能再也不会被任何数据激活,这个ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果设置的learning rate 比较大,那么很有可能网络中的大量的神经元都坏死了。如果开始设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
Leaky ReLU函数(PReLU)
理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
ELU (Exponential Linear Units) 函数
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
不会有Dead ReLU问题
输出的均值接近0,zero-centered
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
maxout
未
参考:https://blog.csdn.net/tyhj_sf/article/details/79932893