【问题标题】:Why is Normalization causing my network to have exploding gradients in training?为什么归一化会导致我的网络在训练中出现爆炸梯度?
【发布时间】:2021-09-08 08:43:31
【问题描述】:

我已经构建了一个网络(在 Pytorch 中),该网络在图像恢复方面表现良好。我正在使用带有 Resnet50 编码器主干的自动编码器,但是,我只使用 1 的批量大小。我正在尝试一些频域的东西,它一次只能处理一个图像。

我发现我的网络表现相当不错,但是,只有当我从网络中删除所有批量标准化时,它才会表现良好。现在当然批量规范对于批量大小为 1 是无用的,所以我切换到为此目的而设计的组规范。然而,即使使用群范数,我的梯度也会爆炸。训练可以很好地进行 20 - 100 个 epoch,然后游戏结束。有时它会恢复并再次爆炸。

我还应该说,在训练中,输入的每张新图像都会被赋予完全不同的噪声量,以训练随机噪声量。以前已经这样做过,但可能与 1 的批量大小相结合可能会出现问题。

我在这个问题上摸不着头脑,我想知道是否有人有建议。我已经调整了我的学习率并削减了最大梯度,但这并不能真正解决实际问题。我可以发布一些代码,但我不确定从哪里开始,希望有人能给我一个理论。有任何想法吗?谢谢!

【问题讨论】:

    标签: python tensorflow image-processing pytorch autoencoder


    【解决方案1】:

    为了回答我自己的问题,我的网络在训练中不稳定,因为批量大小为 1 使得数据在批次之间差异太大。或者正如论文所说的那样,内部协变量偏移太高了。

    我的图像不仅来自一个非常庞大的不同数据集,而且它们还被随机旋转和翻转。除此之外,为每张图像选择 0 到 30 之间的随机高斯噪声,因此一张图像可能几乎没有噪声,而下一张在某些情况下可能几乎无法区分。或者正如论文所说的那样,内部协变量偏移太高了。

    在上面的问题中,我提到了组规范——我的网络很复杂,一些代码是从其他工作改编而来的。我的代码中仍然隐藏了一些我错过的批处理规范函数。我删除了它们。我仍然不确定为什么国阵会让事情变得更糟。

    在此之后,我使用大小为 32 的组重新实现了组规范,现在训练的效果要好得多。

    简而言之,删除额外的 BN 并添加组规范会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2021-01-25
      • 1970-01-01
      • 2017-10-12
      • 2018-02-17
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多