码迷,mamicode.com
首页 > 其他好文 > 详细

(9)激活函数

时间:2020-07-13 14:04:28      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:分析   image   其他   line   rar   nis   线性变换   width   margin   

技术图片

 

 

 

如果我们不使用过激活函数,那么输出将是输入的线性变换,无论最终多少层,都只是线性变换,为了增强神经网络学习任何函数的能力,需要在其中引入非线性的单元,这个单元就是激活函数。

激活函数大致分为两类,饱和和非饱和:

技术图片

饱和激活函数

  Sigmoid

Sigmoid 是常用的非线性的激活函数,它的数学形式如下:

技术图片

 

 

 技术图片技术图片

如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,由于sigmoid函数的导数最大为1/4,所以会导致越乘越小,最终导致梯度消失;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。
数学分析见文章::https://www.jianshu.com/p/917f71b06499

Sigmoid 的 output 不是0均值(即zero-centered)。这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间.

 

  Tanh

tanh函数解析式:

技术图片

 

 

 技术图片技术图片

 

 

 它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

 

非饱和激活函数

  ReLU

Relu函数的解析式:

技术图片

 

 

 技术图片

 

 

 

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
(1)ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和;

(2)由于ReLU线性、非饱和的形式,在SGD中能够快速收敛;

(3)算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快

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

为了解决神经元节点死亡的情况,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函数。

 

  Leaky ReLU(PReLU)

函数表达式:

技术图片

 

 

 技术图片

 

 

 

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx \alpha xαx而非0,通常α=0.01 \alpha=0.01α=0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x) Parametric ReLU:f(x) = \max(\alpha x, x)ParametricReLU:f(x)=max(αx,x),其中α \alphaα
可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

  RReLU

RReLU的英文全称是“Randomized Leaky ReLU”,中文名字叫“随机修正线性单元”。RReLU是Leaky ReLU的随机版本。它首次是在Kaggle的NDSB比赛中被提出来的,其图像和表达式如下图所示:

技术图片

 

 

 

技术图片

 

 

 

RReLU的核心思想是,在训练过程中,α是从一个高斯分布技术图片中随机出来的值,然后再在测试过程中进行修正。在测试阶段,把训练过程中所有的技术图片取个平均值。

  

  ELU (Exponential Linear Units)

它试图将激活函数的输出平均值接近零,从而加快学习速度函数表达式:

技术图片

 

 

 技术图片

 

 

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

 

  SELU

扩展型指数线性单元激活函数比较新,介绍它的论文包含长达 90 页的附录(包括定理和证明等)。当实际应用这个激活函数时,必须使用 lecun_normal 进行权重初始化。如果希望应用 dropout,则应当使用 AlphaDropout。

技术图片

 

 

 它相对于ELU做了一个新的变化:就是现在把每一个值的前面都乘上一个技术图片,然后他告诉你说技术图片技术图片应该设多少,这是作者推导出来的,很麻烦的推导,详情也可以看作者的github:https://github.com/bioinf-jku/SNNs

技术图片

 

 

 

 

 

 

 

其他的ReLU他们没有Saturation Region,但是他有Saturation Region,不过ELU其实也有Saturation Region,因为SELU就只是ELU乘上一个技术图片而已;乘上这个技术图片有什么不同?乘上技术图片,让它在某些区域的斜率是大于技术图片的,意味着说你进来一个比较小的变化,通过Region以后,他把你的变化放大1.0507700987倍,所以它的input能是会被放大的,而且这是他一个ELU的没有的特色。

  

  Swish

它是一个非常神奇的激活函数,他把sigmoid乘上技术图片得到她的output:

技术图片

技术图片

技术图片

 

 

 β是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分类准确率提高 0.9%,Inception-ResNet-v 的分类准确率提高 0.6%。

当β = 0时,Swish变为线性函数f(x)=x/2
β → ∞, σ(x)=(1+exp(x))1。  为0或1. Swish变为ReLU: f(x)=2max(0,x)。Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数。

 

应用

(1)通常来说,不能把各种激活函数串起来在一个网络中使用。

(2)首先尝试ReLU,速度快。如果使用ReLU,那么一定要小心设置学习率(learning rate),并且要注意不要让网络中出现很多死亡神经元。如果死亡神经元过多的问题不好解决,可以试试Leaky ReLU、PReLU、或者Maxout。

(3)尽量不要使用sigmoid激活函数,可以试试tanh,不过我还是感觉tanh的效果会比不上ReLU和Maxout,sigmoid/tanh在RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值;

 

 

(9)激活函数

标签:分析   image   其他   line   rar   nis   线性变换   width   margin   

原文地址:https://www.cnblogs.com/super-zheng/p/13292531.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!