查看原文
其他

【综述专栏】梯度爆炸与梯度消失

在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。

作者:知乎—林中鹿

地址:https://zhuanlan.zhihu.com/p/356915267

发现很多文章都只写了梯度爆炸/消失产生的原因及其解决方法,却没有介绍如何发现及有何影响,故作此总结。
本文分为以下四个部分:1.产生原因,2.有何影响,3.如何发现,4.怎么解决。


01

产生原因
一般来说,梯度爆炸与梯度消失的本质上是一样的,都是因为微分中的链式法则带来的梯度反向传播中的连乘效应,在网络层数太深时会引发梯度爆炸/消失问题。权重w大于1则梯度爆炸,小于1则梯度消失,因此可以通过激活函数大于1/小于1的概率预估其分别发生梯度爆炸/消失问题的概率。
但其实梯度爆炸也可能是由不正确的处理方式,如在输入层/输出层乘上了过大的系数导致

02

有何影响
二者共同的影响是模型无法从训练数据中获得更新,而使得最终模型效果差,但存在区别。
梯度爆炸:梯度快速变大,前面几层网络中部分参数极大,甚至为NaN。
1)由于是否触发极大参数神经元存在概率,因而模型不稳定,进而导致更新过程中的损失出现显著变化。
2)可能出现loss NaN。
梯度消失:梯度快速变小,前面几层网络中部分参数极小,甚至为0。
1)几乎只有最后几层网络生效,但由于输入层在前面网络中,因而模型输出变化幅度较小。

03

如何发现
直接方法:可以通过tensorboard可视化每层的梯度分布。
间接方法:可以分析顶层网络输出数据分布,如果数据分布方差变得特别大,那么梯度爆炸;变得非常小,则梯度消失。

04

怎么解决

二者的解决方法是一样的。
4.1 合适的初始化方式
无法完全解决,但可以有效缓解该问题。
建议结合方差随机初始化参数:第l层参数 w[l] = np.randomn(shape)*np.sqrt(2 / n[l - 1])
1)注意不同的激活函数的方差不同,ReLU采用2 / n[l - 1],tanh采用1 / n[l - 1]或者2 / (n[l - 1] + n[l])(来自Xavier init)。
2)可以增加方差超参数对方差进行缩放,但相较于其他超参数,其优先度很低。
注,参数的初始化方式通常有以下三种:
1. 预训练初始化:一般是在大规模数据上已经训练过的模型可以提供一个较好的参数初始值,并能提升模型的泛化能力(一种解释是预训练任务起到一定的正则化作用)。
2. 随机初始化:如果全部初始化为0,在神经网络第一遍前向传播所有隐层神经网络激活值相同,反向传播权重更新也相同,导致隐层神经元没有区分性,称为“对称权重”现象,其真实效果相当于单个神经元。为打破这个平衡,比较好的方式是对每个参数进行随机初始化。
3. 固定值初始化:对于bias的初始化存在经验值,通常用0初始化;对于ReLU神经元,bias设为0.01,使得训练初期更容易激活;LSTM遗忘门bias通常为1或2,使时序上的梯度变大。
4.2 换用ReLU、LeakyReLU、ELU等激活函数
ReLU:让激活函数的导数为1(缺点:由于负数部分恒为0,会导致一些神经元无法激活,可通过设置小学习率部分解决)。
LeakyReLU:包含了ReLU的几乎所有优点,同时解决了ReLU中0区间带来的影响。
ELU:和LeakyReLU一样,都是为了解决0区间问题,相对于来,ELU计算更耗时一些。
4.3 采用BatchNorm
BatchNorm是对每一层的输出做scale和shift的方法。通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正态分布。
防止梯度消失原理:正则化后的输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生。
防止梯度爆炸原理:正则化后的输入值所在区域的梯度小于1。
注:而且使用BN层后可以增加学习率,进而大大加快训练速度。
4.4 梯度剪切与正则化可以有效防止梯度爆炸
这条就不需要介绍原理了。
4.5 残差结构与LSTM可以有效防止梯度消失
二者的原理类似,以残差网络为例,残差中有很多跨层连接结构,如下图所示:
这样的结构在反向传播中具有很大的好处,见下式:
小括号中的1表明shortcut可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。
4.6 预训练加微调(几乎不采用)
此方法来自Hinton在2006年发表的一篇论文,并在训练深度信念网络(Deep Belief Networks)应用,是Hinton为了解决梯度问题,而提出的无监督逐层训练方法。
其基本思想是:每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再利用BP算法对整个网络进行“微调”(fine-tunning),相当于是先寻找局部最优,然后整合起来寻找全局最优。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“综述专栏”历史文章


更多综述专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存