深度学习基础知识(四)— 激活函数

  • 2020 年 2 月 14 日
  • 笔记

激活函数也就是一些非线性单元,如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

参考文章:

https://zhuanlan.zhihu.com/p/25110450

1.sigmoid

sigmoid作激活函数的优缺点:

①梯度计算较为方便:

②能够控制数值的幅度,在深层网络中可以保持数据幅度不会出现大的变化;

(即能压缩数据,保证数据幅度不会有问题)

sigmoid缺点:

(1)容易出现梯度消失(gradient vanishing)的现象:当激活函数接近饱和区时,变化太缓慢,导数接近0

(参考上图中的右图梯度变化趋势)根据后向传递的数学依据是微积分求导的链式法则当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0从而无法完成深层网络的训练。

(2)Sigmoid的输出不是0均值(zero-centered)的,输出值恒大于0,这会导致模型训练的收敛速度变慢:比如上一级 经过 sigmoid之后,输出的一定是个正数x,那么希望更新这一级的参数的时候,wx+b,w的梯度是x,但是x恒为正,那么我这一级的w(w是个向量,里面会有很多分量)的所有分量都只能往正向移动,不能各个分量朝不同的方向移动,所以收敛速度变慢。

(3)幂运算相对来讲比较耗时

2.tanh

tanh读作 Hyperbolic Tangent

它的输出是0均值的了,解决了上面sigmoid的(2问题),但是梯度消失 和 幂运算费时的问题依然存在

3.ReLU (Rectified Linear Unit)整流线性单元

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的(0点不连续),但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点

(1)解决了gradient vanishing问题 (在正区间)

(2)计算速度非常快,只需要判断输入是否大于0

(3)收敛速度远快于sigmoid和tanh

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

(1)ReLU的输出不是zero-centered

(2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,使得输入发生巨大变化后越过0界,则前向传播为0,相当于这个单元被关闭了,反向传播的时候也为0 ,这个关掉的单元就跳不出来了。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

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

4.Leaky ReLU(渗漏整流线性单元)

为了解决Dead ReLU Problem,提出了将ReLU的前半段设为0.01x而非0.

5.ELU (Exponential Linear Units)指数化线性单元

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

(1)不会有Dead ReLU问题

(2)输出的均值接近0,zero-centered

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

6.PReLU ( Parameterized ReLU) 参数整流线性单元

将输入为负半轴部分映射为 一个可学习参数α和输入的乘积