梯度爆炸和梯度消失——引入的误差越来越多,同时有用信息减少,同时想到的了relay BP

这个将是对于用基于梯度优化方法的死结。

https://machinelearningmastery.com/exploding-gradients-in-neural-networks/

爆炸梯度是一个问题,其中大的误差梯度累积并导致在训练期间对神经网络模型权重的非常大的更新。

这会导致您的模型不稳定,无法从您的训练数据中学习。

在这篇文章中,您将发现使用深度人工神经网络爆炸梯度的问题。

完成这篇文章后,你会知道:

  • 爆炸的梯度是什么以及它们在训练过程中引起的问题。
  • 如何知道您的网络模型是否有爆炸渐变。
  • 如何解决网络中的爆炸梯度问题。

让我们开始吧。

  • 更新Oct / 2018:删除了ReLU作为解决方案的提及。

回归神经网络中爆炸梯度的温和介绍

回顾神经网络中爆炸梯度的温和介绍
照片由Taro Taylor提供,保留一些权利。

什么是爆炸梯度?

误差梯度是在训练神经网络期间计算的方向和幅度,该神经网络用于以正确的方向和正确的量更新网络权重。

在深度网络或递归神经网络中,误差梯度可能在更新期间累积并导致非常大的梯度。这反过来会导致网络权重的大量更新,进而导致网络不稳定。在极端情况下,权重值可能会变得很大,以至于溢出并导致NaN值。

通过重复地将梯度乘以具有大于1.0的值的网络层,爆炸通过指数增长发生。

爆炸梯度有什么问题?

在深层多层Perceptron网络中,爆炸梯度可能导致网络不稳定,最多无法从训练数据中学习,最坏的情况是导致无法再更新的NaN权重值。

爆炸性的渐变会使学习变得不稳定。

- 第282页,深度学习,2016年。

在递归神经网络中,爆炸性梯度可能导致不稳定的网络无法从训练数据中学习,并且最多是无法通过长输入数据序列学习的网络。

...爆炸梯度问题是指训练期间梯度范数的大幅增加。这些事件是由于长期成分的爆炸造成的

关于训练复发神经网络的难度,2013。

你怎么知道你是否有爆炸的梯度?

有一些微妙的迹象表明您在网络培训期间可能会遇到爆炸性的梯度,例如:

  • 该模型无法获得您的训练数据(例如损失不大)。
  • 该模型不稳定,导致从更新到更新的损失发生很大变化。
  • 在训练期间模型损失归NaN所有。

如果你有这些类型的问题,你可以深入挖掘,看看你是否有爆炸渐变的问题。

有一些不太微妙的迹象可以用来确认你有爆炸的渐变。

  • 在训练期间,模型权重很快变得非常大。
  • 模型权重在训练期间达到NaN值。
  • 在训练期间,每个节点和层的误差梯度值始终高于1.0。

如何修复爆炸梯度?

解决爆炸梯度的方法有很多种; 本节列出了一些您可以使用的最佳实践方法。

1.重新设计网络模型

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

在训练网络时使用较小的批量大小也可能有一些好处。

在递归神经网络中,在训练期间通过较少的先前时间步骤进行更新(称为截断反向传播)可以减少爆炸梯度问题。

2.使用长短期内存网络

在递归神经网络中,考虑到这种类型网络的训练中的固有不稳定性,例如通过基本上将时间反向传播,基本上将复现网络转换成深层多层感知器神经网络,可以发生梯度爆炸。

通过使用长短期记忆(LSTM)存储器单元和可能相关的门控型神经元结构,可以减少爆炸梯度。

采用LSTM存储器单元是用于序列预测的递归神经网络的新的最佳实践。

3.使用渐变剪辑

在具有大批量大小和具有非常长输入序列长度的LSTM的非常深的多层感知器网络中仍然可能发生爆炸梯度。

如果仍然出现爆炸渐变,您可以在网络训练期间检查并限制渐变的大小。

这称为渐变剪裁。

处理爆炸梯度有一个简单但非常有效的解决方案:如果它们的范数超过给定阈值,则剪切梯度。

- 第5.2.4节,消失和爆炸梯度,自然语言处理中的神经网络方法,2017年。

具体地,如果误差梯度超过阈值,则针对阈值检查误差梯度的值并将其限幅或设置为该阈值。

在某种程度上,可以通过梯度限幅(在执行梯度下降步骤之前对梯度值进行阈值处理)来减轻爆炸梯度问题。

- 第294页,深度学习,2016年。

在Keras深度学习库中,您可以通过在训练之前在优化器上设置clipnormclipvalue参数来使用渐变剪裁。

好的默认值是clipnorm = 1.0clipvalue = 0.5

4.使用重量正规化

如果仍然出现爆炸梯度,则另一种方法是检查网络权重的大小,并对网络损失函数应用较大权重值的惩罚。

这称为权重正则化,并且通常可以使用L1(绝对权重)或L2(平方权重)惩罚。

对复发权重使用L1或L2惩罚可以帮助爆炸渐变

关于训练复发神经网络的难度,2013。

在Keras深度学习库中,您可以通过在图层上设置kernel_regularizer参数并使用L1L2正则化器来使用权重正则化。

消失梯度问题是在使用基于梯度的方法(例如反向传播)训练某些人工神经网络时发现的困难。特别是,这个问题使得学习和调整网络中较早层的参数变得非常困难。随着架构中层数的增加,这个问题变得更糟。

这不是神经网络的基本问题 - 这是由某些激活函数引起的基于梯度的学习方法的问题让我们试着直观地理解问题及其背后的原因。

问题

基于梯度的方法通过了解参数值的微小变化将如何影响网络输出来学习参数值。如果参数值的变化导致网络输出的变化非常小 - 网络就无法有效地学习参数,这是一个问题。

这正是消失的梯度问题中发生的事情 - 网络输出相对于早期层中参数的梯度变得非常小。这是一种奇特的说法,即使早期层的参数值发生很大变化也不会对输出产生很大影响。让我们试着了解这个问题发生的时间和原因。

原因

消失梯度问题取决于激活函数的选择。许多常见的激活函数(例如,sigmoid或tanh)以非常非线性的方式将它们的输入“压缩”到非常小的输出范围内。例如,sigmoid将实数行映射到[0,1]的“小”范围。结果,输入空间的大区域被映射到极小范围。在输入空间的这些区域中,即使输入的大的变化也会在输出中产生小的变化 - 因此梯度很小。

当我们将多个这样的非线性层堆叠在彼此之上时,这变得更加糟糕。例如,第一层将大输入区域映射到较小的输出区域,该较小的输出区域将被第二层映射到更小的区域,第三层将被映射到更小的区域,依此类推。结果,即使第一层的参数的大的变化也不会大大改变输出。

我们可以通过使用激活函数来避免这个问题,激活函数没有将输入空间“压缩”到一个小区域的属性。一种流行的选择是整流线性单位,它将[math] x [/ math]映射到[math] max(0,x)[/ math]。

希望这有助于您了解渐变渐渐消失的问题。我还建议阅读这个 iPython笔记本,它做了一个小实验,以理解和可视化这个问题,并突出了sigmoid和矫正线性单位的行为之间的差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值