zoukankan      html  css  js  c++  java
  • (9)激活函数

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

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

    饱和激活函数

      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乘上一个λ而已;乘上这个λ有什么不同?乘上λ,让它在某些区域的斜率是大于1的,意味着说你进来一个比较小的变化,通过Region以后,他把你的变化放大1.0507700987倍,所以它的input能是会被放大的,而且这是他一个ELU的没有的特色。

      

      Swish

    它是一个非常神奇的激活函数,他把sigmoid乘上z得到她的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函数之间的平滑函数。

       Mish

    Diganta Misra的一篇题为“Mish: A Self Regularized Non-Monotonic Neural Activation Function”的新论文介绍了一个新的深度学习激活函数,该函数在最终准确度上比Swish(+.494%)和ReLU(+ 1.671%)都有提高。具体的想法是平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

    数学表达式:

    Mish=x * tanh(ln(1+e^x))

    应用

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

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

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

  • 相关阅读:
    UML建模之时序图(Sequence Diagram)
    UML统一建模语UML2和EnterpriseArchitect
    FTP服务器的搭建
    Ubuntu下Apache重启错误:Could not reliably determine解决
    JSP的优势 和劣势 与php的比较
    [置顶] Ajax 初步学习总结
    pv ticketlock解决虚拟环境下的spinlock问题
    Tomcat从零开始(十)Loader
    HDU 4740 The Donkey of Gui Zhou (模拟)
    关于cvScalar的那些事
  • 原文地址:https://www.cnblogs.com/super-zheng/p/13292531.html
Copyright © 2011-2022 走看看