如何确定梯度爆炸和解决梯度爆炸

github博客传送门
csdn博客传送门

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

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

  1. 模型无法从训练数据中获得更新(如低损失)。
  2. 模型不稳定,导致更新过程中的损失出现显著变化。
  3. 训练过程中,模型损失变成 NaN。

如果你发现这些问题,那么你需要仔细查看是否出现梯度爆炸问题。
以下是一些稍微明显一点的信号,有助于确认是否出现梯度爆炸问题。

  1. 训练过程中模型梯度快速变大。
  2. 训练过程中模型权重变成 NaN 值。
  3. 训练过程中,每个节点和层的误差梯度值持续超过 1.0。

解决办法:

重新设计网络模型
  1. 在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。
  2. 使用更小的批尺寸对网络训练也有好处。
  3. 在循环神经网络中,训练过程中在更少的先前时间步上进行更新(沿时间的截断反向传播,truncated Backpropagation through time)可以缓解梯度爆炸问题。
使用 ReLU 激活函数
  1. 在深度多层感知机神经网络中,梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。
  2. 使用 ReLU 激活函数可以减少梯度爆炸。
使用长短期记忆网络
  1. 在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,如随时间的反向传播本质上将循环网络转换成深度多层感知机神经网络。
  2. 使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。
使用梯度截断(Gradient Clipping)
  • 在非常深且批尺寸较大的多层感知机网络和输入序列较长的 LSTM 中,仍然有可能出现梯度爆炸。如果梯度爆炸仍然出现,你可以在训练过程中检查和限制梯度的大小。这就是梯度截断。
  • 处理梯度爆炸有一个简单有效的解决方案:如果梯度超过阈值,就截断它们。
    具体来说,检查误差梯度的值是否超过阈值,如果超过,则截断梯度,将梯度设置为阈值。
使用权重正则化(Weight Regularization)
  • 如果梯度爆炸仍然存在,可以尝试另一种方法,即检查网络权重的大小,并惩罚产生较大权重值的损失函数。该过程被称为权重正则化,通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。
    对循环权重使用 L1 或 L2 惩罚项有助于缓解梯度爆炸。
print_r('点个赞吧');
var_dump('点个赞吧');
NSLog(@"点个赞吧!")
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!")
Response.Write("点个赞吧");
alert(’点个赞吧’)
posted @ 2018-12-23 14:56  账号  阅读(1801)  评论(0编辑  收藏  举报