常用激活函数总结

引自: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 \right) = \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 \right) = \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))\begin{array}{l}\sigma \left( x \right) = \frac{1}{{1 + {e^{ - x}}}}\\\frac{{\partial \sigma \left( x \right)}}{{\partial x}} = \frac{{{e^{ - x}}}}{{1 + {e^{ - x}}}} = \sigma \left( x \right)\left( {1 - \sigma \left( x \right)} \right)\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

posted @ 2020-07-12 18:22  19l92y11p26  阅读(325)  评论(0编辑  收藏  举报
/*鼠标跟随效果*/ /* 点击爆炸效果*/
/*鼠标跟随效果*/
Live2D