深度学习基础知识---梯度弥散 梯度爆炸

目录

1 梯度弥散、梯度爆炸的成因

2  解决方式

2.1.pretrain+finetune

2.2 梯度裁剪

2.3 权重正则化

2.5 Batch Normalization正则化

2.6 残差结构 shortcut

2.7 LSTM


1 梯度弥散、梯度爆炸的成因

神经网络的层(主要是隐藏层)越多,对输入特征抽象层次越高。因为在神经网络中,后一层神经元的输入是前一层输出的加权和,前一层的特征在后一层就被抽象出来了,学习的过程其实就是调节和优化各连接权重和阈值的过程。

理论上层数越多,效果越好。然而实际上,盲目不停地增加层数,则会容易引起overfitting,从而导致预测效果不好,所以并不是层数越多,预测效果就一定会越好的。

简单地增加深度,会导致梯度弥散(梯度消失)梯度爆炸

梯度消失:随着深度增加,梯度急剧减小。梯度消失是指在反向传播过程中梯度逐渐降低到0导致参数不可学习的情况。最后几层可以改变,但前几层(靠近输入层的隐含层神经元)相对固定,变为浅层模型,不能有效地学习。很大程度上是来自于激活函数的饱和。

原因:根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。如果激活函数的导数小于1,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多的小于1的数而越来越小,最终就会趋近于0,例如sigmoid函数,其导数f′(x)=f(x)(1−f(x))的值域为(0,1/4),极易发生这种情况。所以梯度消失出现的原因经常是因为网络层次过深,以及激活函数选择不当,比如sigmoid函数。

梯度消失的表现

模型无法从训练数据中获得更新,损失几乎保持不变。

梯度爆炸:梯度消失相反,在反向传播过程中由于梯度过大导致模型无法收敛的情形。导致靠近输入层的隐含层神经元调整变动极大。

原因:根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大。

       同梯度消失的原因一样,求解损失函数对参数的偏导数时,在梯度的连续乘法中总是遇上很大的绝对值,部分参数的梯度因为乘了很多较大的数而变得非常大,导致模型无法收敛。
所以梯度爆炸出现的原因也是网络层次过深,或者权值初始化值太大

梯度爆炸的表现

(1)模型型不稳定,更新过程中的损失出现显著变化。
(2)训练过程中,模型损失变成 NaN。

2  解决方式

2.1.pretrain+finetune

在预训练完成后,再对整个网络进行“微调”(fine-tunning),此思想相当于是先寻找局部最优,然后整合起来寻找全局最优。

2.2 梯度裁剪

主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,通过这种直接的方法就可以防止梯度爆炸。

2.3 权重正则化

L1正则:在损失函数里加入参数绝对值之和

L2正则:在损失函数里加入参数的平方和

如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。事实上,在深度神经网络中,往往是梯度消失出现的更多一些。

2.4 ReLU、LeakReLU、ELU等激活函数 替换sigmoid

                                                         sigmoid激活函数

饱和神经元会使得梯度消失问题雪上加霜,假设神经元输入Sigmoid的值特别大或特别小,对应的梯度约等于0,即使从上一步传导来的梯度较大,该神经元权重(w)和偏置(bias)的梯度也会趋近于0,导致参数无法得到有效更新,使用梯度下降优化算法更新网络很慢。

ReLU激活函数

ReLU激活函数成为了大多数神经网络的默认选择。①解决了梯度消失、爆炸的问题 ②计算方便,计算速度快 ③加速了网络的训练。同时也存在一些缺点:①由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)②输出不是以0为中心的

LeakyReLU激活函数

PReLU的α是用梯度下降学出来的

2.5 Batch Normalization正则化

Batch Normalization具有加速网络收敛速度,提升训练稳定性的效果,BN本质上是解决反向传播过程中的梯度问题。需要对数据做归一化,因为神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果。但如果数据的分布一直在变,学习就很难了。BN 批规范化,就是为了解决分布变化问题。

需要BN的原因:一方面,如果每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。

另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift(内部协变量偏移),会给下一层的网络学习带来困难。

Internal Covariate Shift:上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,发生在神经网络的内部。和Covariate Shift,训练数据和测试数据存在分布的差异性不同。

BN是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度。

为什么不能直接对神经网络的每一层做归一化:

避免学到的特征分布被归一化,学不到数据的特征。因此要加入可训练的参数做归一化,实现BN。

BN applied to x over a mini-batch

其中引入了缩放变量γ和平移变量β。之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了。为了保证模型的表达能力不因为规范化而下降。

β是再平移参数,γ是再缩放参数。

优点:

1)没有它之前,需要小心的调整学习率和权重初始化,但是有了BN可以放心的使用大学习率,但是使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度。

2)Batchnorm本身上是一种正则的方式,可以代替其他正则方式如dropout

3)BN降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。

(1)加快收敛速度:如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把 每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。

(2)防止梯度爆炸和梯度消失:以sigmoid为例,sigmoid函数使得输出在[0,1]之间。

(3) 防止过拟合:在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。

为什么先BN 再ReLU(非线性激活层)--> BN+ReLU

2.6 残差结构 shortcut

接下来一讲 介绍 ResNet 等具有残差结构的经典网络。残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分。

2.7 LSTM

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

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thequitesunshine007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值