zoukankan      html  css  js  c++  java
  • 神经元与常用的激活函数


    神经网络与深度学习-邱锡鹏》读书笔记

    神经元

    神经元是构成神经网络的基本单元,神经元的结构如下图所示:  

               

    假设一个神经元接收D个输入$x_1,x_2,...x_D$,令向量$x=[x_1;x_2;...;x_D]$来表示这组输入,并用净输入$z$表示一个神经元所获得的输入信号$x$的加权和,

                                                    $z={sum}_{d=1}^{D} w_d x_d+b = w^Tx+b$

            其中,$w=[w_1;w_2;...;w_D]$是D维的权重向量,b是偏置。

            净输入$z$在经过一个非线性函数$f(·)$后,得到神经元的活性值$a$,

                                                    $a=f(z)$,

            其中非线性函数$f(·)$称为激活函数(Activation Function).

     激活函数

    激活函数:激活函数在神经元中非常重要,为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质

    1. 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数
    2. 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率
    3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性

    常用的激活函数

    种类:

    1. Sigmoid型函数:Logistic、Tanh
    2. ReLU(Rectified Linear Unit,修正线性单元)函数
    3. Swish函数(是一种自门控(Self-Gated)激活函数)
    4. GELU(Gaussian Error Linear Unit,高斯误差线性单元)
    5. Maxout单元(一种分段线性函数)

     详细介绍:

    Sigmoid型函数

    1.1 Logistic激活函数

    函数定义为       ${sigma}(x)=frac{1}{1+exp(-x)}$      exp,高等数学里以自然常数e为底的指数函数,exp(-x)即 $e^{-x}$

    1.2 Tanh激活函数

    函数定义为       $tanh(x)=frac{exp(x)-exp(-x)}{exp(x)+exp(-x)}$   

    1.3 Hard-Logistic函数和Hard-Tanh函数

    Logistic函数和Tanh函数都是Sigmoid型函数,具有饱和性,但是计算开销较大。

    Logistic函数在0附近的一阶泰勒展开为    $g_l(x){approx}{sigma}(0)+x*{sigma}'(0) = 0.25x+0.5$

                          这样Logistic函数可以用分段函数hard-logistic(x)来近似

    egin{equation}
    hard-logistic(x)=left {
    egin{array}{ll}
    1 & g_l(x) ge 1 \
    g_l & 0<g_l(x)<1 \
    0 & g_l(x) le 0
    end{array} ight. \
    = max(min(g_l(x),1),0) \
        = max(min(0.25x+0.5,1),0)
    end{equation}

    同样,Tanh函数在0附近的一阶泰勒展开为      $g_l(x)approx tanh(0)+x*tanh'(0)=x$

                          $hard-tanh(x)=max(min(g_t(x),1),-1)=max(min(x,1),-1)$

     ReLU函数

    1.1 ReLU函数

     ReLU(Rectified Linear Unit,修正线性单元),也叫Rectifier函数,是目前深度网络中经常使用的激活函数,ReLU实际上是一个斜坡(ramp)函数,定义为

    egin{equation}
    ReLU(x)= left {
    egin{array}{ll}
    x & x ge 0 \
    0 & x<0
    end{array} ight. \
    =max(0,x)
    end{equation}

     优点:采用ReLU的神经元只需要进行加、乘和比较的操作,计算上更加高效,ReLU函数也被认为具有生物学合理性,比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高),Sigmoid型激活函数会导致一个非稀疏的神经网络,而ReLU却具有很好的稀疏性,大约50%的神经元会处于激活状态;在优化方面,相比于Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,且在x>0时导数为1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。

    缺点:ReLU函数的输出是非零中心化的,给后一层的神经网络引入偏执偏移,会影响梯度下降的效率。此外ReLU神经元在训练时比较容易“死亡”,在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活。这种现象称为死亡ReLU问题,并且也有可能发生在其他隐藏层。

    在实际使用中,为了避免上述情况,有几种ReLU的变种也会被广泛使用。

    1.2 带泄露、参数的ReLU

     带泄露的ReLU(Leaky ReLU)在输入x<0时,保持一个很小的梯度$ gamma $,这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活,带泄露的ReLU的定义如下:

    egin{equation}
    LeakyReLU(x) = left{
    egin{array}{ll}
    x & ext{if x > 0} \
    gamma x & ext{if x $le$ 0}
    end{array} ight. \
    =max(0,x) + gamma min(0,x).
    end{equation}

    其中$gamma$是一个很小的常熟,比如0.01.当$gamma$<1时,带泄露的ReLU也可以写为:LeakyReLU(x)=max(x,$gamma x$),相当于是一个比较简单的maxout单元。

     带参数的ReLU(Parametric ReLU,PReLU)引入一个可学习的参数,不同神经元可以有不同的参数。对于第i个神经元,其PReLU的定义为

    egin{equation}
    LeakyReLU(x) = left{
    egin{array}{ll}
    x & ext{if x > 0} \
    gamma_i x & ext{if x $le$ 0}
    end{array} ight. \
    =max(0,x) + gamma_i min(0,x).
    end{equation}

     其中$gamma_i$为$x le 0$时函数的斜率。因此,PReLU是非饱和函数。如果$gamma_i = 0$,那么PReLU就退化为ReLU.如果$gamma_i$为一个很小的常数,则PReLU可以看作带泄露的ReLU.PReLU可以允许不同神经元具有不同的参数,也可以一组神经元共享一个参数。

    1.3 ELU

     ELU(Exponential Linear Unit,指数线性单元)是一个近似的零中心化的非线性函数,其定义为

    egin{equation}
    ELU(x) = left{
    egin{array}{ll}
    x & ext{if x > 0} \
    gamma_i(exp(x)-1) & ext{if x $le$ 0}
    end{array} ight. \
    =max(0,x) + gamma_i min(0,x).
    end{equation}

    其中$gamma ge 0$是一个超参数,决定$x le 0$时的饱和曲线,并调整输出均值在0附近。

    1.4 Softplus

    Softplus函数可以看作Rectifier函数的平滑版本,其定义为:Softplus(x)=log(1+exp(x)).  Softplus函数其导数刚好是Logistic函数.Softplus函数虽然也具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。

    Swish函数 

    Swish函数,是一种自门控(Self-Gated)激活函数,定义为:

    $swish(x) = x sigma (eta x)$

    其中$sigma(·)$为Logistic函数,$eta$为可学习的参数或一个固定超参数.$sigma(·) in(0,1)$可以看作一种软性的门控机制.当$sigma(eta x)$接近于1时,门处于“开”状态,激活函数的输出近似于x本身;当$sigma (eta x)$接近于0时,门的状态为“关”,激活函数的输出近似于0.

      当$eta = 0$时,Swish函数变成线性函数x/2.当$eta = 1$时,Swish函数在x>0时近似线性,在x<0时近似饱和,同时具有一定的非单调性.当$eta o + infty$时,$sigma(eta x)$趋向于离散的0-1函数,Swish函数近似为ReLU函数.因此,Swish函数可以看作线性函数和ReLU函数之间的非线性插值函数,其程度由参数$eta$控制.

    GELU函数

    GELU(Gaussian Error Linear Unit,高斯误差线性单元)也是一种通过门控机制来调整其输出值的激活函数,和Swish函数比较类似.

    $GELU(x)=xP(X le x)$ 

     其中$P(X le x)$是高斯分布$mathcal{N}(mu, sigma^2)$的累积分布函数,其中$mu,sigma$为超参数,一般假设$mu = 0,sigma = 1即可$。由于高斯分布的累积分布函数为S型函数,因此GELU函数可以用Tanh函数或Logistic函数来近似,

    $GELU(x) approx 0.5x Big( 1 + tanh ig( sqrt{ frac{2}{pi} } (x + 0.044715 x^3) ig) Big)$

    或   $GELU(x) approx x sigma(1.702x)$

     当使用Logistic函数来近似时,GELU相当于一种特殊的Swish函数。

    Maxout单元

    Maxout单元[Goodfellow et al,2013]也是一种分段线性函数(采用Maxout单元的神经网络也叫作Maxout网络). Sigmoid型函数、ReLU等激活函数的输入是神经元的净输入z,是一个标量.而Maxout单元的输入是上一层神经元的全部原始输出,是一个向量$x=[x_1;x_2; cdot cdot cdot;x_D].$

    每个Maxout单元有K个权重向量$w_k in mathbb{R}^D$和偏置b_k(1 le k le K).对于输入$x$,可以得到K个净输入z_k,$1 le k le K$.

    $z_k=w_k^Tx+b_k$

    其中$w_k=[w_k,1,cdot cdot cdot,w_k,D]^T$为第k个权重向量.

    Maxout单元的非线性函数定义为

    $maxout(x)=max({z_k})$ , $k in [1,K]$

    Maxout单元不单是净输入到输出之间的非线性映射,而是整体学习输入到输出之间的非线性映射关系.Maxout激活函数可以看作任意凸函数的分段线性近似,并且在有限的点上不可微的.

  • 相关阅读:
    Swing 添加Esc快捷键退出程序
    DefaultTableCellRenderer 自定义
    项目清理和删除svn信息(转)
    时间转换工具类
    Java Swing 日期控件(转载)
    Eureka原理
    SpringCloud之Eureka注册中心集群篇
    spring boot及spring cloud介绍
    spring cloud 服务注册/发现/提供/调用 demo
    eclipse构建maven+scala+spark工程
  • 原文地址:https://www.cnblogs.com/go-ahead-wsg/p/13750995.html
Copyright © 2011-2022 走看看