Sigmoid, Relu, Swish, Gelus, Maxout等常用激活函数的分析学习
本文主要针对邱锡鹏老师《NNDL》中3.1节中提及的集中激活函数做了一下对比记录,并不较少激活函数本身,只是从发展和优缺点的角度去评价他们。并尝试在他们当中找出可改进的角度和变化趋势。
首先给出今天参与对比的激活函数们:Sigmoid系列(Logistic, Tanh, Hard-L&T), ReLU函数系列(ReLU, Leaky ReLU, PReLU, ELU, Softplus), 谷歌的Swish函数, BERT中应用的GELUS函数以及Maxout单元。一个个来说,并且在叙述后者时加入与前者的对比。
首先,给出激活函数的通用特性:1.连续并且可导;2.函数比较简单;3.函数值域在一个合适的区间,不能偏大也不能偏小。
Sigmoid函数系列
该系列函数容易饱和,存在梯度消失问题(梯度消失是指Sigmoid函数存在的饱和区导数接近于0,误差经过每一层都会不断地衰减,当网络层数较深时,梯度就会不停的衰减甚至消失)。SIgmoid函数会导致一个非稀疏的神经网络。
Logistic函数
直接分析其特点:(其余没写在这里的在后面的对比中给出)
- Logistic函数首先是具备Sigmoid的标准特性,两端饱和(即趋向于无穷时导数为零)。
- 有‘挤压’特性的函数,可以看做把一个实数域的输入“挤压”到了(0,1)区间上。
- 与感知机阶跃函数相比,其输出可以直接看成概率分布,使得神经网络可以更好的与机器学习模型结合。
- 理解上,可以将其看作“软性门”,可以用来控制其他神经元输出信息的数量。
Tanh函数
对比分析Tanh函数:
- 与Logistic相比,它是一个零中心化的函数(而Logistic不是,可以参考下文图像直观看出),可以减少带给后一层神经元的偏置偏移,提高梯度下降的效率(收敛得更快)。
- 同样有着刚才Logistic的特性,也是两端饱和函数,只不过值域扩大了一倍。
- 与Logistic一样,属于指数运算函数,梯度下降过程计算量较大。

Hard-L&T函数
Hard_Logistic和Hard_Tanh是前面两种Sigmoid函数的Hard版,解决了两端饱和性问题但依然没解决指数运算量大的问题。
- 比前者们更易进行拟合,两端饱和部分被一阶泰勒展开函数进行线性化处理后在进行梯度计算的时候明显的收敛速度加快。
- 至于函数是否零中心化此二者与其非Hard版本保持一致,并且继承其前者的其他优点。
但是尽管有如此多的优点,Sigmoid函数仍然位于激活函数鄙视链的最底端,属于早起是用的深度学习激活函数,前几年开始使用的激活函数选择顺序就已经是:Elus > Relu > Sigmoid了,现在更是有了谷歌的Swish函数出现,所以现在已经很少单独使用Sigmoid作为激活函数了。

ReLU函数系列
该系列函数存在的问题是缺乏随机因素,参数设置上主观性较强,实际应用时需要对网络模型参数初始化过程不断调整和测试来避免过拟合问题。ReLU函数所带来的稀疏性相比Sigmoid函数好得多。原始的ReLU现在也已经不太被应用了,更多的我们应该关注它的变种函数。但我们先来看的是原始的ReLU,并且用他来对比改进的变种函数。
ReLU函数
原始的ReLU函数非常简单,所以采用ReLU的神经元只需要进行加、乘和比较的操作,计算上更加高效。
- 简单,计算高效。
- 和Logistic一样也是非零中心化的激活函数(给下一层产生偏置偏移,影响梯度下降效果)。
- 与Sigmoid系列函数相比的时候,能够体现ReLU缓解了梯度消失的问题,加速了梯度下降的收敛速度。
- 单侧抑制(一侧函数值为0)。
- 宽兴奋边界(兴奋度可以达到很高)。
- 致命的缺陷是会发生死亡现象。
- 和Logistic函数一样无法产生负值,影响梯度下降收敛速度。
- 具有稀疏表达能力(可以产生0,而Sigmoid饱和只能近似接近0而产生不了0)
Leaky ReLU函数
在ReLU基础上当x<0是引入一个非常小的γ值来作为梯度,这样就可以避免ReLU的神经元死亡问题了。
- 能够避免神经元死亡问题。
- 不会产生过拟合问题。
- 计算也相对后面几种模型比较简单(比如与ELU和前面的基于指数运算的函数相比)。
- 由于可以避免死亡,同时补充了梯度,所以其收敛速度甚至比原始ReLU还要快。
PReLU函数
和刚才的Leaky ReLU相比只是将参数变化为了一个向量的形式,向量内元素个数与该层神经元个数相同,为每个神经元路径配置不同的参数。参数可通过学习得到。
- 允许不同的神经元拥有不同的参数,灵活性更高,应用于机器学习过程时可以有更好的拟合效果,但和刚才L-ReLU不同,现在过拟合的可能性又重新出现了。
- 计算量相对来说要多了一些,但不是致命的缺陷(依然比指数运算类要好很多)。
- 更加适合应用于实际模型学习当中,更符合一般实际问题的性质,但参数学习过程复杂。
- 向上继承了刚才L-ReLU模型防止神经元死亡的优点。
ELU函数
将ReLU函数<0部分平滑化,线性转饱和,图像呈近似零中心化。虽然存在梯度饱和与指数运算的问题,但跟Sigmoid相比依然要好上很多。
- 事实上ELU的效率比以上三种ReLU还要高,他相当于取了比较折中的方案,首先它避免了无负值的缺陷。
- 但加上了负值就无可避免的出现平滑曲线,虽然相当于重新引入了饱和曲线,只不过优点的作用更大。
- 同样也因此避免了死亡的产生。
- 指数运算也只是相对于其他ReLU族函数复杂,比起Sigmoid还是小巫见大巫,所以现在ELU也是常用的激活函数选择。
SoftPlus函数
SoftPlus事实上提出来的很早,在2001年就被踢出来了,要远远早于10年提出的ReLU,他可以看做是ReLU的一个平滑版本。相应的特性也很相似。
- 同样没有负值。
- 同样非零中心化。
- 同样的单侧抑制(左侧饱和)
- 同样的宽兴奋边界。
- 比ReLU缺少了稀疏性,因为左侧饱和了。

Swish函数
这是谷歌在2017年提出来的新的激活函数,在ReLU的优势基础上强化了门控机制,超参数β的加入使得函数可以调整门控的开关状态来近似于不同的ReLU函数。之前说Sigmoid函数容易饱和,ReLU函数族缺乏随机因素,神经网络建模中比较重要的就是模型的非线性。同时为了模型泛化能力需要加入随机正则的部分。而先前的函数我们都还讨论不到同时兼备这两者较好的表达。而从Swish开始以及后面的GELU都开始有了这种效果。
- 继承了ReLU的优势,在X>0时依然不存在梯度消失问题。
- 同时<0的部分也不会轻易的死亡,门控机制的加入使得灵活性变强,导致Swish能应用于多种机器学习模型的实际环境中。
- β参数可以唯一也可以该层每个神经元各对应一个。(一对一学习,一对多进行固定)
- 计算量会很大是唯一缺陷。

GELU函数
GELU在非线性激活中应用了随机正则的思想,也是一种通过门控机制来调整输出的激活函数,和Swish函数非常类似。BERT的源码在使用的就是GELU,所以可以看出GELU现在的应用还是很好的。
- 包含随机正则的思想可以更加方便梯度下降过程以及学习速度。
- 以标准正态分布作为表达式成分,可以通过Sigmoid函数进行近似,拟合能力更强。
- 同时具备Swish的上述优点。
- 它不产生饱和,并且通过自门控进行调整,能够相对于ReLU适应更多的模型环境。
- 同时相比于ELU不需要为了创造负值和非线性而导致牺牲太多。
- 代码实现也比较简单。

Maxout单元
Maxout提出的时间也比ReLU要晚一些,所以避免了一些前者所存在的问题。它主要的改进是不再使用净输入,而转去关注上一层全部的原始输出。
- 缺陷非常的明显,由于要参考的输入变成了上层全部原始输出,参数是呈k倍增加的。
- 参数是可学习的,其中的权重是学习变化的,其本身是一个分段线性函数。
- Maxout的拟合能力是很强的,它相当于是一个函数逼近器,对于一个标准的MLP来说,如果隐藏神经元层数足够多,理论上可以逼近任何函数。但是同时也要避免过拟合问题。
- 与Swish和GELU相比的话在非线性和随机正则表达上要缺憾一些,但却也能够避免最前面几种模型的大部分缺点。