2017年3月9日木曜日

ReLu(Rectified Linear Units)激活函数

论文参考:Deep Sparse Rectifier Neural Networks (很有趣的一篇paper)

起源:传统激活函数、脑神经元激活频率研究、稀疏激活性

传统Sigmoid系激活函数

传统神经网络中最常用的两个激活函数,Sigmoid系(Logistic-Sigmoid、Tanh-Sigmoid)被视为神经网络的核心所在。

从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。

从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。

无论是哪种解释,看起来都比早期的线性激活函数(y=x),阶跃激活函数(-1/1,0/1)高明了不少。

近似生物神经激活函数:Softplus&ReLu 

2001年,神经科学家Dayan、Abott从生物学角度,模拟出了脑神经元接受信号更精确的激活模型,该模型如左图所示:

这个模型对比Sigmoid系主要变化有三点:①单侧抑制 ②相对宽阔的兴奋边界 ③稀疏激活性(重点,可以看到红框里前端状态完全没有激活)

同年,Charles Dugas等人在做正数回归预测论文中偶然使用了Softplus函数,Softplus函数是Logistic-Sigmoid函数原函数。

 Softplus(x)=log(1+ex)Softplus(x)=log(1+ex)

按照论文的说法,一开始想要使用一个指数函数(天然正数)作为激活函数来回归,但是到后期梯度实在太大,难以训练,于是加了一个log来减缓上升趋势。

加了1是为了保证非负性。同年,Charles Dugas等人在NIPS会议论文中又调侃了一句,Softplus可以看作是强制非负校正函数max(0,x)max(0,x)平滑版本。

偶然的是,同是2001年,ML领域的Softplus/Rectifier激活函数与神经科学领域的提出脑神经元激活频率函数有神似的地方,这促成了新的激活函数的研究。

生物神经的稀疏激活性

在神经科学方面,除了新的激活频率函数之外,神经科学家还发现了神经元的稀疏激活性。

还是2001年,Attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性。

2003年Lennie等人估测大脑同时被激活的神经元只有1~4%,进一步表明神经元工作的稀疏性。

从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。

从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被激活,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。

Softplus照顾到了新模型的前两点,却没有稀疏激活性。因而,校正函数max(0,x)max(0,x)成了近似符合该模型的最大赢家。

 

Part I:关于稀疏性的观点

Machine Learning中的颠覆性研究是稀疏特征,基于数据的稀疏特征研究上,派生了Deep Learning这一分支。

稀疏性概念最早由Olshausen、Field在1997年对信号数据稀疏编码的研究中引入,并最早在卷积神经网络中得以大施拳脚。

近年来,稀疏性研究不仅在计算神经科学、机器学习领域活跃,甚至信号处理、统计学也在借鉴。

总结起来稀疏性大概有以下三方面的贡献:

1.1 信息解离

当前,深度学习一个明确的目标是从数据变量中解离出关键因子。原始数据(以自然数据为主)中通常缠绕着高度密集的特征。原因

是这些特征向量是相互关联的,一个小小的关键因子可能牵扰着一堆特征,有点像蝴蝶效应,牵一发而动全身。

基于数学原理的传统机器学习手段在解离这些关联特征方面具有致命弱点。

然而,如果能够解开特征间缠绕的复杂关系,转换为稀疏特征,那么特征就有了鲁棒性(去掉了无关的噪声)。

1.2 线性可分性

稀疏特征有更大可能线性可分,或者对非线性映射机制有更小的依赖。因为稀疏特征处于高维的特征空间上(被自动映射了)

从流形学习观点来看(参见降噪自动编码器),稀疏特征被移到了一个较为纯净的低维流形面上。

线性可分性亦可参照天然稀疏的文本型数据,即便没有隐层结构,仍然可以被分离的很好。

1.3 稠密分布但是稀疏

稠密缠绕分布着的特征是信息最富集的特征,从潜在性角度,往往比局部少数点携带的特征成倍的有效。

而稀疏特征,正是从稠密缠绕区解离出来的,潜在价值巨大。

1.4 稀疏性激活函数的贡献的作用:

不同的输入可能包含着大小不同关键特征,使用大小可变的数据结构去做容器,则更加灵活。

假如神经元激活具有稀疏性,那么不同激活路径上:不同数量(选择性不激活)、不同功能(分布式激活),

两种可优化的结构生成的激活路径,可以更好地从有效的数据的维度上,学习到相对稀疏的特征,起到自动化解离效果。

 

Part II:基于稀疏性的校正激活函数

2.1 非饱和线性端

撇开稀疏激活不谈,校正激活函数max(0,x)max(0,x),与Softplus函数在兴奋端的差异较大(线性和非线性)。

几十年的机器学习发展中,我们形成了这样一个概念:非线性激活函数要比线性激活函数更加先进。

尤其是在布满Sigmoid函数的BP神经网络,布满径向基函数的SVM神经网络中,往往有这样的幻觉,非线性函数对非线性网络贡献巨大。

该幻觉在SVM中更加严重。核函数的形式并非完全是SVM能够处理非线性数据的主力功臣(支持向量充当着隐层角色)。

那么在深度网络中,对非线性的依赖程度就可以缩一缩。另外,在上一部分提到,稀疏特征并不需要网络具有很强的处理线性不可分机制。

综合以上两点,在深度学习模型中,使用简单、速度快的线性激活函数可能更为合适。

如图,一旦神经元与神经元之间改为线性激活,网络的非线性部分仅仅来自于神经元部分选择性激活。

2.2 Vanishing Gradient Problem

更倾向于使用线性神经激活函数的另外一个原因是,减轻梯度法训练深度网络时的Vanishing Gradient Problem。

看过BP推导的人都知道,误差从输出层反向传播算梯度时,在各层都要乘当前层的输入神经元值,激活函数的一阶导数。

即Grad=Error⋅Sigmoid′(x)⋅xGrad=Error⋅Sigmoid′(x)⋅x。使用双端饱和(即值域被限制)Sigmoid系函数会有两个问题:

①Sigmoid'(x)∈(0,1)  导数缩放

②x∈(0,1)或x∈(-1,1)  饱和值缩放

这样,经过每一层时,Error都是成倍的衰减,一旦进行递推式的多层的反向传播,梯度就会不停的衰减,消失,使得网络学习变慢。

而校正激活函数的梯度是1,且只有一端饱和,梯度很好的在反向传播中流动,训练速度得到了很大的提高。

Softplus函数则稍微慢点,Softplus'(x)=Sigmoid(x)∈(0,1) ,但是也是单端饱和,因而速度仍然会比Sigmoid系函数快。

 

Part III 潜在问题

强制引入稀疏零的合理性?

诚然,稀疏性有很多优势。但是,过分的强制稀疏处理,会减少模型的有效容量。即特征屏蔽太多,导致模型无法学习到有效特征。

论文中对稀疏性的引入度做了实验,理想稀疏性(强制置0)比率是70%~85%。超过85%,网络就容量就成了问题,导致错误率极高。

 

对比大脑工作的95%稀疏性来看,现有的计算神经网络和生物神经网络还是有很大差距的。

庆幸的是,ReLu只有负值才会被稀疏掉,即引入的稀疏性是可以训练调节的,是动态变化的。

只要进行梯度训练,网络可以向误差减少的方向,自动调控稀疏比率,保证激活链上存在着合理数量的非零值。

 

Part IV ReLu的贡献

4.1 缩小做和不做非监督预训练的代沟

ReLu的使用,使得网络可以自行引入稀疏性。这一做法,等效于无监督学习的预训练。

当然,效果肯定没预训练好。论文中给出的数据显示,没做预训练情况下,ReLu激活网络遥遥领先其它激活函数。

甚至出现了比普通激活函数预训练后更好的奇葩情况。当然,在预训练后,ReLu仍然有提升空间。

从这一层面来说,ReLu缩小了非监督学习和监督学习之间的代沟。当然,还有更快的训练速度。

4.2 更快的特征学习

在MNIST+LeNet4中,ReLu+Tanh的组合在epoch 50左右就能把验证集错误率降到1.05%

但是,全Tanh在epoch 150时,还是1.37%,这个结果ReLu+Tanh在epoch 17时就能达到了。

该图来自AlexNet的论文对ReLu和普通Sigmoid系函数做的对比测试,可以看到,ReLu的使用,使得学习周期

大大缩短。综合速率和效率,DL中大部分激活函数应该选择ReLu。

 

Part V  Theano中ReLu的实现

ReLu可以直接用T.maximum(0,x)实现,用T.max(0,x)不能求导.

 

Part VI  ReLu训练技巧

见Cifar-10训练技巧

 

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

 

请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?

第一个问题:为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。
正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。

第二个问题:为什么引入Relu呢?
第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,参见

答案的第三点),从而无法完成深层网络的训练。
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。

当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。
多加一句,现在主流的做法,会多做一步batch normalization,尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2],他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果。大家有兴趣可以看下。


[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[2] He, Kaiming, et al. "Identity Mappings in Deep Residual Networks." arXiv preprint arXiv:1603.05027 (2016).

 

 

 

1. 激活函数的作用:

是为了增加神经网络模型的非线性。否则你想想,没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。所以你没有非线性结构的话,根本就算不上什么神经网络。

2. 为什么ReLU效果好:

重点关注
这章6.6节:Piecewise Linear Hidden Units
http://www.iro.umontreal.ca/~bengioy/dlbook/mlp.html

总结如下:
发现ReLU效果显著的论文:

Jarrett, K., Kavukcuoglu, K., Ranzato, M., and LeCun, Y. (2009a). What is the best multi-stage architecture for object recognition?



发现ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:

Glorot, X., Bordes, A., and Bengio, Y. (2011b). Deep sparse rectifier neural networks. In JMLR W&CP: Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics (AISTATS 2011). 130, 297

 

缺点是不能用Gradient-Based方法。同时如果de-active了,容易无法再次active。不过有办法解决,使用maxout激活函数:

Goodfellow, I. J., Warde-Farley, D., Mirza, M., Courville, A., and Bengio, Y. (2013a). Maxout networks. In S. Dasgupta and D. McAllester, editors, ICML'13, pages 1319�C1327. 130, 152, 243

 

除了帮助传播信息,便于优化的优点以外,分段线性函数可以让regularize变得更加容易。

 

 

 

原回答请见 不同activation function的神经网络的表达能力是否一致? - 约翰曰不约的回答

为什么通常Relu比sigmoid和tanh强,有什么不同?
主要是因为它们gradient特性不同。sigmoid和tanh的gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。vanishing gradient在网络层数多的时候尤其明显,是加深网络结构的主要障碍之一。相反,Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。
而提出sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或着-1到1,在表达上,尤其是输出层的表达上有优势。




(universal approximation theorem)[1~2]表明,带有线性输出层和至少一层带有"挤压"性质的激活函数的隐含层的前馈神经网络,在隐含层具有足够神经元数的情况下,可以以任意精度近似任何一个从有限空间到另一个有限空间映射的Borel可测函数(定义在有界闭集上的任意连续函数是Borel可测的)。

所以,要想网络获得普适近似器的性质,一个必须点是"要有带有"挤压"性质的激活函数"。这里的"挤压"性质是因为早期对神经网络的研究用的是sigmoid类函数,所以对其数学性质的研究也主要基于这一类性质:将输入数值范围挤压到一定的输出数值范围。(后来发现,其他性质的激活函数也可以使得网络具有普适近似器的性质,如ReLU [3])
这可以说是激活函数的理论作用了,使神经网络成为一个普适近似器。

当然,激活函数有很多种,并不是每个都能有以上作用(例如单位函数作为激活函数,但其实单位函数作为隐含层激活函数,可以达到以减少参数和过滤数据的作用:,原来一个的线性权重矩阵的功能由两个小矩阵()代替),也有的激活函数具有更多作用。

那为什么ReLU好过sigmoid类的呢?因为它具有其他优良性质[4]:

  • 梯度传播性质的解释(最重要的,因为目前,对神经网络训练而言,梯度这东西最重要):

梯度消失是因为有saturation regime的存在,而ReLU线性部分能很好传播梯度,而置0部分本身就是为了稀疏性而牺牲gradient的。

  • 稀疏性性质的解释:

ReLU更易产生稀疏性,而数学上来看,你可以认为这是一种线性变化,然后再投影,投到特征维度上( )。
我觉得是可以利用这种粗略的想法,来判断当前数据是否适用ReLU这种激活函数来构建网络。当然,实验是最靠谱的了。

而稀疏性的好处有:

  1. 信息解离:相当于将高度耦合的变量解耦,这样表示就能容忍噪声从而更具鲁棒性;
  2. 信息容量可变的表示:如果input信息量大,那么会有很多神经元active以保存这些信息;而如果input信息量小,那么就会有很多神经元inactive。这也是variable-size data structure,机器学习模型中,变量多了怕过拟合,变量不够怕欠拟合。这里提供了一种解决思路。
  3. 线性可分:低维到高维从而分类,这不正是SVM想做的?
  4. 稀疏分布式表示:2个0-1变量的4种可能组合,n个0-1变量有2^n种组合。n越大,表现力就越强。

 

  • 生物解释:

这是生物神经的firing rate curve:
<img src="https://pic4.zhimg.com/75e0e65b525503356db499e5356d2c2b_b.png" data-rawheight="420" data-rawwidth="565" class="origin_image zh-lightbox-thumb" width="565" data-original="https://pic4.zhimg.com/75e0e65b525503356db499e5356d2c2b_r.png">
这是各种激活函数的curve:
<img src="https://pic1.zhimg.com/ec400e8198e2de44b6e283f7ae3e7930_b.jpg" data-rawheight="420" data-rawwidth="560" class="origin_image zh-lightbox-thumb" width="560" data-original="https://pic1.zhimg.com/ec400e8198e2de44b6e283f7ae3e7930_r.jpg">

他主要强调的相同点是:
1.
没有到突然有这个过程(红框),而不是极其小到逐渐大;
2.
对于某些输入,生物神经元的输出和输入成比例;
3.
大多数时间,生物神经元是非激活的(也就是稀疏性)。

  • 实际实验上的解释:
  1. hard saturation at 0 的问题:clear;
  2. 无上限问题:clear;
  3. 实现非线性的问题:clear;
  4. 达到的效果:好。

 

事实上,对激活函数的研究是一个活跃的领域,如ReLU后面的leaky ReLU,PReLU,2013 - Maxout Networks中的maxout单元,2016 - Noisy Activation Functions中用噪声和一阶泰勒分解来近似sigmoid类函数以作为激活函数。
一般而言,有许多激活函数都能获得与传统激活函数相当的表现(像cos函数作为激活函数也可以表现得不错),但!只有那些在明确证明/实验 具有显著改善的激活函数,才会被发表被传播使用[5]。(目前2016,ReLU由于其理论和实验优势,一般被用作默认激活函数)

以上。

[1] 1989 - Approximation by superpositions of a sigmoidal function
[2] 1989 - Multilayer feedforward networks are universal approximators
[3] 1993 - Multilayer feedforward networks with a nonpolynomial activation function can approximate any function
[4] 2011 - Deep Sparse Rectifier Neural Networks
[5] 2016 - Deep Learning, book by Ian Goodfellow, Yoshua Bengio, Aaron Courville

 

 

 

作者:夏飞
链接:https://www.zhihu.com/question/29021768/answer/145998033
来源:知乎
著作
权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

TLDR (or the take-away)

优先使用ReLU (Rectified Linear Unit) 函数作为神经元的activation function:

背景

深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的activation function,传入到下一层神经元;再经过该层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的pattern,在各个领域取得state-of-the-art的结果。显而易见,activation function在深度学习中举足轻重,也是很活跃的研究领域之一。目前来讲,选择怎样的activation function不在于它能否模拟真正的神经元,而在于能否便于优化整个深度神经网络。下面我们简单聊一下各类函数的特点以及为什么现在优先推荐ReLU函数。

Sigmoid函数

<img src="https://pic2.zhimg.com/v2-83469109cd362f5fcf1decf109007fbd_b.png" data-rawwidth="1364" data-rawheight="458" class="origin_image zh-lightbox-thumb" width="1364" data-original="https://pic2.zhimg.com/v2-83469109cd362f5fcf1decf109007fbd_r.png">

Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数,其导数为,这是优点。然而,Sigmoid有三大缺点:

  • 容易出现gradient vanishing
  • 函数输出并不是zero-centered
  • 幂运算相对来讲比较耗时

Gradient Vanishing

优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。原因在于两点:(1) 在上图中容易看出,当中较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0 (2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。请注意这里是"至少",导数达到最大值这种情况还是很少见的。

输出不是zero-centered

Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。


<img src="https://pic4.zhimg.com/v2-d290a1c0a8a9378de6a66ec229b907ab_b.png" data-rawwidth="630" data-rawheight="516" class="origin_image zh-lightbox-thumb" width="630" data-original="https://pic4.zhimg.com/v2-d290a1c0a8a9378de6a66ec229b907ab_r.png">

幂运算相对耗时

相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省则省 :-)。之后我们会看到,在ReLU函数中,需要做的仅仅是一个thresholding,相对于幂运算来讲会快很多。

tanh函数

<img src="https://pic2.zhimg.com/v2-a39596b282f6333bced6e7bfbfe04dcd_b.png" data-rawwidth="1224" data-rawheight="528" class="origin_image zh-lightbox-thumb" width="1224" data-original="https://pic2.zhimg.com/v2-a39596b282f6333bced6e7bfbfe04dcd_r.png">

tanh读作Hyperbolic Tangent,如上图所示,它解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在。

ReLU函数

<img src="https://pic3.zhimg.com/v2-5c97f377cdb5d1f0bc3faf23423c4952_b.png" data-rawwidth="1304" data-rawheight="412" class="origin_image zh-lightbox-thumb" width="1304" data-original="https://pic3.zhimg.com/v2-5c97f377cdb5d1f0bc3faf23423c4952_r.png">

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:

  • 解决了gradient vanishing问题 (在正区间)
  • 计算速度非常快,只需要判断输入是否大于0
  • 收敛速度远快于sigmoid和tanh

ReLU也有几个需要特别注意的问题:

  1. ReLU的输出不是zero-centered
  2. Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

Leaky ReLU函数

<img src="https://pic1.zhimg.com/v2-8fa15614231fd01a659d4763beec9b24_b.png" data-rawwidth="1208" data-rawheight="408" class="origin_image zh-lightbox-thumb" width="1208" data-original="https://pic1.zhimg.com/v2-8fa15614231fd01a659d4763beec9b24_r.png">

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为而非0。另外一种直观的想法是基于参数的方法,即Parametric ReLU:,其中可由back propagation学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

ELU (Exponential Linear Units) 函数

<img src="https://pic2.zhimg.com/v2-604be114fa0478f3a1059923fd1022d1_b.png" data-rawwidth="1304" data-rawheight="490" class="origin_image zh-lightbox-thumb" width="1304" data-original="https://pic2.zhimg.com/v2-604be114fa0478f3a1059923fd1022d1_r.png">

ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

  • 不会有Deal ReLU问题
  • 输出的均值接近0,zero-centered

它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

小结

建议使用ReLU函数,但是要注意初始化和learning rate的设置;可以尝试使用Leaky ReLU或ELU函数;不建议使用tanh,尤其是sigmoid函数。

 

 

作者:Brad
链接:https://www.zhihu.com/question/29021768/answer/93100557
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下为activation function的比较,引自:CS231N(Stanford University CS231n: Convolutional Neural Networks for Visual Recognition)
&lt;img src="https://pic1.zhimg.com/05925f65d0f7d0c6da62b18a9d905b44_b.jpg" data-rawwidth="1930" data-rawheight="924" class="origin_image zh-lightbox-thumb" width="1930" data-original="https://pic1.zhimg.com/05925f65d0f7d0c6da62b18a9d905b44_r.jpg"&gt;&lt;img src="https://pic4.zhimg.com/a8f4669d5cd8612aa0bb3c2f364aa9c7_b.jpg" data-rawwidth="1898" data-rawheight="804" class="origin_image zh-lightbox-thumb" width="1898" data-original="https://pic4.zhimg.com/a8f4669d5cd8612aa0bb3c2f364aa9c7_r.jpg"&gt;&lt;img src="https://pic2.zhimg.com/d233b2c3c079a95820688965582a672d_b.jpg" data-rawwidth="1990" data-rawheight="954" class="origin_image zh-lightbox-thumb" width="1990" data-original="https://pic2.zhimg.com/d233b2c3c079a95820688965582a672d_r.jpg"&gt;&lt;img src="https://pic1.zhimg.com/ddf29a3c2c11acfd83d9ba32d90bbf20_b.jpg" data-rawwidth="1908" data-rawheight="732" class="origin_image zh-lightbox-thumb" width="1908" data-original="https://pic1.zhimg.com/ddf29a3c2c11acfd83d9ba32d90bbf20_r.jpg"&gt;

 

 

1)为什么需要activation function?
deep neural network
可以
认为是特征的多层表达,这过程activation function的作用是提供非线性变换。如果没有非线性激活函数,再多的隐层其也只是对于输入的一个线性变换。线性变换模型capacity是很有限的,连最简单的异或问题都没法解决。。
2)relu相比sigmoid 或者tanh的优点
可以参考deep learning 大牛Bengio 的
论文http://machinelearning.wustl.edu/mlpapers/paper_files/AISTATS2011_GlorotBB11.pdf
从SGD
训练的角度分析,sigmoid or tanh 都会面临gradient vanshing 问题,这是由于这sigmoid函数的偏导只有在-4到+4之间有比较大的值,再大或者小则梯度接近0。
具体
实验也会发现relu的dnn(语音识别,图像分类任务)相比于sigmoid 的dnn :不需要pretraining; 更快收敛; 性能上也会更好一些。。



作者:tramphero
链接:https://www.zhihu.com/question/29021768/answer/65576915
来源:知乎
著作
权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。