如何理解神经⽹络中的梯度爆炸?
梯度爆炸指神经⽹络训练过程中⼤的误差梯度不断累积,导致模型权重出现重⼤更
新。会造成模型不稳定,⽆法利⽤训练数据学习。本⽂将介绍深度神经⽹络中的梯
度爆炸问题。
读完本⽂,你将了解:
什么是梯度爆炸,模型训练过程中梯度爆炸会引起哪些问题;
如何确定⾃⼰的⽹络模型是否出现梯度爆炸;
如何修复梯度爆炸问题。
什么是梯度爆炸?
误差梯度是神经⽹络训练过程中计算的⽅向和数量,⽤于以正确的⽅向和合适的量更新⽹络权重。
在深层⽹络或循环神经⽹络中,误差梯度可在更新中累积,变成⾮常⼤的梯度,然后导致⽹络权重的⼤幅更新,并因此使⽹络变得不稳定。在极端情况下,权重的值变得⾮常⼤,以⾄于溢出,导致 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。详见: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.(/2fwdoKR)
Neural Network Methods in Natural Language Processing, 2017.(/2fwTPCn)
论⽂
On the difficulty of training recurrent neural networks, 2013.
(proceedings.mlr.press/v28/pascanu13.pdf)
Learning long-term dependencies with gradient descent is difficult, 1994.
(www.dsi.unifi.it/~paolo/ps/tnn-94-gradient.pdf)
Understanding the exploding gradient problem, 2012.
(/728d/814b92a9d2c6118159bb7d9a4b3dc5eeaaeb.pdf)⽂章
Why is it a problem to have exploding gradients in a neural net (especially in an RNN)?(www.quora/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?(www.quora/How-does-LSTM-help-prevent-the-vanishing-and-exploding-gradient-problem-in-a-recurrent-neural-network)
Rectifier (neural networks)(/wiki/Rectifier_(neural_networks))
Keras API
Usage of optimizers in the Keras API(keras.io/optimizers/)
Usage of regularizers in the Keras API(keras.io/regularizers/)
艺么么哒 12-19 23:51关注
神经⽹络利⽤反向传播⽅法传播梯度,在传播过程中计算每层梯度都是⼀系列的式⼦连乘的结
⼀般观察到的现象果,如果连乘的因⼦⼤部分⼤于1,那么在训练过程中可能出现梯度爆炸,⼀般观察到的现象就是训练过程中loss变成nan
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论