目录
1、什么是激活函数
2、激活函数的用途(为什么需要激活函数)?
3、常见的激活函数介绍
3.1 Sigmoid函数
3.2 tanh函数
3.3.RelU函数
ReLU 变体的提出
3.4 Leaky ReLU函数 和 PReLU 函数
3.5 ELU (Exponential Linear Units) 函数
4、应用中如何选择合适的激活函数?
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
1. 对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希望的输出是一个概率
2、线性的表达能力太有限了: 如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,即使经过多层网络的叠加,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。
总结,激活函数的作用: 激活函数是用来加入非线性因素的,因为线性模型的表达能力不够,引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)
当然,激活函数需要满足一下要求:
非线性,这样增加网络的深度才有意义
可导的,不然怎么做梯度下降
易于计算的
输出空间最好是有限的,这条好像也不是必须的,Relu就没有遵循这条
常用的激活函数Sigmoid、Tanh、ReLU、Leaky-ReLU、P-ReLU,ELU ,还有一些他们的变体以及其他的函数
sigmod 函数图形:
sigmoid激活函数 sigmoid函数导数
Sigmoid函数是传统神经网络中最常用的激活函数,虽然现在已经不常用,但当年还是十分受欢迎的。Sigmoid函数也叫Logistic 函数,值域在0到1之间。
Sigmoid函数的表达式及其求导:
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,当x的值趋近负无穷的时候,y趋近于0;x趋近于正无穷的时候,y趋近于1。在 [−2,2] 区间内,梯度变化比较明显,即x发生很小的变化,y变化的也比较明显。
sigmoid的优缺点:
优点:
缺点:
缺点1:容易出现梯度弥散,反向传播时,很容易就会出现梯度消失和梯度爆炸的情况,从而无法完成深层网络的训练,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍(由sigmod导数图知道,梯度值最少减小为原来的0.25倍),如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为(1,+∞) 区间内的值,则会出现梯度爆炸情况。
缺点2:Sigmoid 的 output 不是0均值(即zero-centered,不是以0为中心),导致收敛速度下降。
为什么要以0为中心,参考这里:谈谈激活函数以零为中心的问题
这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x > 0, f= wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
tanh 函数图形
tanh函数的表达式及其求导:
求导
tanh函数的优缺点:
解决了Sigmoid函数的不是zero-centered输出问题。
但是梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
tanh 函数图
ReLu (Rectified Linear Unit)修正线性单元函数,函数的表达式:
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,
ReLu有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2) 计算速度非常快,只需要判断输入是否大于0
3) 梯度不饱和,收敛速度远快于sigmoid和tanh
ReLU的缺点:
1)ReLU的输出不是zero-centered ,ReLU的输出均值大于0,影响网络收敛
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,影响网络收敛。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 。 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。 解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
3)对参数初始化和学习率非常敏感
尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!
从ReLu图上可以看出,当 x ≤ 0 的时候,ReLu有饱和问题,当 x > 0的时候,则存在硬饱和(当x<0时,导数恒等于0;软饱和:导数趋近于0)。所以当 x > 0 的时候不会存在梯度消失的问题。为了解决左硬饱和问题,提出了Leaky ReLU、PReLU解决方法。
Leaky ReLu 图:
函数表达式:
为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 αx 而非0,通常 α=0.01,即Leaky ReLU。另外一种直观的想法是基于参数的方法,即PReLU,其形式Leaky ReLU想同,不同点是其中的α可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
Leaky ReLU 优点:
1)Leaky ReLU 也能避免死亡 ReLU 问题,因为其在计算导数时允许较小的梯度;
2)由于不包含指数运算,所以计算速度比 ELU 快。
Leaky ReLU 缺点:
1)无法避免梯度爆炸问题;
2)神经网络不学习 α 值;
3)在微分时,两部分都是线性的;而 ELU 的一部分是线性的,一部分是非线性的。
RLU 函数图:
ELU函数表达式:
ELU也是为解决ReLU存在的问题而提出,由导数图可以看出,这里成功避开了死亡 ReLU 问题,同时仍保有 ReLU 激活函数的一些计算速度增益——也就是说,网络中仍还有一些死亡的分量(在[-5 , 负无穷] 区域,导数接近为0)。
优点:
1)不会有Dead ReLU问题
2)输出的均值接近0,zero-centered 。 能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化
缺点:
1)由于包含指数运算,所以计算量稍大;
2)无法避免梯度爆炸问题;
3)神经网络不学习 α 值。
理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
这个问题目前没有确定的方法,凭一些经验吧。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.