[机器学习] 神经网络-各大主流激活函数-优缺点

为什么要使用激活函数

在深度学习中,信号从一个神经元传入到下一层神经元之前是通过线性加权和来计算的,而进入下一层神经元需要经过非线性的激活函数,继续往下传递,如此循环下去。由于这些非线性函数的反复叠加,才使得神经网络有足够的能力来抓取复杂的特征。
如果不使用(非线性)激活函数,这种情况下每一层输出都是其输入的线性函数。无论神经网络有多少层,输出都是输入的线性函数,这样就和只有一个隐藏层的效果是一样的,是无法逼近那些复杂的非线性函数的(这也是为什么 激活函数一般都是具有“非线性”的性质的)。这种情况相当于多层感知机(MLP)。
因此我们不仅要使用激活函数,而且激活函数还必须具备一些性质:

  • 非线性:上面已经说了,这里不说了
  • 可微性: 当网络基于梯度来更新参数权重时,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数

常用激活函数说明

sigmoid

函数:f(z) = 1 / (1 + exp( − z))

导数:f(z)’ = f(z)(1 − f(z))
在这里插入图片描述

优缺点

优点
  • 求导容易
  • sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定
缺点
  • 函数饱和使梯度消失:这是sigmoid 一个非常致命的缺点,Logistic回归-代价函数求导过程中最后的结果是这个公式:
    Alt其中:
    Alt
    我们可以看出,当输入非常大或者非常小的时候,h(x)-y就会非常非常的的小,当神经网络深度达到一定”程度“时,根据”求导链式法则“就会出现”梯度消失现象“(“饱和的情况”),所以反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。我们需要注意参数的初始值来尽量避免饱和的情况。如果你的初始值很大的话,大部分神经元可能都会处在饱和的状态从而导致梯度消失,这会导致网络变的很难学习。

  • Sigmoid 的 输出不是0均值: 导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,进而影响梯度下降的运作。因为如果输入都是正数的话(如y=wx+b中每个元素都 x>0),那么关于w的梯度在反向传播过程中,要么全是正数,要么全是负数(具体依据整个表达式y而定),这将会导致梯度下降权重更新时出现z字型的下降。(导致网络训练缓慢)如果是按 batch 训练,那么每个 batch 可能得到不同的信号,整个批量的梯度加起来后可以缓解这个问题。

  • 幂运算相对耗时

tanh

函数:f(z) = tanh(z)=2sigmoid(2x)-1
导数:f(z)’ = 1 − (f(z))2

在这里插入图片描述

优缺点

优点
  • 是0均值的,解决了sigmoid的”非0均值的缺点“,这也是为啥比Sigmoid函数收敛速度更快的原因
  • tanh函数的输出映射在(-1,1)之间,单调连续,输出范围有限,优化稳定
缺点
  • 函数饱和使梯度消失:这是也tanh 一个非常致命的缺点, 其原因和sigmoid 的原因基本一样
  • 幂运算相对耗时

ReLu

修正线性单元(Rectified linear unit,ReLU)
函数:f(x) = max(0, x)

在这里插入图片描述

优缺点

优点
  • 有效缓解了梯度消失的问题。
  • 相较于sigmoid和tanh函数,ReLU 对于 SGD 的收敛有巨大的加速作用(Alex Krizhevsky 指出有 6 倍之多)。有人认为这是由它的线性、非饱和的公式导致的。
  • 相比于 sigmoid和tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数幂)运算

下面的优点来自这篇博客

  • 提供了神经网络的稀疏表达能力:从ReLu的图可以看出出,ReLU函数是分段线性函数,所有的的负值都变为0,而正值不变,这种操作被成为单侧抑制 可别小看这个简单的操作,正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。
    那么问题来了:这种稀疏激活性有何作用? 换句话说,我们为什么需要让神经元稀疏?不妨举栗子来说明。当看名侦探柯南的时候,我们可以根据故事情节进行思考和推理,这时用到的是我们的大脑左半球;而当看蒙面唱将时,我们可以跟着歌手一起哼唱,这时用到的则是我们的右半球。左半球侧重理性思维,而右半球侧重感性思维。也就是说,当我们在进行运算或者欣赏时,都会有一部分神经元处于激活或是抑制状态,可以说是各司其职。再比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。与之类似,当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
  • 对于线性函数而言,ReLU的表达能力更强(结合其“稀疏表达能力”理解)
  • 对于非线性函数而言,ReLU由于非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态。
缺点
  • ReLU的输出不是”0均值的”

  • Dead ReLU Problem(神经元坏死现象:某些神经元可能永远不会被激活,导致相应参数永远不会被更新()。举例来说:一个非常大的梯度经过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,导致了数据多样化的丢失

    • 产生这种现象的两个原因:
      • 参数初始化问题;
      • learning rate太高导致在训练过程中参数更新太大。
    • 解决方法:
      • 采用Xavier初始化方法,
      • 避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
      • 把 ReLU换成 Leaky_ReLU ,保证让激活函数在输入小于零的情况下也有非零的输出

简单介绍Leakly ReLU函数

在这里插入图片描述
假设a=0.01
在这里插入图片描述
Leaky ReLU与ReLU的区别在于:当x<0时,不再输出0。用来解决ReLU带来的神经元坏死的问题。可以将0.01设置成一个变量a,其中a由后向传播学出来。但是其表现并不一定比ReLU好。

简单介绍ELU函数

在这里插入图片描述
ELU有ReLU的所有优点,并且不会有 Dead ReLU问题,输出的均值接近0(zero-centered)但是计算量大,其表现并不一定比ReLU好。

参考

[1] https://blog.csdn.net/u011534057/article/details/52880887
[2] : https://blog.csdn.net/lwplwf/article/details/74859518
[3] :https://blog.csdn.net/cyh_24/article/details/50593400
[4] : https://blog.csdn.net/NOT_GUY/article/details/78749509
[5] :https://laobadao.github.io/2017/10/27/logistic-cost/index.html
[6] :https://blog.csdn.net/cherrylvlei/article/details/53149381

说明

以上博客如有侵权,请联系我!

猜你喜欢

转载自blog.csdn.net/qq_32806793/article/details/85344568