训练 CNN 时损失突然爆炸的原因是什么(Deeplab)

数据挖掘 神经网络 深度学习 张量流 训练 损失函数
2021-10-12 14:14:31

我正在训练以下 deeplab CNN: https ://github.com/tensorflow/models/tree/master/research/deeplab

在训练期间,我看到以下损失: 在此处输入图像描述

训练的前 50k 步损失相当稳定且很低,然后突然开始呈指数爆炸式增长。我想知道这怎么会发生。当然,损失增加的原因有很多,比如学习率太高。但我不明白的是:

  • 我使用 16 的批量大小并且我有 24k 图像,因此 24k/16=1500 步用于完整传递火车数据
  • 只有在 50k 步之后,损失才开始爆炸,在此之前它非常稳定。
  • 所以在我的训练集的第 34 次迭代左右,损失开始突然增加。为什么只有现在?怎么可能稳定了这么久,突然暴增?
2个回答

一个可能的原因可能是某些权重或梯度的数值不稳定性。

例如,某些权重或梯度可能变得太小,因此当您使用它们进行计算时,它会给出不正确(“爆炸”)的结果。如果它们变得太大,也会发生同样的情况。

为确保不会发生这种情况,建议在网络的某些关键部分进行裁剪。我会首先尝试在损失计算中进行裁剪。一个例子在这里:

https://github.com/keras-team/keras/blob/master/keras/backend/tensorflow_backend.py#L3582

这是在 Keras 中计算的交叉熵 - 在计算最终损失之前,这条线会剪切 logit 值。裁剪的原因是tf.log计算:log(0)从明显的原因(它是负无穷大)和在反向传播中不会产生任何信号的log(1)给出是有问题的。0

当然,这可能是您遇到问题的原因之一。根据我的经验,这将是我要检查的第一件事。如果您检查(打印)可能是可疑数字的值(例如损失计算期间的值,...),我会帮助您

此外,请确保网络的输入数据已标准化(从 [0, 1] 区间开始)。否则,你的权重会很大,如果你有很大的权重,输入的微小变化可能会产生非常不同的输出(换句话说,网络变得不稳定,对输入变化过于敏感)。

一个可能的原因是高学习率。此超参数的高值通常会导致更新过于剧烈,从而偏离最佳值。

请记住,这只是一个建议,您的问题可能是由于完全不同的原因造成的。尝试不同的学习率和时间表,以了解是否是这种情况。您可以查看这篇关于如何设置学习率的非常好的帖子。

此外,考虑使用提前停止来节省一些训练时间。