精华内容
下载资源
问答
  • 常用激活函数(激励函数)理解与总结

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

    tanh函数

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

    Relu函数

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

    ELU (Exponential Linear Units) 函数

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

    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》

    展开全文
  • 常用的激活函数及特点: 1)sigmoid ① 定义:sigmoid函数也叫Logistic函数,用于隐层神经元输出,能将(−∞,+∞)(-\infty,+\infty)(−∞,+∞)的数值映射到(0,1)的区间,可以用来做二分类。表达式为: f(x)=11+e−x ...

    激活函数:

    神经网络中将输入信号的总和转换为输出信号的函数,激活函数将多层感知机输出转换为非线性,使得神经网络可以任意逼近任何非线性函数,使神经网络可以应用到众多的非线性模型中。

    常用的激活函数及特点:

    1)sigmoid

    ① 定义:sigmoid函数也叫Logistic函数,用于隐层神经元输出,能将(,+)(-\infty,+\infty)的数值映射到(0,1)的区间,可以用来做二分类。表达式为:
    f(x)=11+ex f(x) = \frac{1}{1+e^{-x}}

    ② 特点

    • 优点:关于(0,0.5)对称,平滑、易于求导
    • 缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失

    2)tanh

    ①定义:双曲线正切函数,表达式为:
    f(x)=1e2x1+e2x f(x) = \frac{1-e^{-2x}}{1+e^{-2x}}
    ②特点:

    • 优点:关于坐标原点对称,平滑,易于求导,输出均值为0,收敛速度比sigmoid快,从而可以减少迭代次数。
    • 缺点:很容易出现梯度消失。

    3)Relu

    ①定义:修正线性单元,其表达式为:
    f(x)={x(x>0)0(x<=0) f(x) = \begin{cases} x & (x>0)\\ 0 & (x<=0) \end{cases}
    ②特点:

    • 优点:计算过程简单,避免了梯度爆炸和梯度消失。
    • 缺点:小于等于0时无输出。

    前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层

    展开全文
  • 常用的激活函数

    2019-05-06 00:14:10
    5.应用中如何选择合适的激活函数? 什么是激活函数? 首先要了解神经网络的基本模型。 单一神经元模型如下图所示。 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并...

    引言

    本文的内容包括几个部分:

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


    什么是激活函数?

    首先要了解神经网络的基本模型。
    单一神经元模型如下图所示。

    è¿éåå¾çæè¿°

    神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

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

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

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

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

    Sigmoid函数
    Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
                                                                f(z)=\frac{1}{1+e^{-z}}

    反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:

                                                          

    Sigmoid的几何图像如下:

    è¿éåå¾çæè¿°

    特点:
    它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
    缺点:
    sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些缺点。
    缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:

    è¿éåå¾çæè¿°

    如果我们初始化神经网络的权值为 [0,1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) 区间内的值,则会出现梯度爆炸情况。
    详细数学分析见文章:深度神经网络为何很难训练
    缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0,f=w^{T}x+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
    缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

    tanh函数
    tanh函数解析式:
                                                                      tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}

    对于tanh函数的求导推导为:

                                                                    

    tanh函数及其导数的几何图像如下图:

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

    Relu函数
    Relu函数的解析式:
                                                                           Relu=max(0,x)

    Relu函数及其导数的图像如下图所示:

    è¿éåå¾çæè¿°

    ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
    1) 解决了梯度消失问题 (在正区间)
    2)计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)

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

    3)当输入为负时,梯度为0,会产生梯度消失问题。

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

    Leaky ReLU函数(PReLU)
    函数表达式:
                                                      f(x)=max(\alpha x,x)

    Leaky Relu函数及其导数的图像如下图所示:

    è¿éåå¾çæè¿°
    人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为\alpha x而非0,通常\alpha =0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(\alpha x,x),其中\alpha可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

    我认为他的优点是Leaky ReLU函数解决了ReLU函数在输入为负的情况下产生的梯度消失问题

    ELU (Exponential Linear Units) 函数
    函数表达式:
    f(x)=\left\{\begin{matrix}x & &, if x>0 \\ \alpha (e^x -1) & & ,otherwise \end{matrix}\right.

    函数及其导数的图像如下图所示:

    è¿éåå¾çæè¿°
    ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

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


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

    softmax函数

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

    公式

    举个例子来看公式的意思:

    就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。

    为什么要取指数,第一个原因是要模拟 max 的行为,所以要让大的更大。
    第二个原因是需要一个可导的函数。

    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)函数即充当了激活函数。


    sigmoid ,ReLU, softmax 的比较

    Sigmoid 和 ReLU 比较:

    sigmoid 的梯度消失问题,ReLU 的导数就不存在这样的问题,它的导数表达式如下:

    曲线如图

    对比sigmoid类函数主要变化是:
    1)单侧抑制
    2)相对宽阔的兴奋边界
    3)稀疏激活性。

    Sigmoid 和 Softmax 区别:

    softmax is a generalization of logistic function that “squashes”(maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.

    sigmoid将一个real value映射到(0,1)的区间,用来做二分类。

    而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。

    二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题

    softmax是sigmoid的扩展,因为,当类别数 k=2 时,softmax 回归退化为 logistic 回归。具体地说,当 k=2 时,softmax 回归的假设函数为:

    利用softmax回归参数冗余的特点,从两个参数向量中都减去向量θ1 ,得到:

    最后,用 θ′ 来表示 θ2−θ1,上述公式可以表示为 softmax 回归器预测其中一个类别的概率为

    另一个类别概率的为

    这与 logistic回归是一致的。

    softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
      
    多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。


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


    这个问题目前没有确定的方法,凭一些经验吧。
    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》

    展开全文
  • 互联网提供了大量信息,我们只需要一个搜索引擎就可以获取。然而,当大量信息扑面而来,究竟如何区分相关信息和无关信息呢? 大脑在得到大量信息时,会努力理解和分类有用信息...激活函数如此重要,那么都哪...

    互联网提供了大量的信息,我们只需要一个搜索引擎就可以获取。然而,当大量的信息扑面而来,究竟如何区分相关信息和无关信息呢?

    大脑在得到大量信息时,会努力理解和分类有用信息和不那么有用的信息。而在深度学习中,我们也需要一种类似的机制来分类传入的信息。

    不是所有信息都是有用的,一些只是噪音。激活函数可以帮助神经网络做这种隔离。它激活有用的信息,并抑制无关的数据点。

    激活函数如此重要,那么都有哪些比较热门呢?它们是如何工作的?又适合解决什么问题?本文将为你一一解答。以下是本文目录。

    1.简单介绍神经网络

    2.什么是激活函数?

    3.可以不用激活函数吗?

    4.常用的激活函数类型以及使用方法

    Binary Step函数

    线性函数

    Sigmoid函数

    tanh函数

    ReLU函数

    Leaky ReLU函数

    Softmax函数

     

    5.如何选择正确的激活函数?

    简单介绍神经网络

    在深入了解激活函数的细节之前,让我们先回顾一下什么是神经网络,以及它是如何运行的。神经网络是一种非常强大的机器学习机制,它基本上模拟人脑的学习方式。

    大脑接受外界的刺激,对输入进行加工,然后产生输出。当任务变得复杂时,多个神经元会形成一个复杂的网络,传递信息。

    人工神经网络试图模仿类似的行为。下图所示的网络就是由相互连接的神经元组成的人工神经网络。

    上图中的黑色圆圈代表神经元。 每个神经元都有权重、偏差和激活函数。 信息进入输入层,神经元通过权重和偏差对输入信息进行线性变换,而非线性变换由激活函数完成。 信息从输入层传输到隐藏层,隐藏层对信息进行处理并将结果发送到输出层。 这被称为前向传播。如果产生的输出偏离预期值呢? 在神经网络中,我们将根据误差更新神经元的权重和偏差。 这个过程被称为反向传播。 一旦所有训练数据经过了这一过程,则最终的权重和偏差就被用于测试。

    什么是激活函数?

    激活函数是人工神经网络的一个极其重要的特征。它决定一个神经元是否应该被激活,激活代表神经元接收的信息与给定的信息有关。

     

    激活函数对输入信息进行非线性变换。 然后将变换后的输出信息作为输入信息传给下一层神经元。

    可以不用激活函数吗?

    如果激活函数增加了许多复杂性,我们可以不用激活函数吗?

    当然不行!当我们不用激活函数时,权重和偏差只会进行线性变换。线性方程很简单,但解决复杂问题的能力有限。没有激活函数的神经网络实质上只是一个线性回归模型。激活函数对输入进行非线性变换,使其能够学习和执行更复杂的任务。我们希望我们的神经网络能够处理复杂任务,如语言翻译和图像分类等。线性变换永远无法执行这样的任务。

    激活函数使反向传播成为可能,因为激活函数的误差梯度可以用来调整权重和偏差。如果没有可微的非线性函数,这就不可能实现。

     

    常用的激活函数类型以及使用方法

    Binary Step函数

    当我们有一个激活函数时,首先联想到的是一个自带阈值的分类器,用于激活神经元。下图中,如果y值高于给定的阈值,则激活神经元,否则禁用。

    f(x) = 1, x>=0

    Binary Step函数非常简单,可以在创建二进制分类器时使用它。当我们只需要对单个类说“是”或“不是”时,Step函数是最好的选择,因为它要么激活神经元要么把它设为零。

    函数的理论性比实用性强,在大多数情况下,我们需要将数据分入多个类而不仅仅放在一类中。此时,Step函数就有点不好用了。

    此外,step函数的梯度为零,这使得step函数不能用于反向传播过程中。

    f '(x) = 0, for all x

    线性函数

    我们看到了step函数的问题,梯度为零,在反向传播过程中不可能更新权重和偏差。此时,我们可以用线性函数来代替简单的step函数。函数表达式:

    f(x)=ax

    上图中假设a为4。这时激活与输入成正比,输入的x值将被转换为ax。线性函数可用于不同的神经元,也可以激活多个神经元。当我们有多个类时,可以选择f(x)值最大的类。但线性函数仍然存在一个问题。让我们看看这个函数的导数。

    f'(x) = a

    线性函数的导数是常数,也就是说它不依赖于输入值x

    这意味着每次我们做反向传播时,梯度都是一样的。这是一个大问题,我们并没有真正减少误差。不仅如此,假设我们正在做一项复杂任务,需要使用多层神经网络。然而如果每一层都使用线性变换,不管我们有多少层,最终输出的还是输入的线性变换。因此,线性函数只适用于容易解释的简单任务。

     

    Sigmoid函数

    Sigmoid函数曾被广泛应用,但由于其自身的一些缺陷,现在已经很少用了。Sigmoid函数定义如下:

    f(x)=1/(1+e^-x)

    让我们来看看这个函数。

    这是一个平滑函数,并且具有连续性和可微性。与线性函数相比,它的最大优点就是非线性。这意味着多个神经元使用S(Sigmoid简称)形函数作为激活函数时,输出也是非线性的。我们来看看曲线的形状。Y轴范围0-1,x轴在-3到3之间的梯度非常高,但在其他区域形状很平坦。这有什么用吗?

    这意味着在[-3,3]这个范围内,x的少量变化也将导致y值的大幅度变化。因此,函数本质上试图将y值推向极值。 当我们尝试将值分类到特定的类时,使用Sigmoid函数非常理想。

    让我们来看一下Sigmoid函数的梯度。

    它是平滑的,依赖于x值,这意味着在反向传播过程中,我们可以使用这个函数。误差可以被反向传播,权重也可以相应地更新。

    即使在今天,sigmoid函数也被广泛使用,但我们仍然需要解决一些问题。正如之前所看到的,这个函数在[-3,3]之外是相当平坦的。这意味着一旦x值不在[-3,3]内,梯度就变得很小,接近于零,而网络就得不到真正的学习。

    sigmoid函数的另一个问题是,y轴取值范围[0,1]。这个函数在原点周围不对称,得到的值都是正的。我们不希望下一个神经元得到的值在任何时候都是正值,不过可以通过缩放sigmoid函数来解决这个问题,而这需要在tanh函数中发生。

     

    tanh函数

    tanh函数与Sigmoid函数非常相似。它实际上只是Sigmoid函数的一个放大版本。

    tanh(x)=2sigmoid(2x)-1

    还可以直接表示为:

    tanh(x)=2/(1+e^(-2x)) -1

    Tanh函数与sigmoid函数相似,但原点对称。它的范围从- 1到1。

    它基本上解决了所有值符号相同的问题,而其他属性都与sigmoid函数相同。函数具有连续性和可微性。你可以看到函数是非线性的,所以我们可以很容易地将误差进行反向传播。

    让我们看一下tanh函数的梯度。

    与Sigmoid函数相比,tanh函数的梯度更陡。 使用sigmoid函数还是tanh函数取决于问题陈述中对梯度的要求。 但是tanh函数出现了Sigmoid函数类似的问题,梯度渐趋平坦,并且值非常低。

    ReLU函数

    ReLU是近几年非常受欢迎的激活函数。其定义为:

    f(x)=max(0,x)

    以下是图形表示:

    ReLU是如今设计神经网络时使用最广泛的激活函数。首先,ReLU函数是非线性的,这意味着我们可以很容易地反向传播误差,并激活多个神经元。

    ReLU函数优于其他激活函数的一大优点是它不会同时激活所有的神经元。这是什么意思?如果输入值是负的,ReLU函数会转换为0,而神经元不被激活。这意味着,在一段时间内,只有少量的神经元被激活,神经网络的这种稀疏性使其变得高效且易于计算。

    我们来看看ReLU函数的梯度。

    ReLU函数也存在着梯度为零的问题。看上图,x<0时,梯度是零,这意味着在反向传播过程中,权重没有得到更新。这就会产生死神经元,而这些神经元永远不会被激活。好在当我们遇到问题时,我们总能找到解决方案。

    Leaky ReLU函数

    Leaky ReLU函数只是一个ReLU函数的改良版本。我们看到,在ReLU函数中,x < 0时梯度为0,这使得该区域的神经元死亡。为了解决这个问题, Leaky ReLU出现了。这是它的定义:

    f(x)= ax, x<0

    = x, x>=0

    我们所做的,只是用一个非水平线简单地替换了水平线。这里a是一个很小的值,如0.01。见下图。

    替换水平线的主要优点是去除零梯度。在这种情况下,上图左边的梯度是非零的,所以该区域的神经元不会成为死神经元。梯度图如下。

    与Leaky ReLU函数类似的,还有PReLU函数,它的定义与Leaky ReLU相似。

    f(x)= ax, x<0

    = x, x>=0

    然而, 在PReLU函数中,a也是可训练的函数。神经网络还会学习a的价值,以获得更快更好的收敛。 当Leaky ReLU函数仍然无法解决死神经元问题并且相关信息没有成功传递到下一层时,可以考虑使用PReLU函数。

    Softmax函数

    softmax函数也是一种sigmoid函数,但它在处理分类问题时很方便。sigmoid函数只能处理两个类。当我们想要处理多个类时,该怎么办呢?只对单类进行“是”或“不是”的分类方式将不会有任何帮助。softmax函数将压缩每个类在0到1之间,并除以输出总和。它实际上可以表示某个类的输入概率。其定义为:

    比如,我们输入[1.2,0.9,0.75],当应用softmax函数时,得到[0.42,0.31,0.27]。现在可以用这些值来表示每个类的概率。

    softmax函数最好在分类器的输出层使用。

    如何选择正确的激活函数?

    现在我们已经了解了这么多的激活函数,接下来就需要分析在哪种情况下应该使用哪种激活函数了。激活函数好或坏,不能凭感觉定论。然而,根据问题的性质,我们可以为神经网络更快更方便地收敛作出更好的选择。

    用于分类器时,Sigmoid函数及其组合通常效果更好。

    由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

    ReLU函数是一个通用的激活函数,目前在大多数情况下使用。

    如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。

    请记住,ReLU函数只能在隐藏层中使用。

    一点经验:你可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数。

    展开全文
  • 神经网络很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分: 1.什么是激活函数? 2.激活函数的用途(为什么需要激活...
  • 1.什么是激活函数? 如下图,在神经元中,输入 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function...3.常用激活函数有哪些? 3.1 线性激活函数 3.2 非线性激活函数 4.如何选择
  • 学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分: 什么是...
  • 2.激活函数有什么用途?它是做什么用的? 3.有哪些激活函数?它们的性质优缺点和区别是什么? 4.在应用中应该选择什么样的激活函数? 如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。 什么是激活函数?...
  • 有哪些常见的激活函数呢?  深度学习的基本原理就是基于人工神经网络,信号从一个神经元进入,经过非线性的 activation function,传入到下一层神经元;再经过该层神经元的 activate,继续往下传递,如此...
  • 2)神经网络中常用的激活函数有哪些,各自有什么特点? (1)sigmoid ①定义:sigmoid函数用于影藏层神经元输出,能将数值映射到(0,1)区间,可用来做二分类,表达式为: f(x)=11+e−x f(x) = \frac{1}{1+e^{-x}} f(x...
  • 常用的有哪些? 啥是激活函数激活函数是上层节点的输出和下层节点的输入之间的一个非线性函数关系。 为啥用激活函数?要是不用激活函数,不管多少层的神经网络说白了都是些线性变换的叠加,网络的逼近能力有限,...
  • 深度学习--激活函数的对比分析

    千次阅读 2017-08-29 09:29:06
    本博客仅为作者记录笔记之用,不免有很多细节不对之处。还望各位看官能够见谅,欢迎批评指正。  在学习神经网络的时候,你会经常听到一个词:激活函数。...常用的激活函数有哪些? 这些常用的激活函数有什
  • 下面我们来看看sigmoid激活函数有哪些缺点: 在饱和区域存在梯度缺失问题。 sigmoid是一个非零中心函数。 表达式较为复杂,计算复杂度高。 这里详细介绍第二个缺点,我们知道在NN训练过程中,正向传播...
  • 深度学习之激活函数

    2019-05-29 16:39:41
    3、常用的激活函数有哪些? 4、如何选择激活函数? 主要围绕上面几个问题展开讲述! 线性模型在处理非线性问题时往往无从下手,这时引入激活函数来解决线性不可分问题!激活函数往往存在于输入层和输出层之间,...
  • 目录 参考文献: 1.多分类任务中的softmax 1.1关于多分类 1.2 如何多分类 1.3 代价函数 1.4 使用场景 ...2 ....2.3. 常用的激活函数有哪些? 2.3.1 sigmoid函数 2.3.3 ReLu函数 2.3.4 激活函数的选...
  • 激活函数的理解和实现-最新整理

    千次阅读 2019-04-14 16:10:58
    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分: 什么是...
  • amp;wfr=spider&amp;for=pc 激活函数如此重要,那么都有哪些比较热门呢?它们是如何工作的?又适合解决什么问题?本文将为你一一解答。以下是本文目录。...4.常用的激活函数类型以及使用方法 Bin...
  • 常见的激活函数及其优缺点分析 在上一章我们总体介绍了一下卷积神经网络的框架,其中谈到了激活函数的作用,...sigmoi函数是比较原始的激活函数,现在已经不太常用了,主要因为它以下3个问题: sigmoid函数饱和
  • 那么激活函数有哪些呢? 在维基百科上可以查到:https://en.wikipedia.org/wiki/Activation_function 在这里介绍几个比较常用的激活函数: relu: 根据公式,我们可以用python代码简单实现: ...
  • 在每一个神经网络中,总会遇到各种必须要定义的函数,像激活函数啊,损失函数啊……越来越有意思了,这里就记录一下常用的激活函数吧,毕竟她在神经网络中的作用挺大的。废话不多说了,下面一起看看有哪些激活函数。...
  • 创建只有一个执行语句触发器 较为简单 易于理解比如说有两个图书表t_book和t_bookType,一个存放各图书信息,都有哪些图书;一个存放图书类别,各个类别下都有多少本书,记录着各个类别图书数量。如下图现在...
  • 4、为什么经常把阶跃函数作为激活函数,常用的激活函数有哪些,各有什么优缺点,大概图形是怎样的; 二、感知机与多层神经网络 1、什么是感知机; 2、说说如何使用感知机实现逻辑与、或、非运算; 3、感知机只有...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

常用的激活函数有哪些