zoukankan      html  css  js  c++  java
  • 常用激活函数总结

    引自:https://blog.csdn.net/EngineerHe/article/details/100126694

    实现代码:

    import numpy as np

    def sigmoid(x):

          y=1/(1+np.exp(-x))

         retunrn y

    def d_sigmoid(x):

         dx=sigmoid(x)(1-sigmoid(x))

         return dx;

    激活函数:

    导函数:

     当x的值趋近负无穷的时候,y趋近于0;x趋近于正无穷的时候,y趋近于1;在 [−2,2][-2, 2][−2,2] 区间内,梯度变化比较明显,即x发生很小的变化,y变化的也比较明显。

    sigmoid的优缺点:

    优点:

    Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定

    求导容易

    缺点:

    幂运算,计算成本高

    容易出现梯度弥散(反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练)

    不是以0为中心,为导致收敛速度下降

    激活函数:

     求导结果:

     tanh函数的优缺点:

    优点:只要是解决了sigmoid关于zero-centered的输出问题。导数范围变大,在(0,1)(0,1)(0,1)之间,而sigmoid在 (0,0.25)(0, 0.25)(0,0.25) 之间,梯度消失问题有所缓解。

    缺点:

    幂运算,计算成本高

    梯度消失问题

     def relu(x):

        y=(x+abs(x))/2;

       return y;

     从图上可以看出,当 x≤0x le 0x≤0 的时候,ReLu有饱和问题,当 x>0x>0x>0 的时候,则存在硬饱和(当x<0时,导数恒等于0;软饱和,导数趋近于0)。所以当 x>0x>0x>0 的时候不会存在梯度消失的问题。为了解决左硬饱和问题,提出了Leaky ReLU**、**PReLU解决方法。Leaky ReLU的函数公式为:σ(x)=max(αx,x)sigma left( x ight) = max (alpha x,x)σ(x)=max(αx,x),其中 αalphaα 是一个很小的值,这样做可以使得负轴的信息不会全部丢失,解决ReLU神经元死亡问题

     def relu(x,leaky):

        y=np.maxmum(leaky*x,x);

       return y;

    Leaky ReLU:

     PReLU和Leaky ReLU的表达式相同,σ(x)=max(αx,x)sigma left( x ight) = max (alpha x,x)σ(x)=max(αx,x),区别在于这里的 αalphaα 不是固定的,而是一个可以学习的参数。

    ReLU激活函数的优缺点

    优点:

    梯度不饱和,收敛速度快;

    相对于sigmoid/tanh激活函数,极大的改善了梯度消失的问题;

    不需要进行指数运算,因此运算速度快、复杂度低

    缺点:

    对参数初始化和学习率非常敏感,存在神经元死亡;

    ReLU的输出均值也大于0,偏移现象和 神经元死亡会共同影响网络的收敛性

     上面的内容图片公式点 这里。假如对 b1进行反向传播,求梯度,公式如上,σ(.)sigma(.)σ(.)表示激活函数,假如我们选择的是sigmoid函数,可以从上文中得知,sigmoid最大的梯度是0.25,所以在反向传播的过程中,梯度的下降呈指数下降,所以很容易造成梯度消失,使得前层网络的权值无法更新或者更新的很慢。选用ReLu函数,当 x>0x>0x>0 时,激活函数的梯度恒等于1,所以就可以大大解决了梯度消失的问题。

    ReLU激活函数导致神经元“死亡”问题

    设 y=wx+by=wx+by=wx+b 经过σ(x)sigma(x)σ(x)激活以后为a(其中的 σsigmaσ 表示ReLU),定义损失函数为 LLL

    一个简单的前馈网络传递的过程可以见到的表示如下:

     

    SigmoidSigmoid函数是传统神经网络中最常用的激活函数,虽然现在已经不常用,但当年还是十分受欢迎的。Sigmoid函数也叫Logistic 函数,值域在0到1之间。
    Sigmoid函数的表达式及其求导:σ(x)=11+e−x∂σ(x)∂x=e−x1+e−x=σ(x)(1−σ(x))egin{array}{l}sigma left( x ight) = frac{1}{{1 + {e^{ - x}}}}\frac{{partial sigma left( x ight)}}{{partial x}} = frac{{{e^{ - x}}}}{{1 + {e^{ - x}}}} = sigma left( x ight)left( {1 - sigma left( x ight)} ight)end{array}σ(x)= 1+e −x 1​ ∂x∂σ(x)​ = 1+e −x e −x ​ =σ(x)(1−σ(x))​ 
    import numpy as np# sigmoid函数def sigmoid(x):    y = 1/(1+np.exp(-x))    return y# sigmoid函数求导def d_sigmoid(x):    dx = sigmoid(x)*(1-sigmoid(x))    return dx123456789sigmoid激活函数


    sigmoid函数导数


    当x的值趋近负无穷的时候,y趋近于0;x趋近于正无穷的时候,y趋近于1;在 [−2,2][-2, 2][−2,2] 区间内,梯度变化比较明显,即x发生很小的变化,y变化的也比较明显。
    sigmoid的优缺点:
    优点:
    Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定求导容易缺点:
    幂运算,计算成本高容易出现梯度弥散(反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练)不是以0为中心,为导致收敛速度下降————————————————版权声明:本文为CSDN博主「黑暗主宰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/EngineerHe/article/details/100126694

  • 相关阅读:
    关于float与double
    【编程实践】母牛生小牛
    wlan的QOS配置
    C语言itoa函数和atoi 函数
    类似于QQ的简单的聊天代码
    多线程吃饺子练习
    线程练习
    接口练习
    电视练习
    5.22
  • 原文地址:https://www.cnblogs.com/lyp1010/p/13289295.html
Copyright © 2011-2022 走看看