在训练网络时,我一直看到一种非常奇怪的行为,经过几次100k迭代(8到10小时)的学习,一切都中断,训练损失增长:< / p>
训练数据本身是随机的,分布在许多.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
时,它会更快地突破)。正规化对这一点也没有影响,它在某种程度上也是如此。
我还应该补充说,停止训练并从最后一个检查点重新启动 - 这意味着训练输入文件也会再次洗牌 - 导致相同的行为。在那时,训练似乎总是表现得相似。
答案 0 :(得分:3)
是的,这可能是某种超级复杂的不稳定数字/方程式情况,但最确定的是你的训练率只是很高,因为你的损失会迅速减少到25K,然后在相同的水平上振荡很多。尝试将其减少0.1倍,看看会发生什么。你应该能够达到更低的损失价值。
继续探索! :)