深度学习中常用的非线性激励函数

一、什么是激励函数?

首先要了解神经网络的基本模型。
单一神经元模型如下图所示。在这里插入图片描述

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

二:在神经网络中为什么要引入非线性激励函数

我们知道深度学习的理论基础是神经网络,在单层神经网络中(感知机),输入和输出计算关系如下图所示:
在这里插入图片描述
可见,输入与输出是一个线性关系,对于增加了多个神经元之后,计算公式也是类似,如下图:
在这里插入图片描述
这样的模型就只能处理一些简单的线性数据,而对于非线性数据则很难有效地处理(也可通过组合多个不同线性表示,但这样更加复杂和不灵活),如下图所示:
在这里插入图片描述
那么,通过在神经网络中加入非线性激励函数后,神经网络就有可能学习到平滑的曲线来实现对非线性数据的处理了。如下图所示:
在这里插入图片描述
因此,神经网络中激励函数的作用通俗上讲就是将多个线性输入转换为非线性的关系。如果不使用激励函数的话,神经网络的每层都只是做线性变换,即使是多层输入叠加后也还是线性变换。通过激励函数引入非线性因素后,使神经网络的表示能力更强了。

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

三、深度学习中常用的非线性激励函数

在这里插入图片描述

3.1 sigmoid 函数

在这里插入图片描述
这应该是神经网络中使用最频繁的激励函数了,它把一个实数压缩至0到1之间,当输入的数字非常大的时候,结果会接近1,当输入非常大的负数时,则会得到接近0的结果。在早期的神经网络中使用得非常多,因为它很好地解释了神经元受到刺激后是否被激活和向后传递的场景(0:几乎没有被激活,1:完全被激活),不过近几年在深度学习的应用中比较少见到它的身影,因为使用sigmoid函数容易出现梯度弥散或者梯度饱和。当神经网络的层数很多时,如果每一层的激励函数都采用sigmoid函数的话,就会产生梯度弥散的问题,因为利用反向传播更新参数时,会乘以它的导数,所以会一直减小。如果输入的是比较大或者比较小的数(例如输入100,经Sigmoid函数后结果接近于1,梯度接近于0),会产生饱和效应,导致神经元类似于死亡状态。

3.2 tanh 函数

在这里插入图片描述
tanh函数及其导数的几何图像如下图:
在这里插入图片描述
tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

3.3 ReLU函数

Relu函数的解析式:
在这里插入图片描述
Relu函数及其导数的图像如下图所示:在这里插入图片描述
ReLU函数并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:

  • 1) 解决了gradient vanishing(梯度消失)问题 (在正区间)
  • 2)计算速度非常快,只需要判断输入是否大于0
  • 3)收敛速度远快于sigmoid和tanh

为什么引入Relu呢?

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

ReLU也有几个需要特别注意的问题:

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

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

3.4 Leaky ReLU 函数

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

参考:

1、https://blog.csdn.net/tyhj_sf/article/details/79932893
2、https://blog.csdn.net/rogerchen1983/article/details/79380567
3、小象学院课程

发布了465 篇原创文章 · 获赞 694 · 访问量 96万+

猜你喜欢

转载自blog.csdn.net/mao_hui_fei/article/details/104174801