常见的**函数及其优缺点分析

时间:2024-04-01 07:33:09

常见的**函数及其优缺点分析

在上一章我们总体介绍了一下卷积神经网络的框架,其中谈到了**函数的作用,今天我们来具体分析一下都有哪些**函数,他们各自的特点是什么,以及我在学习时的疑问与解答
(部分截图来源于网络,如有侵权,烦请告知)

一、 sigmoid函数

  • 特点:所有元素都被压缩在[0,1]范围内,当输入数字很大或很小时,图像都趋于平滑,在0附近趋于线性;其函数表达式和图像如下所示
    常见的**函数及其优缺点分析
    常见的**函数及其优缺点分析
    sigmoi函数是比较原始的**函数,现在已经不太常用了,主要因为它有以下3个问题:
  1. sigmoid函数饱和会导致梯度消失
    当x是很小的负数或很大的正数时,它们都处于sigmoid函数的平滑区域,这些区域的梯度就会消失,从而无法得到梯度流的反馈。(关于其梯度的计算,可以参照下面的推导,也可以之间看图的斜率)
    常见的**函数及其优缺点分析
  2. sigmoid是一个非零中心的函数
    常见的**函数及其优缺点分析
    在讲到这儿的时候,大家可能都看到过这个图,这是我当时很困惑的点,这个图到底是什么意思,为什么可能更新的方向是这样
    在这里我首先要更正一下课程中的图,它实质是锯齿状,并不是完全在垂直方向或水平方向
    常见的**函数及其优缺点分析
    下面我通过一个例子让大家看得更清楚一点。由sigmoid函数特点可知,假设上一级神经元采用了sigmoid**函数,那么它输出的就全是[0,1]之间的数,即输入到这一级神经元的数x均大于0,下图的推导给大家展示了整个过程,可以看出它在走Z 字形逼近最优解,收敛速度很慢;
    常见的**函数及其优缺点分析
    常见的**函数及其优缺点分析由此我们知道,如果使用sigmoid函数作为**函数,所有W的梯度要么全正,要么全负,但如果换一个以0为中心的**函数,W的梯度就可以同时有正有负,直接逼近最优解;所以我们一般不用sigmoid函数作为**函数。
  3. 指数函数的计算代价有点高
    尽管这在这个复杂神经网络框架中不值一提,但仍然是我们需要注意的一小点

二、tanh函数

常见的**函数及其优缺点分析
常见的**函数及其优缺点分析

  • 它看起来和sigmoid函数非常相似,但不同之处在于,它将输出值变换到了[-1,1]的范围内,这就解决了sigmoid函数以非0为中心的问题,但它仍然有梯度消失的问题;

三、ReLU函数

常见的**函数及其优缺点分析
常见的**函数及其优缺点分析

  • 这就是我们上一章讲到的卷积神经网络中常用的**函数,与前两个**函数相比,ReLU函数不会在正的区域产生饱和现象,也就是在正的区域不会有梯度消失,这是一个很大的优势;它的计算成本也不高,且收敛速度大概是前两种的6倍;
  • 但是我们注意到,它也是以非0为中心的,所以tanh刚刚解决的问题现在又出现了
  • 此外,ReLU函数会产生Dead ReLU Problem(这就是我困惑的第二个点了,为什么会说梯度过大,或者学习率过大就会出现神经元死亡?
    首先,我们来解释一下什么叫Dead ReLU Problem,它指的是某些神经元可能永远不会被**,导致相应的参数永远不能被更新训练神经网络的时候;举个例子,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被**。因为:ReLU的导数在x>0的时候是1,在x<=0的时候是0。如果x<=0,那么ReLU的输出是0,那么反向传播中梯度也是0,权重就不会被更新,导致神经元不再学习。
    关于这个问题详细的解释大家可以移步知乎使用relu存在梯度过大导致神经元“死亡”,怎么理解?

总体来说,ReLU函数具有以下优点

1)采用sigmoid等函数,算**函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu**函数,整个过程的计算量节省很多。
2)对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,从而无法完成深层网络的训练。
3)ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

四、Leaky ReLU函数

常见的**函数及其优缺点分析
常见的**函数及其优缺点分析

  • 在上文中我们提到,ReLU将所有的负值设置为0,造成神经元节点死亡情况。因此Leaky ReLU对其做了一个改进,给所有负值赋予一个非零的斜率,这样,不管输入是正是负,都不会有饱和的现象。

五、PReLU

常见的**函数及其优缺点分析

  • 这里的参数α既不需要指定,也不需要硬编码,而是把它当做一个可以反向传播和学习的参数

六、ELU函数

常见的**函数及其优缺点分析
常见的**函数及其优缺点分析

  • ELU可看作是介于ReLU和Leaky ReLU之间的一种折中函数,具有Leaky ReLU的形状、使输出均值更接近0,但在负值区域仍然会接近饱和

七、Maxout 函数

常见的**函数及其优缺点分析

  • 这样不会出现饱和也不会出现死亡神经元,但是它会使每个神经元的参数翻倍

最后一个问题,我们之前说到,**函数主要作用是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。那么,ReLU函数到底是线性函数还是非线性函数?( 在此引用一位前辈的回答)链接

1、首先什么是线性的网络,如果把线性网络看成一个大的矩阵M。那么输入样本A和B,则会经过同样的线性变换MA,MB(这里A和B经历的线性变换矩阵M是一样的)。
2、的确对于单一的样本A,经过由relu**函数所构成神经网络,其过程确实可以等价是经过了一个线性变换M1,但是对于样本B,在经过同样的网络时,由于每个神经元是否**(0或者Wx+b)与样本A经过时情形不同了(不同样本),因此B所经历的线性变换M2并不等于M1。因此,relu构成的神经网络虽然对每个样本都是线性变换,但是不同样本之间经历的线性变换M并不一样,所以整个样本空间在经过relu构成的网络时其实是经历了非线性变换的。
3、还有一种解释就是,不同样本的同一个feature,在通过relu构成的神经网络时,流经的路径不一样(relu**值为0,则堵塞;**值为本身,则通过),因此最终的输出空间其实是输入空间的非线性变换得来的。
4、更极端的,不管是tanh还是sigmoid,你都可以把它们近似看成是分段线性的函数(很多段),但依然能够有非线性表达能力;relu虽然只有两段,但同样也是非线性**函数,道理与之是一样的。

综上所示,ReLU的性能最好,后面介绍的Leaky ReLU、PReLU、ELU和Maxout 实质上都是ReLU的变形或者说改进,在选择**函数时,我们一般的建议是

  1. 优先使用ReLU,但是要很谨慎地调整学习速率;
  2. 可以尝试Leaky ReLU、PReLU、ELU和Maxout等;
  3. 可以尝试使用tanh,但效果可能不会太好;
  4. 最好不要使用sigmoid;