激活函数 (Sigmod、tanh、Relu)

什么是激活函数

  激活函数(Activation functions)对于人工神经网络 [1]  模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
                                                                               图1

为什么要用激活函数

  如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。
  如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
 
特点及使用场景

  1、Sigmod激活函数

  公式:

  曲线:

  也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1)。
  它可以将一个实数映射到(0,1)的区间,可以用来做二分类。(它不像SVM直接给出一个分类的结果,Logistic Regression给出的是这个样本属于正类或者负类的可能性是多少,当然在多分类的系统中给出的是属于不同类别的可能性,进而通过可能性来分类。)

  Sigmod函数优点
  输出范围有限,数据在传递的过程中不容易发散。
  输出范围为(0,1),所以可以用作输出层,输出表示概率。
  抑制两头,对中间细微变化敏感,对分类有利。
  在特征相差比较复杂或是相差不是特别大时效果比较好。

  sigmoid缺点:
  激活函数计算量大,反向传播求误差梯度时,求导涉及除法反向传播时很容易就会出现梯度消失的情况,从而无法完成深层网络的训练(sigmoid的饱和性)

  下面解释为何会出现梯度消失:

  反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:

                                                                             

  sigmoid 原函数及导数图形如下:

                   
 
  从上图可以看到,其两侧导数逐渐趋近于0 ,具有这种性质的称为软饱和激活函数。具体的,饱和又可分为左饱和与右饱和。与软饱和对应的是硬饱和, 即sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,的导数就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。
  Sigmoid 的 output 不是0均值,这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果数据进入神经元的时候是正的(e.g.x>0   elementwise  in  f=wTx+be.g.x>0   elementwise  in  f=wTx+b),那么 w 计算出的梯度也会始终都是正的。 
  当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

  (2) Tanh函数

  公式

f’(z)=4sigmoid‘(2z)

  曲线

  也称为双切正切函数,取值范围为[-1,1]。
  tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好,然而,tanh一样具有软饱和性,从而造成梯度消失。

  (3) ReLU

  Rectified Linear Unit(ReLU) - 用于隐层神经元输出

  公式

  

  曲线

  输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入

  ReLU 的优点:
  Krizhevsky et al     . 发现使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多。除此之外,当x<0时,ReLU硬饱和,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。这让我们能够直接以监督的方式训练深度神经网络,而无需依赖无监督的逐层预训练。

  ReLU 的缺点:
  随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。与sigmoid类似,ReLU的输出均值也大于0,偏移现象 和 神经元死亡会共同影响网络的收敛性。

   

  eaky-ReLU、P-ReLU、R-ReLU

  (1)Leaky ReLUs: 就是用来解决这个 “dying ReLU” 的问题的。与 ReLU 不同的是:  

  这里的 

此处输入图片的描述

  关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。

此处输入图片的描述

 

  数学表示如下:

此处输入图片的描述

 

  maxout

       参考:https://blog.csdn.net/hjimce/article/details/50414467

 Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。 可以注意到,ReLU 和 Leaky ReLU 都是它的一个变形(比如,Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多。
  我们在一层同时训练n组参数,然后选择激活值最大的作为下一层神经元的激活值

此处输入图片的描述

  所以,Maxout 具有 ReLU 的优点(如:计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:容易 go die)。不过呢,还是有一些缺点的嘛:就是把参数double了。

还有其他一些激活函数,请看下表:

此处输入图片的描述
此处输入图片的描述

  怎么选择激活函数呢?

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

友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。

Reference

[1]. http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-10.html 
[2]. http://papers.nips.cc/paper/874-how-to-choose-an-activation-function.pdf 
[3]. https://en.wikipedia.org/wiki/Activation_function 
[4]. http://cs231n.github.io/neural-networks-1/

原文地址:https://www.cnblogs.com/kang06/p/9371420.html