问道代码间

高校计算机教师,联系方式422591959@qq.com

导航

常见的激活函数(激励函数)

什么是激活函数

激活函数,顾名思义,肩负着激活一个神经网络的作用。

上图清晰的展示了一个多层神经网络的结构,一共L个隐藏层,d个输入和一个输出。其中W表示权重,h表示为激活函数。神经网络的目的就是从输入得到输出,我们可以得到输出的计算方法

很明显看到,上层的输出值通过一定的函数变换,成为下一层的输入,并一层层地传递信息直到输出层。激活函数并没有那么高深,函数就是指代一个函数关系,那么激活函数其实就是神经网络中上层节点输出和下层节点输入之间的函数关系。

为什么要激活函数?

所谓多层神经网络,也被成为多层感知机,它诞生的使命就是为了解决单层感知机所解决不了的问题,也就是所谓的非线性问题。那么没有激活函数的神经网络会变成什么呢?

我们一层层的计算网络的输出o,我们的函数h一层层被替代为上一层的权重和输出之积。很明显的输出变成了输出x和常数的简单乘积,整个网络变成了简单的线性结构,这是灾难性的。

我们介绍那些常见的激活函数

其实也没有什么新鲜的,常见的激活函数不为外乎三巨头,tahn,sigmod和RELU

  • sigmod
    这是最常见的激活函数,长期位列激活函数总统山之列,但在这几年逐渐走向没落。下面是sigmod的数学表达。

    我们通过数学表达即可绘制sigmod的几何图像

    从图像我们能够很明显的发现,连续的实值在入后,无论值多大或者多小,输出都被控制在-1到1的范围内。但为什么sigmod逐渐在被淘汰呢,这里我们就要分析sigmod的缺点。
    缺点1:在这里我们要从函数的导数情形着手研究

    可以很明显从图中发现,以坐标原点为中心,靠近中心的位置,存在明显的梯度,在远离原点的两端,梯度几乎不存在。这样会出现什么样的问题呢?我们知道,关于网络的反向传播,仅仅经过一个sigmod便会使梯度变的很小,更何况神经网络远远不止一层,多个sigmod会直接让梯度小到忽略不计,权重W无法进而优化,导致梯度消失,这也就是所谓的梯度饱和问题。
    我们额外了解一下梯度饱和的概念,当输入趋向于无穷大时,激活函数的导数趋向于0,我们称之为右饱和。当输入趋向于无穷小时,激活函数的导数趋向于0,我们称之为左饱和。
    缺点2:从数学表示就可以看出,sigmod涉及到指数运算,对于计算机来说计算成本较高。
    缺点3:很多博客也有介绍这方面的内容,就是这个函数的输出是不以0为中心(zoer-centred)的。其实就是,当输入x为正时,f=wx+b,权值的变化要么全是正要么全是负,这个是什么意思呢?我们来做简要的解释
    首先我们要了解两个式子

    我们对这两个式子,计算损失函数L对权重W的导数我们会发现

    损失函数关于f的导数受上游梯度影响,f关于权值的导数只和输入x有关,那么很明显,权值w的更新只会存在纯正和纯负,这就会使梯度下降的收敛变的十分缓慢。但是,这种缺点是可以弥补的,例如batch就对这个缺点有明显的优化作用。

  • tanh
    tanh可以说是sigmod的近亲,两者有着非常相似的特征,下面是tanh的数学表达式和几何图像


    我们从几何图像可以发现,tanh的出现可以解决和sigmod一样的问题,那么它比兄弟sigmod有没有一些改进呢?我们还是从导数图像开始分析

    优点:tanh的输出是-1到1的,tanh是一个zoer-centred的函数,可以有效避免权重更新效率低缓的问题
    缺点:缺点其实就是,相对于sigmod,tanh并没有什么革命性的改变。sigmod所具有的最大问题,也就是梯度饱和的问题,tanh作为饱和函数同样存在。

  • Relu
    下面是Relu函数的解析式,几何图像和导数图像



    Relu作为近些年崛起的新贵,其本身非常简单,就是一个取最大值的函数。
    优点:这个函数构造十分简单,只有线性结构,使得正反向传播的速度都很快。同时在正数情况,该函数是不饱和的,也就有效规避了之前梯度饱和问题。
    缺点:当函数是负数情况时,函数会遇到Dead ReLU Problem,会出现无法激活的死亡状态,这种麻烦体现在,正向传播时会出现部分无法激活,反向传播梯度会完全变成0。再关注函数的输出,不是0就是正数,显然ReLU的输出不是zero-centered,那么之前讨论的糟糕情形,RELU仍然可能会遇上。

接下来我们继续介绍关于ReLU的几种变形
ELU


相对来说,ELU比ReLU在负数情况下抗干扰能力会更强,解决了Dead ReLU Problem。同时函数是zero-centered的,能够高效更新权重。但同样无法解决梯度饱和和指数运算问题。
PReLU


可以发现PReLU是对ReLU的改良产品,在负数情况增加了一个很小的斜率α,一般取值范围在0到1,让ReLU不至于死掉。

posted on 2020-11-06 15:55  问道代码间  阅读(637)  评论(0编辑  收藏  举报