【问题标题】:Sudden drop in accuracy while training a deep neural net训练深度神经网络时准确率突然下降
【发布时间】:2016-05-05 07:10:46
【问题描述】:

我正在使用 mxnet 来训练一个 11 类图像分类器。我观察到一个奇怪的行为训练准确率正在缓慢增加并上升到 39%,在下一个 epoch 下降到 9%,然后在其余的训练中保持接近 9%。 我使用保存的模型(训练精度为 39%)重新开始训练,保持所有其他参数相同。现在训练准确性再次提高。这可能是什么原因?我无法理解它。而且以这种方式训练模型变得越来越困难,因为它需要我不断地查看训练准确度值。

学习率恒定在 0.01

【问题讨论】:

  • 很可能是你的学习率太高,模型跳来跳去。不知道你的超参数很难分辨
  • 学习率在 0.01
  • 有一次我遇到了类似的问题,我偶然设置了一个线性激活并使用分类交叉熵作为成本函数。

标签: neural-network deep-learning mxnet


【解决方案1】:

如您所见,您的后期准确度几乎是随机的。这种情况有两个常见问题。

  • 您的学习率很高。尝试降低它
  • 您尝试使用的错误(或熵)为您提供 NaN 值。如果您尝试将熵与对数函数一起使用,则必须精确地使用它们。

【讨论】:

  • 在我的情况下(对于不同的模型)它是NaN,由大参数引起。我通过用一些合理的值限制参数来修复它。
【解决方案2】:

在训练神经网络的过程中,经常会出现准确度提高一段时间然后变得更糟的情况——这通常是由过度拟合引起的。网络“倒霉”并陷入与准确性突然下降相对应的参数空间的不良部分也很常见 - 有时它可以快速恢复,但有时不能。

一般来说,降低学习率是解决此类问题的好方法。此外,设置像 FactorScheduler 这样的学习率计划可以通过每隔几个 epoch 降低学习率来帮助您实现更稳定的收敛。事实上,这有时可以掩盖选择过高初始学习率的错误。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我通过使用 (y-a)^a 损失函数而不是交叉熵函数解决了它(因为 log(0))。我希望这个问题有更好的解决方案。

    【讨论】:

      【解决方案4】:

      这些问题经常出现。我观察到这可能是由于以下原因之一:

      1. 返回 NaN 的东西
      2. 网络的输入与预期不符 - 许多现代框架在某些此类情况下不会引发错误
      3. 模型层有时会出现不兼容的形状

      【讨论】:

        【解决方案5】:

        这可能是因为 0log0 返回 NaN。

        您可以通过以下方式避免它;

        cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0)))

        【讨论】:

        • 您不应该通过裁剪 logits 来限制损失来限制梯度,这实际上会在这些间隔中创建一个 0 的梯度,并且网络会卡住。您应该直接剪辑渐变。
        猜你喜欢
        • 2019-08-07
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 2017-10-12
        • 1970-01-01
        • 2018-06-11
        • 2011-04-07
        相关资源
        最近更新 更多