【深度学习】常见激活函数的理解与选择

一、关于激活函数

设置激活函数是为了使之能拟合更多的情况,如果仅仅是线性加权那么无论多少层仍然相当于是线性组合,拟合效果十分有限。而不同的激活函数无论在分类效果上还是运算速度上都是不同的,本文主要对常见的激活函数进行总结,分析其特别以供选择。当然,介绍之前肯定要知道,没有绝对好的激活函数,深度学习问题也是具体问题具体分析的。

二、常见激活函数介绍

1、Sigmoid

函数解析式

函数图像
【深度学习】常见激活函数的理解与选择_第1张图片
特点:数据被变换在0和1之间,对于特别小的负数输出为0,特别大的正数输出为1。
缺点
(1)深度神经网络反向传播过程中容易导致梯度消失
这是因为sigmoid函数的导数值较小(0, 0.25],深度网络中如果不断累积梯度将接近于0,导致梯度消失。不求导直接从图像也可以看出,在左右两侧变换较为平缓,很容易发生梯度消失
(2)幂函数计算量较大,而且反向传播求梯度时涉及除法
(3)函数输出不是以0为中心的,这样会使权重更新效率降低
如果函数输出总是大于0的,那么下一个节点相当于有一个正数偏置,但实际上网络里每层可能会引入一些normalization操作,并且到最后也不能说bias对最终的结果一定不好。

2、Tanh

函数解析式

函数图像
【深度学习】常见激活函数的理解与选择_第2张图片
特点:解决了sigmoid函数不是zero-centered输出问题,然而,梯度消失和幂运算的问题仍然存在。
可以看出tanh(x)的梯度消失问题比sigmoid要轻,梯度如果过早消失,收敛速度较慢.
缺点:①梯度消失②幂运算

3、Relu

函数解析式

函数图像
【深度学习】常见激活函数的理解与选择_第3张图片
【深度学习】常见激活函数的理解与选择_第4张图片
特点

  • 解决了gradient vanishing问题 (在正区间)
  • 计算速度非常快,只需要判断输入是否大于0
  • 收敛速度远快于sigmoid和tanh
  • 并不是全区间可导
    缺点
  • 输出不是zero-centered
  • Dead ReLU Problem
    ReLU在负数区域被kill的现象叫做dead relu。ReLU在训练的时很“脆弱”。在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。
    产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。
    解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

这里通过和老师交流,得到一点心得。看起来relu会将小于0的部分丢失掉,但是如果令节点的数量翻一番,w为对应的负值,那么会极大程度保留原来小于0的部分,如果最终模型并没有保留,说明优化还有更好的解决方案。总之非线性的效果ReLU在其计算量下已经能很好的保留。ReLU(w_1 * x) - ReLU(-w_1 * x) = w_1 * x

4、Leaky ReLU & PReLU

函数解析式

函数图像
【深度学习】常见激活函数的理解与选择_第5张图片
特点:为了解决Dead ReLU Problem而提出的激活函数。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。如果a不是固定值而是待学习的参数,那么称为Parametric ReLU。

5、ELU

函数解析式

函数图像
【深度学习】常见激活函数的理解与选择_第6张图片
特点:ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,并且不会有Dead ReLU问题,输出的均值接近0,zero-centered。理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
缺点:计算量稍大

6、MaxOut

函数解析式


这张图表示的比较清晰,在节点间多加了一层,求k个线性激活值最终取最大值形成非线性激活值
特性

  • Maxout的拟合能力非常强,可以拟合任意的凸函数
  • Maxout具有ReLU的所有优点,线性、不饱和性
  • 同时没有ReLU的一些缺点。如:神经元的死亡

缺点:每个神经元中有两组(w,b)参数,那么参数量就增加了,这就导致了整体参数的数量激增。

7、其他

上面介绍的主要是比较经典的激活函数,这里举两个比较新的激活函数的例子。
【深度学习】常见激活函数的理解与选择_第7张图片

三、激活函数的选择

激活函数的选择目前还是凭借经验具体问题具体分析。目前比较主流的是ReLU系列,计算速度快,效果也好一些。而sigmoid因为存在的问题现在用的不是很多,可以考虑tanh,一般来说sigmoid函数除了用在二元分类的输出层,其他情况建议不要使用。然后可以优先选择zero-centered的数据与输出,可以加快模型收敛,但也不绝对。对于ReLU要注意“dead” 神经元。另外ReLU函数只能在隐藏层中使用。
总结一下,可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。

参考资料

https://blog.csdn.net/tyhj_sf/article/details/79932893
https://www.cnblogs.com/makefile/p/activation-function.html
https://blog.csdn.net/hjimce/article/details/50414467

你可能感兴趣的:(深度学习,深度学习)