Loading...
墨滴

algolearn

2021/12/08  阅读:64  主题:默认主题

梯度消失和梯度爆炸现象

1 什么是梯度消失和梯度爆炸💥

梯度消失(gradient vanishing)和梯度爆炸(gradient exploding)一般出现在层数比较多的神经网络中。

以下面MLP为例,当梯度消失发生时,最后一个隐层梯度更新基本正常,但是越往前的隐层内更新越慢,甚至有可能会出现停滞,此时,多层深度神经网络可能会退化为浅层的神经网络(只有后面几层在学习),因为浅层基本没有学习,对输入仅仅做了一个映射而已。

以下图为例,输入 ,最后一层输出 , 损失函数喂 ,激活函数为 。下图可以描述为:

根据链式法则,对 求导得:

激活函数 的导数为 ,函数曲线如下图。函数的峰值为0.25。

如果在参数初始化的时候, 大都是小余1的,并且随着激活函数导数的连乘 ,(因为是按照最大值0.25计算的,实际上还要小余 ),当层数越多,导数 越小,因此会导致梯度消失现象。

如果在参数初始化的时候, 特别大,导致 ,,当层数越多,导数 的累✖️越大,因此会导致梯度爆炸💥现象。

2 如何避免

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

2.1 激活函数

RELU及其变体

2.2 BN

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值x随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数(激活函数)的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。

而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

2.3 残差网络

2.4 逐层训练

思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入。

2.5 梯度剪切

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

2.6 正则化

另一种防止梯度爆炸的手段是采用权重正则化,根据正则项在可以看出,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。

欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~

算法工程师面试那些事儿
算法工程师面试那些事儿

algolearn

2021/12/08  阅读:64  主题:默认主题

作者介绍

algolearn