深度学习之常用激活函数

 

激活函数(Activation Function)一般用于神经网络的层与层之间,将上一层的输出转换之后输入到下一层。如果没有激活函数引入的非线性特性,那么神经网络就只相当于原始感知机的矩阵相乘。

 

一、激活函数的性质

非线性:当激活函数为非线性的时候,可以证明两层的神经网络可以逼近任意复杂的函数。

连续可微:由于神经网络的训练是基于梯度的优化方法,数学基础是连续可微,因此选取的激活函数也要保证连续可微。阶跃激活函数在0点不连续,且在除零点外导数都为0,因此不能使用基于梯度的方法。

范围:当激活函数的取值范围有限时,基于梯度的训练方法往往更加稳定,因为特征的表示受有限权重的影响更显著。当取值范围无限时,训练通常会更有效率,因为特征的表示会显著影响大部分权重,在这种情况下,通常需要更小的学习率。

单调性:当激活函数是单调时,单层网络的误差曲面一定是凸的。

在原点附近恒等(f(x)=x):即f(0)=0f{}'(0)=1f{}' 在0点连续。如果激活函数具有这个属性,则使用小的随机值初始化权值就能高效地训练神经网络。如果不具有这个属性,则在初始化权值的时候就需要特别小心。

 

一些概念:

(1)饱和

当一个激活函数满足 \underset{x\rightarrow -\infty }{\lim} f{}'(x)=0 时称为左饱和,当满足 \underset{x\rightarrow +\infty }{\lim} f{}'(x)=0 时称为右饱和,两种条件都满足时称为饱和。

(2)硬饱和与软饱和

对于任意的x,如果存在常数c,当x<c时恒有f{}'(x)=0 称为左硬饱和,当x>c时恒有f{}'(x)=0 则称为右硬饱和,两种条件都满足时称为硬饱和;如果只有在极限状态下偏导数等于0的函数,称之为软饱和。

(3)线性与非线性激活函数区别:非线性激活使ANN能用平滑的曲线来分割平面,而不是用复杂的线性组合逼近平滑曲线来分割平面。

       

 

二、激活函数的类型

1、Identity function(恒等激活函数)

             f(x)=x\; ,\; f{}'(x)=1\; ,\; Range\in (-\infty ,+\infty )

 

2、Binary step function(二值阶跃激活函数)

             f(x)=\left\{\begin{matrix} 0\; \; \; for\; x<0\\ 1\; \; \; for\; x\geqslant 0 \end{matrix}\right.\; ,\; f{}'(x)=\left\{\begin{matrix} 0\; \; \; for\; x\neq 0\\ ?\; \; \; for\; x= 0 \end{matrix}\right.\; ,\; Range\in \left \{ 0,1 \right \}

 

3、Logistic/Sigmoid function

             f(x)=\sigma (x)=\frac{1}{1+e^{-x}}\; ,\; f{}'(x)=f(x)(1-f(x))\; ,\; Range\in (0,1)

        缺点:

        (1)输出不以0为中心,反向传播时后一层将得到上一层输出的非0均值作为输入,会出现偏移现象;Δw将全为正数、或全为负数,使得梯度下降过程中出现z字型下降,导致权值更新效率降低;

        (2)Sigmoid的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因之一。一旦落入饱和区梯度就会接近0:Grad=Error*Sigmoid`(x)*x,导致每经过一层Error都是成倍衰减,一般在5层内就会产生梯度消失现象,无法有效地训练网络;

        (3)计算机运行指数运算的速度较慢。

 

4、Hyperbolic tangent(双曲正切函数)

             f(x)=tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}\; ,\; f{}'(x)=1-f(x)^{2}\; ,\; Range\in (-1,1)

        输出以0为中心,其他缺点同sigmoid函数。

 

Ramp function(斜坡函数)

        该函数在负半轴函数值为0,正半轴为形如y=At的正比例函数,A=1时称为单位斜坡函数。

 

5、Rectified linear unit(线性整流函数/修正线性单元)

             f(x)=\left\{\begin{matrix} 0\; \; \; for\; x<0\\ x\; \; \; for\; x\geqslant 0 \end{matrix}\right.\; ,\; f{}'(x)=\left\{\begin{matrix} 0\; \; \; for\; x< 0\\ 1\; \; \; for\; x\geqslant 0 \end{matrix}\right.\; ,\; Range\in [0,+\infty )

        ReLU是常用的激活函数,以0为分界线,输入小于0的部分输出均为0,大于等于0的部分输出等于输入值。

        与Sigmoid系函数相比区别在于:收敛速度快、单侧抑制、相对宽阔的兴奋边界、稀疏激活性。

       

        由于稀疏的特征并不需要网络具有很强的处理线性不可分的机制,因此在深度学习中使用简单、速度快的线性激活函数更为合适(网络的非线性来自于神经元部分选择性激活)。ReLU的引入使得网络可以自行引入稀疏性,相当于无监督学习训练。ReLU的梯度为1且只有一端饱和,梯度能很好的在反向传播中流动,训练速度有很大的提高,不会产生梯度消失或梯度爆炸的问题。

        下图为选择不同激活函数训练一个4层CNN模型达到同样错误率25%时的epoch数量比较,实线表示使用ReLU的模型的训练速度比虚线使用tanh的快6倍。

       

        缺点:

        (1)输出不以0为中心;

        (2)此函数没有边界,如有需要可以自行设定边界值,例如min(max(0,x), 6);

        (3)前向传播时如果输入小于0,则神经元保持非激活状态;

                反向传播输入负数时梯度为0,会kill梯度,出现和Sigmoid系函数一样的问题,无法更新权重;

        (4)反向传播时如果一个非常大的梯度流过一个ReLU神经元,更新过参数后,这个神经元就再也不会对任何数据有激活现象了,它的梯度就永远都会是0,可以设置一个比较小的学习率来解决这种问题。

 

6、SoftPlus

             f(x)=\ln (1+e^{x})\; ,\; f{}'(x)=\frac{1}{1+e^{-x}}\; ,\; Range\in (0,+\infty )

        SoftPlus函数是logistic/sigmoid函数的原函数,导数是sigmoid函数,按照论文的说法,开始想要用一个指数函数(天然正数)作为激活函数来回归,但到后期梯度过大难以训练,于是加入对数来减缓上升趋势,+1是为了保证非负性。可将该函数看做ReLU的平滑版本,但不具备稀疏激活性;单端饱和,指数+对数运算速度慢于ReLU但仍快于Sigmoid函数。

       

 

7、Leaky ReLU函数

              f(\alpha ,x)=\left\{\begin{matrix} \alpha x \; \; for\; x<0\\ x\; \; \; for\; x\geqslant 0 \end{matrix}\right. ,\; f{}'(\alpha,x)=\left\{\begin{matrix} \alpha\; \; \; for\; x< 0\\ 1\; \; \; for\; x\geqslant 0 \end{matrix}\right. ,\; Range\in (-\infty ,+\infty )

        为了解决ReLU中容易出现死神经元的问题,对负数部分进行修正,加入一个小的斜率(ɑ∈(0,1),一般取0.1、0.01等)使得负数输入不会全部被稀疏掉,但实际应用中效果好坏并未有统一定论。

       

 

8、ELU

                        Range\in (-\infty ,+\infty )

        Exponential linear unit同样是对ReLU负值部分进行指数修正,减少了正常梯度与单位自然梯度之间的差距,在负值区域稳定性更强。

 

几种ReLU变种函数曲线对比

       

 

9、Maxout

        可看做是ReLU的一般情况,相当于在深度学习网络中额外加入一层激活函数层,增加了k个神经元进行激活,然后输出激活值中最大的值。

        f(x)=\underset{i}{\max}\, x_{i}\, ,\; \frac{\partial f}{\partial x_{j}}=\left\{\begin{matrix} 1\; \; for\; j=\underset{i}{\arg \max} \, x_{i}\\ 0\; \; for\; j\neq \underset{i}{\arg \max} \, x_{i} \end{matrix}\right.\; Range \in (-\infty ,+\infty )

        优点:拟合能力非常强,计算简单,不会出现神经元饱和的情况;

        缺点:参数翻倍,计算量增加。

       

 

三、激活函数选择建议

(1)首选ReLU函数(只在隐藏层中使用),性能好、速度快;

(2)在ReLU出现很多死神经元的情况下,考虑使用Leaky ReLU函数;

(3)建议只在全连接层使用sigmoid函数;

(4)tanh函数在某些情况下有比较好的效果,但应用场景比较少;

(5)Maxout效果虽好但参数翻倍,因此一般不用。

 

四、Tensorflow提供的激活函数

在Tensorflow r1.0中提供了以下几种激励函数,其中包括连续非线性的(比如sigmoid, tanh, elu, softplus, softsign),连续但不是处处可微的(relu, relu6, crelu, relu_x)以及随机函数(dropout)。

tf.nn.relu、tf.nn.relu6、tf.nn.crelu、tf.nn.elu

tf.nn.softplus、tf.nn.softsign

tf.nn.dropout

tf.nn.bias_add

tf.sigmoid、tf.tanh

 

参考资料

https://en.wikipedia.org/wiki/Activation_function

https://blog.csdn.net/dabokele/article/details/58713727

https://www.zhihu.com/question/22334626/answer/103835591

https://blog.csdn.net/cyh_24/article/details/50593400

https://www.cnblogs.com/rgvb178/p/6055213.html

https://www.cnblogs.com/neopenx/p/4453161.html

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值