转载:https://blog.csdn.net/huangfei711/article/details/79613024
神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。
在ICML2016的一篇论文Noisy Activation Functions中,作者将激活函数作出了形象的定义,如下图所示:
在实际的应用中,我们需要先了解以下概念:
饱和
当一个激活函数h(x)满足 limn→+∞h′(x)=0limn→+∞h′(x)=0 时,我们称之为左饱和。
当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。
硬饱和与软饱和
对任意的x,如果存在常数c,当 x > c 时恒有 h′(x)=0h′(x)=0 则称其为左硬饱和。
若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和。
如果只有在极限状态下偏导数等于0的函数,称之为软饱和。从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。下文将依次对它们进行总结。
Sigmoid
Sigmoid 是使用范围最广的一类激活函数,具有指数函数形状 。正式定义为:
f(x)=11+e−xf(x)=11+e−x
可见,sigmoid 在定义域内处处可导,根据上述对饱和的定义,其可被定义为软饱和激活函数。
Sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。
这里给出一个关于梯度消失的通俗解释:
Sigmoid 函数能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是 f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新。
最后总结一下 Sigmoid 函数的优缺点:
优点:
- Sigmoid 函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。它在物理意义上最为接近生物神经元。
- 求导容易。
缺点:
- 由于其软饱和性,容易产生梯度消失,导致训练出现问题。
- 其输出并不是以0为中心的。
Tanh
f(x)=1−e−2x1+e−2xf(x)=1−e−2x1+e−2x
函数位于[-1, 1]区间上,对应的图像是:
同样的,Tanh 激活函数也具有软饱和性。Tanh 网络的收敛速度要比 Sigmoid 快。因为 Tanh 的输出均值比 Sigmoid 更接近 0,SGD 会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。
总结一下 Tanh 激活函数的优缺点:
优点:
- 比Sigmoid函数收敛速度更快。
- 相比Sigmoid函数,其输出以0为中心。
缺点:
还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
ReLU
ReLU 是近几年非常受欢迎的激活函数。被定义为:
其对应的函数图像为:
可见,ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。
最后总结一下 ReLU 函数的优缺点:
优点:
- 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。据称,这是因为它线性、非饱和的形式。
- Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
- 有效缓解了梯度消失的问题。
- 在没有无监督预训练的时候也能有较好的表现。
- 提供了神经网络的稀疏表达能力。
缺点:
随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
LReLU 与 PReLU
PReLU 是 ReLU 和 LReLU 的改进版本,具有非饱和性:
下面给出 LReLU 的函数图像:
当 aiai 比较小且固定的时候,我称之为 LReLU。LReLU 最初的目的是为了避免梯度消失。但在一些实验中,我们发现 LReLU 对准确率并没有太大的影响。很多时候,当我们想要应用 LReLU 时,我们必须要非常小心谨慎地重复训练,选取出合适的 a,LReLU 的表现出的结果才比 ReLU 好。因此有人提出了一种自适应地从数据中学习参数的 PReLU。
PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。
ELU
ELU 融合了sigmoid和ReLU,具有左侧软饱性。其正式定义为:
右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。
激活函数选用总结
在进行深度学习的研究中,如何选择激活函数,仍需依靠实验指导。一般来说,在分类问题上建议首先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。
该博文主要参考资料:
1.深度学习中的激活函数导引
2.浅谈深度学习中的激活函数