Deep Learning 激活函数总结

引入激活函数的意义:

    激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题(比如线性不可分的问题)。
    

    激活函数的作用:

          在没有激活函数的神经网络中所有的变换都是线性的,所以无论网络结构如何输出总是输入的线性组合

        用多个感知机来进行组合, 获得更强的分类能力

è¿éåå¾çæè¿°

 所以在面对线性不可分的数据时一般有两种办法: 引入激活函数引入核函数

    引入核函数:将在低维空间的线性不可分数据通过核函数映射到线性可分的高维空间中找到一个超平面进行分割,本质上使用的还是线性分类器。

    引入激活函数:将线性分类器转化为非线性分类器

 

 常见的激活函数:

    Sigmoid & tanh

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

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

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

 Sigmoid 

sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。

而现在sigmoid已经不怎么常用了,主要是因为它有三个缺点:

  1.  Sigmoids saturate and kill gradients. Sigmod导致的梯度消失问题是致命的,将会导致学习无法进行。当输入非常大或者非常小的时候(saturation),这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。
  2. Sigmoids outputs are not zerocentered.  Sigmoid函数输出不是0均值的,会导致梯度全部为正或全部为负
  3. Exp() is a bit compute expensive. 因为有指数运算导致运算消耗较大

    使用BN(Batch Normalization )能同时缓解前两个问题。个人理解BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布。

tanh   

tanh解决了sigmoid的第二个问题但依然有梯度消失的危险同时依然有指数运算。tanh是sigmoid的变种:

                                                                    tanh(x)=2sigmoid(2x)−1

RELU

è¿éåå¾çæè¿°

近年来,ReLU 变的越来越受欢迎。它的数学表达式是: f(x)=max(0,x)

看到这里大家一定有个疑问:relu明明是线性分段函数,为什么使用relu会增加非线性元素?

邹博老师的解释是:relu构成的神经网络虽然对每个样本都是线性变换,但是不同样本之间经历的线性变换M并不一样,所以整个样本空间在经过relu构成的网络时其实是经历了非线性变换的。

relu的优点

  1. 梯度下降速度快速提升,比tanh快了6倍: 因为relu为线性不饱和函数,在反向传播算法中下降梯度等于  下降敏感度乘以前一层的输出值,所以前一层输出越大,下降的梯度越多。该优点解决了sigmod的问题1的一部分问题。
  2. relu不用计算指数,计算简单,速度快

relu的缺点:神经元死亡

    由于relu在x<0时梯度为0, 导致负的梯度在这个relu被置零,而且再也不会被任何数据激活。如果这种情况发生了,那么神经元之后的梯度就永远是0了, 也就是relu的神经元坏死,不会对任何数据有所响应。学习率(learning rate)设置的太高,网络中大约40%的神经元将会死亡(整个训练过程中都不会激活)

     针对以上的缺点,人们提出了LRelu(Leaky-Relu), PRelu(Parametric ReLU),  RRelu(Randomized Leaky Relu)三种拓展激活函数。

Leaky Relu

 ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。以数学的方式我们可以表示为:

α是(0,1)区间内的固定参数。这里的 α 是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。 

Parametric ReLU

对于 Leaky ReLU 中的ai,通常都是通过先验知识人工赋值的。 
然而可以观察到,损失函数对ai的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? 
Kaiming He的指出,不仅可以训练,而且效果更好。推导公式:

Randomized Leaky Relu

“随机纠正线性单元”RReLU也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个高斯分布U(I,u)中随机抽取的数值,然后再测试过程中进行修正(有点像dropout的用法)。 

Maxout

Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层

同时Maxout可以看成一个激活函数,但又与之前学习的激活函数不同,是对Relu和leaky Relu的一般化归纳

传统激活函数:

  1. maxout激活函数并不是一个固定的函数,不像Sigmod、Relu、Tanh等函数,是一个固定的函数方程。
  2. 它是一个可学习的激活函数。
  3. 它是一个分段线性函数。

然而任何一个凸函数,都可以由线性分段函数进行逼近近似。其实我们可以把以前所学到的激活函数:relu、abs激活函数,看成是分成两段的线性函数,如下示意图所示:

maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些”隐隐含层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的

作者Goodfellow从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多,如下图所示:

   

可以说relu和Leaky-relu都是maxout的特殊情况,这样maxout神经元就拥有relu单元的所有优点(线性不饱和)而没有它的缺点(死亡的relu单元),但是使用maxout网络会使参数数量成倍增长。

Elu

 ELU(Exponential Linear)是“指数线性单元”,它试图将激活函数的平均值接近零,从而加快学习的速度。同时,它还能通过正值的标识来避免梯度消失的问题。根据一些研究,ELUs分类精确度是高于ReLUs的.

SElu

SElu是Elu的改进版

其中超参 α 和 λ 的值是 证明得到 的(而非训练学习得到):

α = 1.6732632423543772848170429916717
λ = 1.0507009873554804934193349852946

SElu相比于Elu的优点:

  1. 不存在死区

  2. 存在饱和区(负无穷时, 趋于 - αλ

  3. 输入大于零时,激活输出对输入进行了放大

总结:

  •  PReLU中的ai是根据数据变化的;
  • Leaky ReLU中的ai是固定的;
  • RReLU中的aji是一个在一个给定的范围内随机抽取的值,这个值在测试环节就会固定下来。
  •  maxout的拟合能力是非常强的,但参数多

参考文献:

  1. https://blog.csdn.net/fire_light_/article/details/79542602
  2. https://blog.csdn.net/bojackhosreman/article/details/69372087
  3. https://blog.csdn.net/qq_23304241/article/details/80300149
  4. https://blog.csdn.net/u013230189/article/details/82799469
  5. https://www.cnblogs.com/tornadomeet/p/3428843.html
  6. https://www.cnblogs.com/lzida9223/p/10972783.html
  7. https://blog.csdn.net/hduxiejun/article/details/70815620
  8. https://www.jianshu.com/p/3a43a6a860ef
发布了7 篇原创文章 · 获赞 21 · 访问量 3015

猜你喜欢

转载自blog.csdn.net/qq_41389266/article/details/100079399