常用激活函数_常用激活函数(激励函数)理解与总结 - CSDN
精华内容
参与话题
  • 几种常用激活函数

    千次阅读 2018-08-30 15:41:41
    1. sigmod函数 函数公式和图表如下图   在sigmod函数中我们可以看到,其输出是在[0,1]这个开区间内,我们可以联想到概率,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元...

    1. 激活函数

    如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。

    1.1 激活函数的作用:

    如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。 
    如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 

    激活函数的主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。

    上图中我们对output进行计算(这里i1代表input1,i2代表input2):

    我们将公式转化一下可以得到:

    我们假设outpu=0

    最后我们发现函数的又回到了y=X*W的模式,即线性模式。所以现在神经元的学习能力是非常有限的。解决不了非线性的问题,所以叠加简单的神经网络解决不了非线性的问题。

    1.2 激活函数特性:

    • 可微性: 当优化方法是基于梯度的时候,这个性质是必须的。 
    • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。 
    • 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate。

     

    2. 各种激活函数

    2.1 sigmod函数

     

     

    函数公式和图表如下图

    sigmod函数公式 
    sigmod函数图

    在sigmod函数中我们可以看到,其输出是在[0,1]这个开区间内,我们可以联想到概率,可以被表示做为概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。

    当然,流行也是曾经流行,这说明函数本身是有一定的缺陷的。

    1. 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,我们都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmod函数,这个链条上的微分就很小很小了,况且还可能经过很多个sigmod函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散(梯度消失)。
    2. 函数输出不是以0为中心的,这样会使权重更新效率降低。因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。(不过有一种常用的解决方案是,将最终函数值减去0.5)
    3. sigmod函数要进行指数运算,这个对于计算机来说训练效率是比较慢的。

    具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个 f′(x)f′(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f′(x)f′(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

    此外,sigmoid函数的输出均大于0,使得输出不是0均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 

     

    2.2 tanh函数

    tanh函数公式和曲线如下

    tanh函数公式 

    tanh的变形


    tanh函数图

    tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。

    一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。不过这些也都不是一成不变的,具体使用什么激活函数,还是要根据具体的问题来具体分析,还是要靠调试的。

     

    2.3 ReLU函数

    ReLU函数公式和曲线如下

    relu函数公式 
    relu函数图

    ReLU(Rectified Linear Unit)函数是目前比较火的一个激活函数,相比于sigmod函数和tanh函数,它有以下几个优点:

    1. Krizhevsky发现使用 ReLU 得到的SGD的收敛速度会比sigmoid/tanh 快很多。有人说这是因为它是linear,而且梯度不会饱和
    2. 计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)

    当然,缺点也是有的:

    1. ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
    2. 我们发现ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。

     

    2.4 ELU函数

    ELU函数公式和曲线如下图

    elu函数公式 
    elu函数图

    ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。

     

    2.5 PReLU函数

    PReLU函数公式和曲线如下图

    prelu公式 
    prelu函数图

    PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。

    我们看PReLU的公式,里面的参数α一般是取0~1之间的数,而且一般还是比较小的,如零点零几。当α=0.01时,我们叫PReLU为Leaky ReLU,算是PReLU的一种特殊情况吧。

     

    2.6 MAXOUT函数

    maxout网络能够近似任意连续函数,且当w2,b2,…,wn,bn为0时,退化为ReLU。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。

     

    2.7 softmax函数

    softmax--用于多分类神经网络输出

     

    3. 几种激活函数的对比

    sigmod和ReLU

    隐藏层的激活函数有9中激活函数可以选择:Sigmoid,Linear,Tanh,ArchTan,Relu,Parameteric ReLU(PReLU),ELU,SoftPlus和BentLinear

    这里我们在隐藏层分别用sigmod和ReLU,输出层为sigmod。

    1. 数据比较复杂时,mini_batch的值设置的相对大一些,这样每次能覆盖不同的类型,训练的效果会更好。
    2. 在训练次数相同时,ReLU激活函数的训练效果确实优于sigmoid函数。在大量次数(几十万次以上)训练后相差不大。
    3. sigmoid更容易出现过拟合。对于这个实验,隐层神经元为30个的时候,sigmoid会出现过拟合现象,几乎不能分类,在隐层神经元为10个的时候,能够进行部分分类,但是效果比不上ReLU的分类效果。
    4. ReLU在小batch(比如10)时效果不好

    对于ReLU而言,ReLU的特点是,隐层比sigmoid需要的神经元多,学习速率相对要小一点,mini_batch的数量要大一些。

     

    总结:

    总体来看,这些激活函数都有自己的优点和缺点,没有一条说法表明哪些就是不行,哪些激活函数就是好的,所有的好坏都要自己去实验中得到。不同的数据不同的场景不同的模型所需要的是不同的激活函数,而我们所需要做的就是优雅的选出那个最合适的为我们所用。

    参考链接:

    大白话讲解BP算法:【https://blog.csdn.net/zhaomengszu/article/details/77834845

    RNN学习中长期依赖的三种机制:【https://zhuanlan.zhihu.com/p/34490114

    RNN中为什么用tanh作为激活函数而不是ReLU(其实也是可以用ReLU,比如IRNN):【https://www.zhihu.com/question/61265076

    常用的激活函数:【https://www.jianshu.com/p/22d9720dbf1a

    展开全文
  • 几种常见激活函数(笔记整理)

    万次阅读 2019-02-26 19:15:17
    函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. (1)Sigmoid函数 左端趋近于0,右端趋近于1,且两端...

    活函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型.

    (1)Sigmoid函数

    左端趋近于0,右端趋近于1,且两端都趋于饱和.

    关于函数饱和解释:参考https://www.cnblogs.com/tangjicheng/p/9323389.html

    这里写图片描述

    如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。
    数学分析见文章:https://www.jianshu.com/p/917f71b06499

    Sigmoid 的 output 不是0均值(即zero-centered)。这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
    其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间.

    (2)Tanh函数

    tanh(x)及其导数的几何图像

    它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

     

    (3) ReLu函数

    relu(x)=max(x,0)

    这里写图片描述

    是个分段线性函数,显然其导数在正半轴为1,负半轴为0,这样它在整个实数域上有一半的空间是不饱和的。相比之下,sigmoid函数几乎全部区域都是饱和的.

    ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
    1) 解决了gradient vanishing问题 (在正区间)
    2)计算速度非常快,只需要判断输入是否大于0
    3)收敛速度远快于sigmoid和tanh

    ReLu是分段线性函数,它的非线性性很弱,因此网络一般要做得很深。但这正好迎合了我们的需求,因为在同样效果的前提下,往往深度比宽度更重要,更深的模型泛化能力更好。所以自从有了Relu激活函数,各种很深的模型都被提出来了,一个标志性的事件是应该是VGG模型和它在ImageNet上取得的成功.

    ReLU也有几个需要特别注意的问题:
    1)ReLU的输出不是zero-centered
    2)某些神经元可能永远不会被激活(Dead ReLU Problem),导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

    人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx 非0,通常α=0.01  (  Leaky ReLU函数: f(x)=max(αx,x)  )。为了解决zero-centered问题,提出了ELU (Exponential Linear Units) 函数,f(x)=x  if x>0  otherwise   a(e^x  −1).

    (4) Swish函数(Google大脑团队)

    定义为  swish(x)=x⋅Sigmoid

    图像如下图所示:

    Swish

     

    从图像上来看,Swish函数跟ReLu差不多,唯一区别较大的是接近于0的负半轴区域, Google大脑做了很多实验,结果都表明Swish优于ReLu

    (5) Gated linear units(GLU)激活函数(facebook提出)

    我就是懒了

    参考https://blog.csdn.net/qq_32458499/article/details/81513720

     

     

    还有其他激活函数,如GTU,Maxout等,学海无涯,楫棹莫收.

    参考:https://blog.csdn.net/tyhj_sf/article/details/79932893

    https://spaces.ac.cn/archives/4647

     

                                                手撕(抓)饼是好吃,可是不能多吃

     

    展开全文
  • 常用激活函数(激励函数)理解与总结

    万次阅读 多人点赞 2019-05-13 22:03:43
    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分: 什么是...

    引言

    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:

    1. 什么是激活函数?
    2. 激活函数的用途(为什么需要激活函数)?
    3. 有哪些激活函数,都有什么性质和特点?
    4. 应用中如何选择合适的激活函数?

    如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。

    什么是激活函数?

    首先要了解神经网络的基本模型。(不熟悉的同学请去看本人另外一篇介绍:人工神经网络基本原理
    单一神经元模型如下图所示。
    这里写图片描述
    神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

    激活函数的用途(为什么需要激活函数)?

    如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

    有哪些激活函数,都有什么性质和特点?

    早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
    近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:

    Sigmoid函数

    Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
    f(z)=11+ez f(z)=\frac{1}{1+e^{-z}}
    Sigmoid的几何图像如下:
    这里写图片描述
    特点:
    它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
    缺点:
    sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
    缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:
    这里写图片描述
    如果我们初始化神经网络的权值为 [0,1][0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+)(1,+∞) 区间内的值,则会出现梯度爆炸情况。
    详细数学分析见文章:http://neuralnetworksanddeeplearning.com/chap5.html 中文译文:深度神经网络为何很难训练
    缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x&gt;0, f=wTx+bx&gt;0, \ f= w^Tx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
    缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

    tanh函数

    tanh函数解析式:
    tanh(x)=exexex+extanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
    tanh函数及其导数的几何图像如下图:
    tanh(x)及其导数的几何图像
    tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

    Relu函数

    Relu函数的解析式:
    Relu=max(0,x)Relu=max(0,x)
    Relu函数及其导数的图像如下图所示:
    这里写图片描述
    ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
    1) 解决了gradient vanishing问题 (在正区间)
    2)计算速度非常快,只需要判断输入是否大于0
    3)收敛速度远快于sigmoid和tanh

    ReLU也有几个需要特别注意的问题:
    1)ReLU的输出不是zero-centered
    2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

    尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

    Leaky ReLU函数(PReLU)

    函数表达式:f(x)=max(αx,x)f(x)=max(\alpha x,x)
    Leaky Relu函数及其导数的图像如下图所示:
    (有同学在评论中反映下图有误,其实没有错误,左半边直线斜率非常接近0,所以看起来像是平的。就不改了,α=0.01\alpha=0.01看起来就是这样的。感谢大家提意见 ^ _ ^)
    这里写图片描述
    人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx\alpha x而非0,通常α=0.01\alpha=0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x)Parametric ReLU:f(x) = \max(\alpha x, x),其中α\alpha
    可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

    ELU (Exponential Linear Units) 函数

    函数表达式:
    f(x)={x,if x&gt;0α(ex1),otherwisef(x)= \begin{cases}x,&amp; \text{if } x &gt; 0\\ \alpha(e^x - 1), &amp; \text{otherwise} \end{cases}
    函数及其导数的图像如下图所示:
    这里写图片描述

    ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

    不会有Dead ReLU问题
    输出的均值接近0,zero-centered
    

    它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

    MaxOut函数

    这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
    这里写图片描述

    上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:

    这里写图片描述

    权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
    我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

    应用中如何选择合适的激活函数?

    这个问题目前没有确定的方法,凭一些经验吧。
    1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
    2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
    3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

    参考资料

    1.聊一聊深度学习的activation function—夏飞
    2.http://blog.csdn.net/cyh_24/article/details/50593400
    3.http://www.cnblogs.com/tornadomeet/p/3428843.html
    4.《maxout networks》

    展开全文
  • 常用激活函数对比

    千次阅读 2018-03-19 16:04:58
    神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也...

    神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。

    在ICML2016的一篇论文Noisy Activation Functions中,作者将激活函数作出了形象的定义,如下图所示:
    这里写图片描述

    在实际的应用中,我们需要先了解以下概念:

    • 饱和

      当一个激活函数h(x)满足 limn+h(x)=0 时,我们称之为右饱和
      当一个激活函数h(x)满足 limnh(x)=0 时,我们称之为左饱和
      当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和

    • 硬饱和与软饱和

      对任意的x,如果存在常数c,当 x > c 时恒有 h(x)=0 则称其为右硬饱和
      对任意的x,如果存在常数c,当 x < c 时恒有 h(x)=0 则称其为左硬饱和
      若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和
      如果只有在极限状态下偏导数等于0的函数,称之为软饱和

    从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。下文将依次对它们进行总结。

    Sigmoid

    Sigmoid 是使用范围最广的一类激活函数,具有指数函数形状 。正式定义为:

    f(x)=11+ex

    这里写图片描述

    可见,sigmoid 在定义域内处处可导,根据上述对饱和的定义,其可被定义为软饱和激活函数。

    Sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

    这里给出一个关于梯度消失的通俗解释:

    Sigmoid 函数能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是 f(x)=f(x)(1f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新。

    最后总结一下 Sigmoid 函数的优缺点:

    优点:

    1. Sigmoid 函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。它在物理意义上最为接近生物神经元。
    2. 求导容易。

    缺点:

    1. 由于其软饱和性,容易产生梯度消失,导致训练出现问题。
    2. 其输出并不是以0为中心的。

    Tanh

    f(x)=1e2x1+e2x

    函数位于[-1, 1]区间上,对应的图像是:
    这里写图片描述

    同样的,Tanh 激活函数也具有软饱和性。Tanh 网络的收敛速度要比 Sigmoid 快。因为 Tanh 的输出均值比 Sigmoid 更接近 0,SGD 会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。

    总结一下 Tanh 激活函数的优缺点:

    优点:

    1. 比Sigmoid函数收敛速度更快。
    2. 相比Sigmoid函数,其输出以0为中心。

    缺点:

    还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。

    ReLU

    ReLU 是近几年非常受欢迎的激活函数。被定义为:
    这里写图片描述
    其对应的函数图像为:
    这里写图片描述

    可见,ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。

    最后总结一下 ReLU 函数的优缺点:

    优点:

    1. 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。据称,这是因为它线性、非饱和的形式。
    2. Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
    3. 有效缓解了梯度消失的问题。
    4. 在没有无监督预训练的时候也能有较好的表现。
    5. 提供了神经网络的稀疏表达能力。

    缺点:

    随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

    LReLU 与 PReLU

    PReLU 是 ReLU 和 LReLU 的改进版本,具有非饱和性:
    这里写图片描述

    下面给出 LReLU 的函数图像:
    这里写图片描述

    ai 比较小且固定的时候,我称之为 LReLU。LReLU 最初的目的是为了避免梯度消失。但在一些实验中,我们发现 LReLU 对准确率并没有太大的影响。很多时候,当我们想要应用 LReLU 时,我们必须要非常小心谨慎地重复训练,选取出合适的 a,LReLU 的表现出的结果才比 ReLU 好。因此有人提出了一种自适应地从数据中学习参数的 PReLU。

    PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。

    ELU

    ELU 融合了sigmoid和ReLU,具有左侧软饱性。其正式定义为:
    这里写图片描述

    这里写图片描述

    右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。

    激活函数选用总结

    在进行深度学习的研究中,如何选择激活函数,仍需依靠实验指导。一般来说,在分类问题上建议首先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。

    该博文主要参考资料:
    1.深度学习中的激活函数导引
    2.浅谈深度学习中的激活函数

    展开全文
  • 常用激活函数图像

    千次阅读 2018-05-31 13:16:08
    激励函数有很多, 不过我们平时要用到的就这几个. relu, sigmoid, tanh, softplus. import torch import torch.nn.functional as F # 激励函数都在这 from torch.autograd import Variable # 做一些假数据来观看...
  • 深度学习之常用激活函数

    千次阅读 2018-08-10 10:15:23
    激活函数(Activation Function)一般用于神经网络的层与层之间,将上一层的输出转换之后输入到下一层。如果没有激活函数引入的非线性特性,那么神经网络就只相当于原始感知机的矩阵相乘。   一、激活函数的性质 ...
  • 几种常用激活函数的简介

    万次阅读 多人点赞 2018-01-04 12:32:28
    sigmod,tanh,relu,elu,prelu,leaky relu
  • 常用激活函数优缺点及性能对比

    千次阅读 2019-11-25 10:41:04
    激活函数(Activation Function) 什么是激活函数? 人工神经网络的激活函数就是模仿生物神经网络。在生物神经网络中,信息的传递是通过神经元的树突和轴突的结合,(在前膜的内侧有致密突起和网格形成的囊泡栏栅,...
  • 深度神经网络中常用激活函数的优缺点分析 本文主要总结了深度神经网络中常用激活函数,根据其数学特性分析它的优缺点。 在开始之前,我们先讨论一下什么是激活函数(激活函数的作用)? 如果将一个神经元的输出...
  • 机器学习常用激活函数

    千次阅读 2018-09-12 14:28:55
    机器学习常用激活函数   摘要: 激活函数就是神经网络输出端的一个节点,来连接两个神经网络。本文主要介绍激活函数的功能以及激活函数类型。 什么是激活函数? 激活函数就是神经网络输出端的一个节点,来...
  • 常用激活函数公式(更新中)

    千次阅读 2018-06-01 16:54:13
    常用激活函数公式 (1)what and why 直观的作用就是进行非线性操作,将输入信号input线性加权,再进行非线性操作。 神经网络模拟生物神经元的工作原理,人工神经元的工作是将神经质传输到突出,突出将各个...
  • 神经网络中的常用激活函数和导数

    千次阅读 2019-05-17 13:59:38
    神经网络中的常用激活函数和导数 1、 sigmoid 函数 y=11+e−x y = \frac{1}{1 + e^{-x}} y=1+e−x1​ 导函数: KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n...
  • 常用激活函数

    千次阅读 2019-07-20 14:13:26
    今天这篇文章对一些常用激活函数做一下总结吧。在神经网络中激活函数还是很重要的,并且熟悉激活函数对理解别的问题也是很有帮助的。 为什么需要激活函数 从数学上看,神经网络是一个多层复合函数。引入激活函数是...
  • 深度学习常用激活函数

    千次阅读 2017-09-11 17:43:18
    在感知器模型、神经网络模型、深度学习模型中均会看见激活... 常用激活函数有:线性函数、斜坡函数、阶跃函数、符号函数、Sigmoid函数、双曲正切函数、Softplus函数、Softsign函数、Relu函数及其变形、Maxout函数等。
  • 神经网络激活函数的作用,及常用激活函数ReLu、sigmoid。
  • 常用激活函数(Activation Function)

    千次阅读 2017-07-05 18:23:51
    常用激活函数
  • 深度学习常用激活函数之— Sigmoid & ReLU & Softmax

    万次阅读 多人点赞 2017-05-31 11:03:04
    深度学习常用激活函数-ReLU
  • 常用激活函数的总结与比较

    千次阅读 2017-08-11 14:07:46
    本文为 CS231n 中关于激活函数部分的笔记。 激活函数(Activation Function)能够把输入的特征保留并映射下来。 Sigmoid Sigmoid 非线性函数将输入映射到 (0,1)(0,1) 之间。它的数学公式为:σ(x)=11+e...
  • PyTorch常用激活函数

    万次阅读 2020-01-22 17:41:53
    两个或多个线性网络层叠加,并不能学习一个新的东西,简单的堆叠网络层,而不经过非线性激活函数激活,学到的仍然是线性关系。 通过激活函数的加入可以学到非线性的关系,这对于特征提取具有更强的能力...
  • 4.4 常用激活函数讲解 神经网络的激活函数其实有很多种,在前面的章节中我们介绍过两种激活函数,sign函数和purelin函数。sign函数也称为符号函数,因为sign(x)中x>0,函数结果为1;sign(x)中x,函数结果为-1。...
1 2 3 4 5 ... 20
收藏数 94,168
精华内容 37,667
关键字:

常用激活函数