【发布时间】:2017-07-08 17:27:57
【问题描述】:
我在训练网络时看到了一种非常奇怪的行为,在经过 10 万次迭代(8 到 10 小时)之后,一切都很好,训练损失增长:
训练数据本身是随机分布的,分布在许多 .tfrecord 文件中,每个文件都包含 1000 示例,然后在输入阶段再次打乱并批处理到 200 示例。
背景
我正在设计一个同时执行四个不同回归任务的网络,例如确定对象出现在图像中的可能性并同时确定其方向。该网络从几个卷积层开始,其中一些具有残差连接,然后分支为四个全连接段。
由于第一次回归产生概率,我使用交叉熵作为损失,而其他人使用经典 L2 距离。然而,由于它们的性质,概率损失约为0..1,而方向损失可能更大,例如0..10。我已经对输入和输出值进行了规范化并使用了裁剪
normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)
在事情可能变得非常糟糕的情况下。
我一直(成功地)使用 Adam 优化器优化包含所有不同损失的张量(而不是 reduce_suming 他们),如下所示:
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 时,它会更快地中断)。正则化对此也没有影响,它在某些时候会始终如一地这样做。
我还应该补充一点,停止训练并从最后一个检查点重新开始 - 这意味着训练输入文件也会再次打乱 - 会导致相同的行为。在那一点上,训练似乎总是表现得相似。
【问题讨论】:
-
快速健全性检查:您以什么顺序训练数据?
-
随机文件中的随机批次。将编辑。
-
当您的训练损失对向量的规范不敏感时,我已经看到了类似的情况。然后发生的情况是,您的数量可以无限制地变大/变小,以及浮点算术的哪些点限制起作用。避免这种情况的方法是确保所有数量都有正则化惩罚并且在相似的数值范围内
标签: tensorflow neural-network deep-learning conv-neural-network