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

sun*_*ide 27 neural-network deep-learning conv-neural-network tensorflow

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

损失爆炸

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

的背景

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

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

normalized = tf.clip_by_average_norm(inferred.sin_cos, clip_norm=2.)
Run Code Online (Sandbox Code Playgroud)

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

我已经(成功地)使用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)
Run Code Online (Sandbox Code Playgroud)

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

loss_sum = tf.reduce_sum(loss)
Run Code Online (Sandbox Code Playgroud)

标量摘要.

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

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

pat*_*_ai 43

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

亚当的方程是

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)
Run Code Online (Sandbox Code Playgroud)

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

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

为了解决这个问题,你可以增加epsilon这是10-8默认.因此,通过0几乎停止分裂的问题,根据您的网络,值上epsilon0.1,0.01或者0.001可能是很好的.

  • 我已经删除了我正在使用的单独的损失函数,现在再也看不到这个问题了……现在我知道我只是在使模型变得更糟。天哪! (2认同)
  • “这是亚当的一个已知问题。” 您能否链接其他人讨论此行为的资源? (2认同)

Sim*_*nas 5

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

继续探索!:)