激活函数

一、 什么是激活函数

所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。

  激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。 那么激活函数应该具有什么样的性质呢?

  可微性: 当优化方法是基于梯度的时候,这个性质是必须的。 
  单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。 
  输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况少,一般需要更小的learning rate。

二、 激活函数的作用

  在生物的神经传导中,神经元接受多个神经的输入电位,当电位超过一定值时,该神经元激活,输出一个变换后的神经电位值。而在神经网络的设计中引入了这一概念,来增强神经网络的非线性能力,更好的模拟自然界。所以激活函数的主要目的是为了引入非线性能力,即输出不是输入的线性组合

  假设下图中的隐藏层使用的为线性激活函数(恒等激活函数:a=g(z)),可以看出,当激活函数为线性激活函数时,输出不过是输入特征线性组合(无论多少层),而不使用神经网络也可以构建这样的线性组合。而当激活函数为非线性激活函数时,通过神经网络的不断加深,可以构建出各种有趣的函数。

 三、 常见激活函数

1、sigmoid函数

  能将输入值映射到0-1范围内,目前很少用作隐藏层的激活函数,用在二分类中预测最后层输出概率值。函数特点如下

  优点

  1. 它能够把输入的连续实值变换为0和1之间的输出,适合做概率值的处理。
    • 如果是非常大的负数,那么输出就是0
    • 如果是非常大的正数,输出就是1

  缺点

  1、梯度消失

    我们从上图可以看出,当x较大或者较小时,sigmoid输出趋近0或1,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0。Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。这种情况就是梯度消失。梯度一旦消失,参数不能沿着loss降低的方向优化,

  2、不是以零为中心

  通过Sigmoid函数我们可以知道,Sigmoid的输出值恒大于0,输出不是0均值(既zero-centered),这会导致后一层的神经元将得到上一层输出的非0均值的输入。

  举例来讲如果xi恒大于0,那么对其wi的导数总是正数或总是负数,向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。且可能导致陷入局部最小值。当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的

 2、 tanh函数

  Tanh 激活函数又叫作双曲正切激活函数(hyperbolic tangent activation function)。与 Sigmoid 函数类似,但 Tanh 函数将其压缩至-1 到 1 的区间内,输出是zero-centered的(零为中心),在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值。

  优点

  1. sigmoid的优点他都有,另外 tanh的输出是zero-centered,以0为中心

  缺点

  1、特殊情况存在梯度消失问题

  当输入值过大或者过小,提取趋近于0,失去敏感性,处于饱和状态。

3、 ReLU函数

 相较于sigmoid和tanh函数,计算比较简单,收敛速度较快,是目前主要的激活函数。对比sigmoid类函数主要变化是:

  1)单侧抑制;

  2)相对宽阔的兴奋边界;

  3)稀疏激活性。

  优点:

  1. ReLU的计算量小,收敛速度很快,因为sigmoid和tanh有指数运算
  2. 正区间(x>0)解决了梯度消失问题。图像数据是在(0~255)之间,即便归一化处理值也大于0,但是音频数据有正有负,不适合relu函数

  缺点:

  1. ReLU的输出不是zero-centered
  2. RuLU在训练的时候很容易导致神经元“死掉”

死掉:一个非常大的梯度经过一个 ReLU 神经元更新过参数之后,这个神经元再也不会被任何数据激活,相应的权重永远不会更新。有两种原因导致这种情况:

  1、非常不幸的初始化。

  2、学习率设置的太高导致在训练过程中参数更新太大

  解决方法是使用Xavier初始化方法,合理设置学习率,会降低这种情况的发生概率。或使用Adam等自动调节学习率的算法。

补充:ReLU相比sigmoid和tanh的一个缺点是没有对上界设限,在实际使用中,可以设置一个上限,如ReLU6经验函数: f(x)=min(6,max(0,x))

4、 Leaky ReLU(泄露型线性整流函数)

  LeakyReLU中的斜率a是自定义的,PReLU中的a是通过训练学习得到的,LeakyReLU是为了解决“ReLU死亡”问题的尝试

ReLU 中当 x<0 时,函数值为 0 。而 Leaky ReLU 则是给出一个很小的负数梯度值,比如 0.01 。有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定

 

5、PReLU函数

  Parameterised ReLU(PReLU,参数化线性整流函数),在RReLU中,负值的斜率ai在训练中是随机的,ai是可学习的,如果ai=0,那么 PReLU 退化为ReLU;如果ai是一个很小的固定值(如a= 0.01),则 PReLU 退化为 Leaky ReLU。

  ai在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aiai是从一个均匀的分布U(I,u)U(I,u)中随机抽取的数值。形式上来说,我们能得到以下数学表达式:

                                                                                         

其中aiU(x,y),(x,y)x,y[0,1]ai∼U(x,y),区间(x,y)上的均匀分布;x,y∈[0,1]

  优点

    (1)PReLU只增加了极少量的参数,也就意味着网络的计算量以及过拟合的危险性都只增加了一点点。特别的,当不同channels使用相同的a时,参数就更少了。

    (2)BP更新a时,采用的是带动量的更新方式,如下:

                                                                                    

 6、 softmax函数

  softmax用于多分类神经网络输出,如果某一个ai大过其他z,那这个映射的分量就逼近1,其他就逼近0,主要应用于“分类”。

                                         

作用:把神经元中线性部分输出的得分值(score),转换为概率值。softmax输出的是(归一化)概率,

 含有softmax激活函数的网络层有这样一个性质:

                                                                

 四、 如何选择激活函数

这个问题目前没有确定的方法,凭一些经验吧。

  1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。

  2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU。

  3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

 参考文献

原文地址:https://www.cnblogs.com/saseng/p/13647606.html