入门 | 一文了解神经网络中的梯度爆炸

2017 年 12 月 22 日 机器之心

选自MACHINE LEARNING MASTERY

作者:Jason Brownlee

机器之心编译

参与:路雪、刘晓坤


梯度爆炸指神经网络训练过程中大的误差梯度不断累积,导致模型权重出现重大更新。会造成模型不稳定,无法利用训练数据学习。本文将介绍深度神经网络中的梯度爆炸问题。


阅读本文,你将了解:

  • 什么是梯度爆炸,模型训练过程中梯度爆炸会引起哪些问题;

  • 如何确定自己的网络模型是否出现梯度爆炸;

  • 如何修复梯度爆炸问题。

什么是梯度爆炸?


误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。


在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。


网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。


梯度爆炸引发的问题


在深度多层感知机网络中,梯度爆炸会引起网络不稳定,最好的结果是无法从训练数据中学习,而最坏的结果是出现无法再更新的 NaN 权重值。


……梯度爆炸导致学习过程不稳定。


                                       ——《深度学习》,2016.


在循环神经网络中,梯度爆炸会导致网络不稳定,无法利用训练数据学习,最好的结果是网络无法学习长的输入序列数据。


如何确定是否出现梯度爆炸?


训练过程中出现梯度爆炸会伴随一些细微的信号,如:

  • 模型无法从训练数据中获得更新(如低损失)。

  • 模型不稳定,导致更新过程中的损失出现显著变化。

  • 训练过程中,模型损失变成 NaN。


如果你发现这些问题,那么你需要仔细查看是否出现梯度爆炸问题。


以下是一些稍微明显一点的信号,有助于确认是否出现梯度爆炸问题。

  • 训练过程中模型梯度快速变大。

  • 训练过程中模型权重变成 NaN 值。

  • 训练过程中,每个节点和层的误差梯度值持续超过 1.0。


如何修复梯度爆炸问题?


有很多方法可以解决梯度爆炸问题,本节列举了一些最佳实验方法。


1. 重新设计网络模型


在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。


使用更小的批尺寸对网络训练也有好处。


在循环神经网络中,训练过程中在更少的先前时间步上进行更新(沿时间的截断反向传播,truncated Backpropagation through time)可以缓解梯度爆炸问题。


2. 使用 ReLU 激活函数


在深度多层感知机神经网络中,梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。


使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的新实践。


3. 使用长短期记忆网络


在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,如随时间的反向传播本质上将循环网络转换成深度多层感知机神经网络。


使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。


采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。


4. 使用梯度截断(Gradient Clipping)


在非常深且批尺寸较大的多层感知机网络和输入序列较长的 LSTM 中,仍然有可能出现梯度爆炸。如果梯度爆炸仍然出现,你可以在训练过程中检查和限制梯度的大小。这就是梯度截断。


处理梯度爆炸有一个简单有效的解决方案:如果梯度超过阈值,就截断它们。


 ——《Neural Network Methods in Natural Language Processing》,2017.


具体来说,检查误差梯度的值是否超过阈值,如果超过,则截断梯度,将梯度设置为阈值。


梯度截断可以一定程度上缓解梯度爆炸问题(梯度截断,即在执行梯度下降步骤之前将梯度设置为阈值)。


     ——《深度学习》,2016.


在 Keras 深度学习库中,你可以在训练之前设置优化器上的 clipnorm 或 clipvalue 参数,来使用梯度截断。


默认值为 clipnorm=1.0 、clipvalue=0.5。详见:https://keras.io/optimizers/。


5. 使用权重正则化(Weight Regularization)


如果梯度爆炸仍然存在,可以尝试另一种方法,即检查网络权重的大小,并惩罚产生较大权重值的损失函数。该过程被称为权重正则化,通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。


对循环权重使用 L1 或 L2 惩罚项有助于缓解梯度爆炸。


——On the difficulty of training recurrent neural networks,2013.


在 Keras 深度学习库中,你可以通过在层上设置 kernel_regularizer 参数和使用 L1 或 L2 正则化项进行权重正则化。


延伸阅读


如想深入了解梯度爆炸,可以参阅以下资源。


书籍

  • Deep Learning, 2016.(http://amzn.to/2fwdoKR)

  • Neural Network Methods in Natural Language Processing, 2017.(http://amzn.to/2fwTPCn)

论文

  • On the difficulty of training recurrent neural networks, 2013.(http://proceedings.mlr.press/v28/pascanu13.pdf)

  • Learning long-term dependencies with gradient descent is difficult, 1994.(http://www.dsi.unifi.it/~paolo/ps/tnn-94-gradient.pdf)

  • Understanding the exploding gradient problem, 2012.(https://pdfs.semanticscholar.org/728d/814b92a9d2c6118159bb7d9a4b3dc5eeaaeb.pdf)

文章

  • Why is it a problem to have exploding gradients in a neural net (especially in an RNN)?(https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-especially-in-an-RNN)

  • How does LSTM help prevent the vanishing (and exploding) gradient problem in a recurrent neural network?(https://www.quora.com/How-does-LSTM-help-prevent-the-vanishing-and-exploding-gradient-problem-in-a-recurrent-neural-network)

  • Rectifier (neural networks)(https://en.wikipedia.org/wiki/Rectifier_(neural_networks))


Keras API


  • Usage of optimizers in the Keras API(https://keras.io/optimizers/)

  • Usage of regularizers in the Keras API(https://keras.io/regularizers/)


原文链接:https://machinelearningmastery.com/exploding-gradients-in-neural-networks/



本文为机器之心编译,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com

登录查看更多
8

相关内容

误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。 在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值。网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。
【ICML2020】持续图神经网络,Continuous Graph Neural Networks
专知会员服务
150+阅读 · 2020年6月28日
专知会员服务
73+阅读 · 2020年5月21日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
神经网络的拓扑结构,TOPOLOGY OF DEEP NEURAL NETWORKS
专知会员服务
32+阅读 · 2020年4月15日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
神经网络与深度学习,复旦大学邱锡鹏老师
专知会员服务
118+阅读 · 2019年9月24日
深度学习面试100题(第31-35题)
七月在线实验室
8+阅读 · 2018年7月16日
入门 | 从VGG到NASNet,一文概览图像分类网络
机器之心
6+阅读 · 2018年4月2日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
A Survey on Bayesian Deep Learning
Arxiv
63+阅读 · 2020年7月2日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
3+阅读 · 2018年10月25日
Neural Architecture Optimization
Arxiv
8+阅读 · 2018年9月5日
Arxiv
5+阅读 · 2018年5月5日
Arxiv
6+阅读 · 2018年2月24日
VIP会员
相关VIP内容
【ICML2020】持续图神经网络,Continuous Graph Neural Networks
专知会员服务
150+阅读 · 2020年6月28日
专知会员服务
73+阅读 · 2020年5月21日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
神经网络的拓扑结构,TOPOLOGY OF DEEP NEURAL NETWORKS
专知会员服务
32+阅读 · 2020年4月15日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
神经网络与深度学习,复旦大学邱锡鹏老师
专知会员服务
118+阅读 · 2019年9月24日
相关资讯
深度学习面试100题(第31-35题)
七月在线实验室
8+阅读 · 2018年7月16日
入门 | 从VGG到NASNet,一文概览图像分类网络
机器之心
6+阅读 · 2018年4月2日
理解神经网络的激活函数
论智
7+阅读 · 2018年1月8日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
入门 | 一文概览深度学习中的激活函数
深度学习世界
4+阅读 · 2017年11月3日
干货|浅谈神经网络中激活函数的设计
机器学习研究会
5+阅读 · 2017年10月28日
相关论文
A Survey on Bayesian Deep Learning
Arxiv
63+阅读 · 2020年7月2日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
Arxiv
4+阅读 · 2018年10月31日
Arxiv
3+阅读 · 2018年10月25日
Neural Architecture Optimization
Arxiv
8+阅读 · 2018年9月5日
Arxiv
5+阅读 · 2018年5月5日
Arxiv
6+阅读 · 2018年2月24日
Top
微信扫码咨询专知VIP会员