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

时间:2017-02-19 13:05:45

标签: tensorflow neural-network deep-learning conv-neural-network

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

Loss explodes

训练数据本身是随机的,分布在许多.tfrecord个文件中,每个文件包含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时,它会更快地突破)。正规化对这一点也没有影响,它在某种程度上也是如此。

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

1 个答案:

答案 0 :(得分:3)

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

继续探索! :)