天天看点

sigmoid函数_深度学习中激活函数总结

sigmoid函数_深度学习中激活函数总结

一、前言

前段时间通过引入新的激活函数Dice,带来了指标的提升,借着这个机会,今天总结下常用的一些激活函数。

激活函数在深度学习中起着非常重要的作用,本文主要介绍下常用的激活函数及其优缺点。主要分为以下几个部分:

  1. 引入激活函数的目的
  2. sigmoid激活函数带来的梯度消失和爆炸问题
  3. 常用激活函数对比
扩展:

关于之前Dice激活函数的实现,可以参见下面的链接:

绝密伏击:深度学习中Batch Normalization和Dice激活函数​zhuanlan.zhihu.com

sigmoid函数_深度学习中激活函数总结

二、引入激活函数的目的

sigmoid函数_深度学习中激活函数总结

图1:带一层隐藏层的神经网络

先看一个只含一层隐藏层的神经网络,如图1所示。输入为

sigmoid函数_深度学习中激活函数总结

条样本

sigmoid函数_深度学习中激活函数总结

,隐藏层

sigmoid函数_深度学习中激活函数总结

的权重和偏置分别为

sigmoid函数_深度学习中激活函数总结

sigmoid函数_深度学习中激活函数总结

,输出层

sigmoid函数_深度学习中激活函数总结

的权重和偏置分别为

sigmoid函数_深度学习中激活函数总结

sigmoid函数_深度学习中激活函数总结

。输出层的计算为:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

将(1),(2)联合起来可得:

sigmoid函数_深度学习中激活函数总结

从(3)可以看出,

虽然加入了隐藏层,但是还是等效于单层的神经网络

:权重为

sigmoid函数_深度学习中激活函数总结

,偏置为

sigmoid函数_深度学习中激活函数总结

上述的根本原因在于全连接只是对数据做

仿射变换

,而多个仿射变换的叠加仍然是一个放射变换。因此有必要引入非线性变换,这个非线性变换就是今天要讲的

激活函数

三、sigmoid激活函数带来的梯度消失和爆炸问题

为了解决前面的问题,后来提出了sigmoid激活函数。sigmoid函数可以将元素的值变换到0和1之间,定义如下:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

图2:sigmoid激活函数

sigmoid激活函数的导数为:

sigmoid函数_深度学习中激活函数总结

sigmoid激活函数虽然增强了模型的非线性表达能力,但是却带来了梯度消失和爆炸的问题,下面具体分析下是如何导致的。

3.1 sigmoid可能带来的梯度消失

sigmoid函数_深度学习中激活函数总结

图3:多层神经网络示意图

图3是一个多层的神经网络,假设其损失函数为

sigmoid函数_深度学习中激活函数总结

,前一层

sigmoid函数_深度学习中激活函数总结

和后一层

sigmoid函数_深度学习中激活函数总结

的关系可以表示如下:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

其中

sigmoid函数_深度学习中激活函数总结

,则反向传播计算

sigmoid函数_深度学习中激活函数总结

的梯度为:

sigmoid函数_深度学习中激活函数总结

从(8)可以看出,

sigmoid函数_深度学习中激活函数总结

梯度的计算依赖

sigmoid函数_深度学习中激活函数总结

sigmoid函数_深度学习中激活函数总结

的计算方式如下:

sigmoid函数_深度学习中激活函数总结

根据公式(5)可知

sigmoid函数_深度学习中激活函数总结

,而网络权重一般会进行标准化,因此

sigmoid函数_深度学习中激活函数总结

通常会小于1,从而

sigmoid函数_深度学习中激活函数总结

,因此:

sigmoid函数_深度学习中激活函数总结

从公式(10)可以看出,

随着反向传播链式求导,层数越多最后的梯度越小,最终导致梯度消失

3.2 sigmoid可能带来的梯度爆炸

3.1节讨论了sigmoid可能会带来梯度消失,那么会不会导致梯度爆炸呢?这个还是有可能的,如果

sigmoid函数_深度学习中激活函数总结

,即权重参数

sigmoid函数_深度学习中激活函数总结

比较大的时候,就会出现梯度爆炸。那么这个可能性到底有多大,下面具体分析下。

备注:为了便于表示,后面的
sigmoid函数_深度学习中激活函数总结
都取其中的一个元素,并简记为
sigmoid函数_深度学习中激活函数总结

因为

sigmoid函数_深度学习中激活函数总结

,因此必须

sigmoid函数_深度学习中激活函数总结

,才可能出现

sigmoid函数_深度学习中激活函数总结

。由

sigmoid函数_深度学习中激活函数总结

可得出

sigmoid函数_深度学习中激活函数总结

的取值范围为:

sigmoid函数_深度学习中激活函数总结

由于

sigmoid函数_深度学习中激活函数总结

,故公式(11)可以变换为:

sigmoid函数_深度学习中激活函数总结

因此

sigmoid函数_深度学习中激活函数总结

的数值变化范围为公式(12)中的右边-左边,即:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

图4:梯度爆炸x的数值范围

图4显示了公式(13)中的

sigmoid函数_深度学习中激活函数总结

数值范围随

sigmoid函数_深度学习中激活函数总结

的变化,可以看到

sigmoid函数_深度学习中激活函数总结

的最大数值范围也仅仅为0.45,

因此仅仅在很窄的范围内才可能出现梯度爆炸

根据3.1和3.2节,可以得出以下结论:

  • sigmoid激活函数在深层神经网络中极大概率会引起梯度消失
  • sigmoid激活函数很小的概率会出现梯度爆炸

由于sigmoid的局限性,所以后来很多人又提出了一些改进的激活函数,比如:ReLU,Leaky-ReLU,PReLU,Dice,RReLU等。后面具体介绍下几个激活函数的区别。

四、常用激活函数对比

4.1 ReLU

ReLU是Krizhevsky、Hinton等人在2012年

《ImageNet Classification with Deep Convolutional Neural Networks》

论文中提出的一种激活函数,可以用来解决梯度消失的问题,其定义如下:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

图5:ReLU激活函数

从公式(14)可以看出ReLU在正区间的导数为1,因此不会发生梯度消失。关于ReLU的缺点,可以参见下面的描述:

神经网络在训练的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。因为:ReLU的导数在
sigmoid函数_深度学习中激活函数总结
的时候是1,在
sigmoid函数_深度学习中激活函数总结
的时候是0。如果
sigmoid函数_深度学习中激活函数总结

,那么ReLU的输出是0,那么反向传播中梯度也是0,权重就不会被更新,导致神经元不再学习。

在实际训练中,如果学习率设置的太高,可能会发现网络中40%的神经元都会死掉,且在整个训练集中这些神经元都不会被激活。所以,设置一个合适的较小的学习率,会降低这种情况的发生。为了解决神经元节点死亡的情况,有人提出了Leaky-ReLU,PReLu,RReLU,ELU等激活函数。

总结一下ReLU的优缺点。

优点:

  • ReLU解决了梯度消失的问题
  • 由于ReLU线性特点,神经网络的计算和训练比sigmoid快很多

缺点:

  • ReLU可能会导致神经元死亡,权重无法更新。

4.2 Leaky-ReLU

Leaky-ReLU是Andrew L. Maas等人在2013年

《Rectifier Nonlinearities Improve Neural Network Acoustic Models(Leaky ReLU)》

论文中提出的一种激活函数。由于ReLU将所有负数部分的值设为0,从而造成神经元的死亡。而Leaky-ReLU是对负值给与一个非零的斜率,从而避免神经元死亡的情况。Leaky-ReLU定义如下:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

图6:Leaky-ReLU激活函数

Leaky-ReLU很好的解决了ReLU中神经元死亡的问题。因为Leaky-ReLU保留了

sigmoid函数_深度学习中激活函数总结

时的梯度,在

sigmoid函数_深度学习中激活函数总结

时,不会出现神经元死亡的问题。总结一下Leaky-ReLU的优缺点。

优点:

  • Leaky-ReLU解决了ReLU中神经元死亡的问题
  • 由于Leaky-ReLU线性特点,神经网络的计算和训练比sigmoid快很多

缺点:

  • Leaky-ReLU中的超参
    sigmoid函数_深度学习中激活函数总结
    需要人工调整

4.3 PReLU

PReLU是Kaiming He等人在2015年《

Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

》论文中提出的激活函数。和Leaky-ReLU相比,将

sigmoid函数_深度学习中激活函数总结

变成可训练的参数,不再依赖于人工调整。PReLU的定义如下:

sigmoid函数_深度学习中激活函数总结

其中

sigmoid函数_深度学习中激活函数总结

是可训练的参数。

4.4 Dice

Dice是Guorui Zhou等人在2018年《

Deep Interest Network for Click-Through Rate Prediction

》论文中提出的激活函数。

Dice是对PRelu做了平滑,使得拐点不再是固定的0,而是依赖于数据的分布

,定义如下:

sigmoid函数_深度学习中激活函数总结
sigmoid函数_深度学习中激活函数总结

图7:Dice激活函数和PReLU的对比

4.5 RReLU

RReLU(Randomized Leaky ReLU)的首次提出是在Kaggle比赛NDSB中,也是Leaky-ReLU的一个变体。RReLU在训练的过程中,

sigmoid函数_深度学习中激活函数总结

是从均匀分布

sigmoid函数_深度学习中激活函数总结

中随机选取的,RReLU在训练过程中的定义如下:

sigmoid函数_深度学习中激活函数总结

其中:

sigmoid函数_深度学习中激活函数总结

公式(18)中的

sigmoid函数_深度学习中激活函数总结

表示第

sigmoid函数_深度学习中激活函数总结

个样本的第

sigmoid函数_深度学习中激活函数总结

维输入。

sigmoid函数_深度学习中激活函数总结

图8:RReLU激活函数

在测试阶段,

sigmoid函数_深度学习中激活函数总结

取值为训练阶段所有

sigmoid函数_深度学习中激活函数总结

的平均值,即:

sigmoid函数_深度学习中激活函数总结

。NDSB竞赛冠军设置的均匀分布为:

sigmoid函数_深度学习中激活函数总结
扩展:

Bing Xu等人在2015年《

Empirical Evaluation of Rectified Activations in Convolution Network

》文章中关于ReLU,Leaky ReLU,PReLU,RReLU效果进行了详细的对比,可以参考下面的链接:

https://arxiv.org/pdf/1505.00853.pdf​arxiv.org

五、总结

从最初的sigmoid到后面的Leaky ReLU、PReLU,再到近期的SELUs、GELUs,激活函数的改进从来没有中断过。激活函数不仅解决了深层神经网络的梯度消失和爆炸问题,同时对于模型的拟合能力和收敛速度起着至关重要的重用。因此了解激活函数的相关原理还是非常有必要的。

六、Reference

  1. https://ziyubiti.github.io/2016/11/06/gradvanish/
  2. 神经网络梯度消失和梯度爆炸及解决办法
  3. https://zhuanlan.zhihu.com/p/25631496
  4. 梯度消失和ReLU - heixialee - 博客园

继续阅读