梯度消失和梯度爆炸

1.神经网络

神经网络其实就是一个多层的感知器,我们下面来看下其结构:

å¨è¿éæå¥å¾çæè¿°

从上面的图例我们可以看出来,神经网络主要分为3种网络层

输入层:就是数据输入神经网络的入口,比如MNIST是28*28的像素点集,则输入层就需要有28*28个输入神经元 + 一个代表偏移量的输入神经元(如图:左侧常量的神经元)
隐藏层:就是神经网络的中间层,可能有一点抽象,
           举个例子:一个人脸识别系统,假设有3个隐藏层
                          隐藏层1: 识别眼睛和眉毛的特征
                          隐藏层2: 识别嘴巴和耳朵的特征
                          隐藏层3: 识别肤色即全部人脸
           隐藏层就是从低到高逐层抽象的网络层
输出层:就是模型预测值的输出口,这里我们使用常用的softmax,用于分类MNIST的图像类别


那么,可以看出来:
从下到上(输出层 -> 隐藏层 -> 输出层),就是训练模型的过程: 小批量/全量数据逐步调节权重,基于loss函数寻求最优loss的过程
自上而下,进行反向微分调参,下面我们会基于此来进行梯度爆炸和消失的问题剖析

到这里我们对神经网络有了一个初步的认识,下面来进入重点 梯度消失梯度爆炸

2.梯度消失和梯度爆炸

正如之前所说,反向传播算法(即BP算法)是从输出层反向传到输入层,逐层传递误差梯度,进而进行权重的更新;
我们应该知道无论是机器学习还是深度学习(DNN)都是在一次次训练中根据前一次的误差进行梯度下降更行权重
这时候随着网络层的增加,我们会暴露两个问题: 梯度消失 和 梯度爆炸

2.1.从深度网络的角度说明梯度消失和梯度爆炸

深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导法则,计算每层梯度的时候会涉及一些连乘操作。因此,对激活函数进行求导时,如果此部分大于1,显而易见层数很多的时候,最终求出的梯度更新将以指数形式增加,即发生梯度爆炸;如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失

2.2 从激活函数的角度来看

计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了,原因看下图,左图是sigmoid的损失函数图,右边是其导数的图像,如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。

2.2.1 sigmoid函数及其导数的数学表达式为:

下面我们来看其函数及其导函数图像:

å¨è¿éæå¥å¾çæè¿°

2.2.2 tanh作为激活函数

tanh作为激活函数,它的导数如下,可以看出,tanh比sigmoid要好一些,但是它的导数仍然是小于1的。tanh数学表达为:

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

3. 解决梯度爆炸和梯度消失的方案

3.1 预训练加微调

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

3.2 梯度剪切、正则

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
注:在WGAN中也有梯度剪切限制操作,但是和这个是不一样的,WGAN限制梯度更新信息是为了保证lipchitz条件。
另外一种解决梯度爆炸的手段是采用权重正则化,比较常见的又L1正则和L2正则。正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:

å¨è¿éæå¥å¾çæè¿°

a是正则化系数,如果发生梯度爆炸,权值的范数就会变得非常大,通过正则化项,可以部分抑制。

3.3 采用不同的激活函数

(1) ReLU函数:

如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,ReLU就这样应运而生。

å¨è¿éæå¥å¾çæè¿°

ReLU的主要贡献在于:

  • 解决了梯度消失、爆炸的问题。
  • 计算方便,计算速度快。
  • 加速了网络的训练。

同时也存在一些缺点:

  • 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)。
  • 输出不是以0为中心的。

(2) LeakyReLU函数:

LeakyReLU就是为了解决ReLU的0区间带来的影响,该函数输出对负值输入有很小的坡度,由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢),解决了ReLU函数进入负区间后,导致神经元不学习的问题。

å¨è¿éæå¥å¾çæè¿°

(3) ELU函数:

å¨è¿éæå¥å¾çæè¿°

  • 融合了sigmoid和ReLU,左侧具有软饱和性,右侧无饱和性。
  • 右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。
  • ELU的输出均值接近于零,所以收敛速度更快,但相对于LeakyReLU来说,计算要更耗时间一些。

还有其他一些激活函数,如下表:

ææ¯å享

3.4 Batch Normalization

BN是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,BN本质上是解决反向传播过程中的梯度问题。BN全名是Batch Normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
有关Batch Normalization详细的内容可以参考这篇博客:Batch Normalization

3.5 残差结构

事实上,就是残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分。具体关于残差网络ResNet的理解后续再来解析。

3.6 LSTM网络

LSTM是循环神经网络RNN的变体,全称是长短期记忆网络(long-short term memory networks),它是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”结构,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的“残留记忆”,因此,经常用于生成文本中。关于LSTM的原理详解后续再分析。

å¨è¿éæå¥å¾çæè¿°

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值