首页 文章

亚当优化器在20万批次之后变得混乱,训练损失增加

提问于
浏览
25

在训练网络时,我一直看到一种非常奇怪的行为,经过几十次迭代(8到10小时)的学习,一切都中断,训练损失增加:

Loss explodes

训练数据本身是随机的,并且分布在许多包含 1000 示例的文件中,然后在输入阶段再次进行洗牌并分批到 200 示例 .

背景

我正在设计一个同时执行四种不同回归任务的网络,例如确定物体出现在图像中并同时确定其方向的可能性 . 网络以几个卷积层开始,一些具有剩余连接,然后分支到四个完全连接的段 .

由于第一次回归导致概率,我使用交叉熵进行损失,而其他使用经典L2距离 . 然而,由于它们的性质,概率损失大约为 0..1 ,而定向损失可能要大得多,比如 0..10 . 我已经将输入和输出值标准化并使用剪切

normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)

在事情变得非常糟糕的情况下 .

我已经(成功地)使用Adam优化器来优化包含所有不同损失的张量(而不是 reduce_sum ),如下所示:

reg_loss = tf.reduce_sum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
loss = tf.pack([loss_probability, sin_cos_mse, magnitude_mse, pos_mse, reg_loss])

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate,
                                   epsilon=self.params.adam_epsilon)
op_minimize = optimizer.minimize(loss, global_step=global_step)

为了在TensorBoard中显示结果,我实际上是这样做的

loss_sum = tf.reduce_sum(loss)

标量摘要 .

Adam被设置为学习率 1e-4 和epsilon 1e-4 (我看到与epislon的默认值相同的行为,当我将学习率保持在 1e-3 时它会更快地突破) . 正规化对这一点也没有影响,它在某种程度上是这样做的 .

我还应该补充说,停止训练并从最后一个检查点重新启动 - 这意味着训练输入文件也会再次洗牌 - 导致相同的行为 . 在那一点上,训练似乎总是表现得相似 .

2 回答

  • 3

    是 . 这是亚当的一个已知问题 .

    亚当的方程是

    t <- t + 1
    lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
    
    m_t <- beta1 * m_{t-1} + (1 - beta1) * g
    v_t <- beta2 * v_{t-1} + (1 - beta2) * g * g
    variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)
    

    其中 m 是平均梯度的指数移动平均值, v 是梯度平方的指数移动平均值 . 问题是,当你长时间训练并接近最佳状态时, v 会变得非常小 . 如果然后突然间梯度开始再次增加,它将被除以非常小的数量并爆炸 .

    默认情况下 beta1=0.9beta2=0.999 . 所以 m 的变化比 v 快得多 . 所以 m 可以再次开始变大,而 v 仍然很小,无法赶上 .

    要解决此问题,您可以增加 epsilon ,默认情况下为 10-8 . 因此,停止几乎除以0的问题 . 根据您的网络, 0.10.010.001 中的值 epsilon 可能是好的 .

  • 37

    是的,这可能是某种超级复杂的不稳定数字/方程式情况,但最确定的是你的训练率只是很高,因为你的损失会迅速减少到25K,然后在相同的水平上振荡很多 . 尝试将其减少0.1倍,看看会发生什么 . 你应该能够达到更低的损失 Value .

    继续探索! :)

相关问题