zoukankan      html  css  js  c++  java
  • 深度学习—常见激活函数对比

    1、为什么使用激活函数?

      如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
      如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

    2、都有什么?

      (1)sigmoid函数

      公式:

         

      曲线:   

         

      也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
      在特征相差比较复杂或是相差不是特别大时效果比较好。

      缺点:(1)容易产生梯度消失,导致训练出现问题,

            (2)输出不是以0为中心的。

      出现梯度消失原因:

      当神经元的激活在接近0或1处时会饱和,在这些区域,梯度几乎为0。

      在反向传播的时候,这个(局部)梯度将会与整个损失函数关于该门单元输出的梯度相乘。因此,如果局部梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,几乎就有没有信号通过神经元传到权重再到数据了。还有,为了防止饱和,必须对于权重矩阵初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习了。

          函数导数: 

       (2)Tanh函数

      公式:双曲正切函数,tanh神经元是一个简单放大的sigmoid神经元,

      

      曲线:  

      

      tanh非线性函数图像如上图右边所示。它将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。

      (3)ReLU

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

      公式:

      

      曲线:

       

       优点:

      (1)ReLU 在x0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题

      (2)relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,造成了网络的稀疏性,缓解过拟合

      (3)relu计算简单,采用sigmoid等函数,反向传播求误差梯度时,计算量大,而采用Relu激活函数,整个过程的计算量节省很多

      缺点:

      在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

       改进版,Leaky ReLU。

      表达式:f(x) = max(0.01x, x)

      曲线:

      

      Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。

      有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。Kaiming He等人在2015年发布的论文Delving Deep into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。然而该激活函数在在不同任务中均有益处的一致性并没有特别清晰。

       (4)softmax函数

       Softmax - 用于多分类神经网络输出。

      公式:

      

      就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类

      为什么要取指数,第一个原因是要模拟 max 的行为,所以要让大的更大。第二个原因是需要一个可导的函数

    3. sigmoid ,ReLU, softmax 的比较

       (1)Sigmoid 和 ReLU 比较:

        (1)对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失)。而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象。

        (2)relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,造成了网络的稀疏性,缓解过拟合。

        (3)relu计算简单,采用sigmoid等函数,反向传播求误差梯度时,计算量大,而采用Relu激活函数,整个过程的计算量节省很多。

       (2)Sigmoid 和 Softmax 区别:

         sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。 

        而softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。

        二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题。

         多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

    总结:

      (1)以上就是一些常用的神经元及其激活函数。最后需要注意一点:在同一个网络中混合使用不同类型的神经元是非常少见的,虽然没有什么根本性问题来禁止这样做。

      (2)一句话:“那么该用那种呢?”用ReLU非线性函数。注意设置好学习率,或许可以监控你的网络中死亡的神经元占的比例。

      (3)如果单元死亡问题困扰你,就试试Leaky ReLU或者Maxout,不要再用sigmoid了。也可以试试tanh,但是其效果应该不如ReLU或者Maxout。

     转载自:https://www.jianshu.com/p/22d9720dbf1a

  • 相关阅读:
    [LeetCode 220.] 存在重复元素 III
    C++ 构造函数 & 析构函数
    [LeetCode 891.] 子序列宽度之和【hard】
    [LeetCode 447.] Number of Boomerangs
    HJ93 数组分组
    HJ77 火车进站
    [LeetCode 338.] 比特位计数
    线段树
    大数量问题的一般解决方法
    字典树
  • 原文地址:https://www.cnblogs.com/eilearn/p/9028394.html
Copyright © 2011-2022 走看看