
一、前言
前段时间通过引入新的激活函数Dice,带来了指标的提升,借着这个机会,今天总结下常用的一些激活函数。
激活函数在深度学习中起着非常重要的作用,本文主要介绍下常用的激活函数及其优缺点。主要分为以下几个部分:
- 引入激活函数的目的
- sigmoid激活函数带来的梯度消失和爆炸问题
- 常用激活函数对比
关于之前Dice激活函数的实现,可以参见下面的链接:
绝密伏击:深度学习中Batch Normalization和Dice激活函数zhuanlan.zhihu.com
二、引入激活函数的目的
图1:带一层隐藏层的神经网络
先看一个只含一层隐藏层的神经网络,如图1所示。输入为
条样本
,隐藏层
的权重和偏置分别为
,
,输出层
的权重和偏置分别为
,
。输出层的计算为:
将(1),(2)联合起来可得:
从(3)可以看出,
虽然加入了隐藏层,但是还是等效于单层的神经网络:权重为
,偏置为
上述的根本原因在于全连接只是对数据做
仿射变换,而多个仿射变换的叠加仍然是一个放射变换。因此有必要引入非线性变换,这个非线性变换就是今天要讲的
激活函数。
三、sigmoid激活函数带来的梯度消失和爆炸问题
为了解决前面的问题,后来提出了sigmoid激活函数。sigmoid函数可以将元素的值变换到0和1之间,定义如下:
图2:sigmoid激活函数
sigmoid激活函数的导数为:
sigmoid激活函数虽然增强了模型的非线性表达能力,但是却带来了梯度消失和爆炸的问题,下面具体分析下是如何导致的。
3.1 sigmoid可能带来的梯度消失
图3:多层神经网络示意图
图3是一个多层的神经网络,假设其损失函数为
,前一层
和后一层
的关系可以表示如下:
其中
,则反向传播计算
的梯度为:
从(8)可以看出,
梯度的计算依赖
,
的计算方式如下:
根据公式(5)可知
,而网络权重一般会进行标准化,因此
通常会小于1,从而
,因此:
从公式(10)可以看出,
随着反向传播链式求导,层数越多最后的梯度越小,最终导致梯度消失。
3.2 sigmoid可能带来的梯度爆炸
3.1节讨论了sigmoid可能会带来梯度消失,那么会不会导致梯度爆炸呢?这个还是有可能的,如果
,即权重参数
比较大的时候,就会出现梯度爆炸。那么这个可能性到底有多大,下面具体分析下。
备注:为了便于表示,后面的因为
,因此必须
,才可能出现
。由
可得出
的取值范围为:
由于
,故公式(11)可以变换为:
因此
的数值变化范围为公式(12)中的右边-左边,即:
图4:梯度爆炸x的数值范围
图4显示了公式(13)中的
数值范围随
的变化,可以看到
的最大数值范围也仅仅为0.45,
因此仅仅在很窄的范围内才可能出现梯度爆炸。
根据3.1和3.2节,可以得出以下结论:
- sigmoid激活函数在深层神经网络中极大概率会引起梯度消失
- sigmoid激活函数很小的概率会出现梯度爆炸
由于sigmoid的局限性,所以后来很多人又提出了一些改进的激活函数,比如:ReLU,Leaky-ReLU,PReLU,Dice,RReLU等。后面具体介绍下几个激活函数的区别。
四、常用激活函数对比
4.1 ReLU
ReLU是Krizhevsky、Hinton等人在2012年
《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的一种激活函数,可以用来解决梯度消失的问题,其定义如下:
图5:ReLU激活函数
从公式(14)可以看出ReLU在正区间的导数为1,因此不会发生梯度消失。关于ReLU的缺点,可以参见下面的描述:
神经网络在训练的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。因为:ReLU的导数在的时候是1,在![]()
sigmoid函数_深度学习中激活函数总结 的时候是0。如果![]()
sigmoid函数_深度学习中激活函数总结 ![]()
sigmoid函数_深度学习中激活函数总结 ,那么ReLU的输出是0,那么反向传播中梯度也是0,权重就不会被更新,导致神经元不再学习。
在实际训练中,如果学习率设置的太高,可能会发现网络中40%的神经元都会死掉,且在整个训练集中这些神经元都不会被激活。所以,设置一个合适的较小的学习率,会降低这种情况的发生。为了解决神经元节点死亡的情况,有人提出了Leaky-ReLU,PReLu,RReLU,ELU等激活函数。
总结一下ReLU的优缺点。
优点:
- ReLU解决了梯度消失的问题
- 由于ReLU线性特点,神经网络的计算和训练比sigmoid快很多
缺点:
- ReLU可能会导致神经元死亡,权重无法更新。
4.2 Leaky-ReLU
Leaky-ReLU是Andrew L. Maas等人在2013年
《Rectifier Nonlinearities Improve Neural Network Acoustic Models(Leaky ReLU)》论文中提出的一种激活函数。由于ReLU将所有负数部分的值设为0,从而造成神经元的死亡。而Leaky-ReLU是对负值给与一个非零的斜率,从而避免神经元死亡的情况。Leaky-ReLU定义如下:
图6:Leaky-ReLU激活函数
Leaky-ReLU很好的解决了ReLU中神经元死亡的问题。因为Leaky-ReLU保留了
时的梯度,在
时,不会出现神经元死亡的问题。总结一下Leaky-ReLU的优缺点。
优点:
- Leaky-ReLU解决了ReLU中神经元死亡的问题
- 由于Leaky-ReLU线性特点,神经网络的计算和训练比sigmoid快很多
缺点:
- Leaky-ReLU中的超参 需要人工调整
sigmoid函数_深度学习中激活函数总结
4.3 PReLU
PReLU是Kaiming He等人在2015年《
Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》论文中提出的激活函数。和Leaky-ReLU相比,将
变成可训练的参数,不再依赖于人工调整。PReLU的定义如下:
其中
是可训练的参数。
4.4 Dice
Dice是Guorui Zhou等人在2018年《
Deep Interest Network for Click-Through Rate Prediction》论文中提出的激活函数。
Dice是对PRelu做了平滑,使得拐点不再是固定的0,而是依赖于数据的分布,定义如下:
图7:Dice激活函数和PReLU的对比
4.5 RReLU
RReLU(Randomized Leaky ReLU)的首次提出是在Kaggle比赛NDSB中,也是Leaky-ReLU的一个变体。RReLU在训练的过程中,
是从均匀分布
中随机选取的,RReLU在训练过程中的定义如下:
其中:
公式(18)中的
表示第
个样本的第
维输入。
图8:RReLU激活函数
在测试阶段,
取值为训练阶段所有
的平均值,即:
。NDSB竞赛冠军设置的均匀分布为:
Bing Xu等人在2015年《
Empirical Evaluation of Rectified Activations in Convolution Network》文章中关于ReLU,Leaky ReLU,PReLU,RReLU效果进行了详细的对比,可以参考下面的链接:
https://arxiv.org/pdf/1505.00853.pdfarxiv.org
五、总结
从最初的sigmoid到后面的Leaky ReLU、PReLU,再到近期的SELUs、GELUs,激活函数的改进从来没有中断过。激活函数不仅解决了深层神经网络的梯度消失和爆炸问题,同时对于模型的拟合能力和收敛速度起着至关重要的重用。因此了解激活函数的相关原理还是非常有必要的。
六、Reference
- https://ziyubiti.github.io/2016/11/06/gradvanish/
- 神经网络梯度消失和梯度爆炸及解决办法
- https://zhuanlan.zhihu.com/p/25631496
- 梯度消失和ReLU - heixialee - 博客园