首页 > 解决方案 > TensorFlow 损失的初始跳跃

问题描述

假设我有一个保存的模型几乎是最低限度的,但还有一些改进的空间。例如,损失(由 tf.keras.Models.model.evaluate() 报告)可能是 11.390,我知道模型可以下降到 11.300。

问题在于,尝试改进此模型(使用 tf.keras.Models.model.fit())始终导致权重在第一个 epoch 期间接收到初始“颠簸”,这会将损失向上发送。在那之后,它开始减少,但并不总是收敛到正确的最小值(甚至可能不会回到它开始的地方。)

它看起来像这样:

tf.train.RMSPropOptimizer(0.0002):

0 11.982
1 11.864
2 11.836
3 11.822
4 11.809
5 11.791
(...)
15 11.732

tf.train.AdamOptimizer(0.001):

0 14.667
1 11.483
2 11.400
3 11.380
4 11.371
5 11.365

tf.keras.optimizers.SGD(0.00001):

0 12.288
1 11.760
2 11.699
3 11.650
4 11.666
5 11.601

具有 30M 观察值的数据集,在所有情况下批量大小为 500K。

我可以通过降低学习率来缓解这种情况,但是它需要永远收敛。

有什么办法可以防止训练一开始就“狂野”,又不影响长期收敛速度?

标签: tensorflowmachine-learningdeep-learningmathematical-optimization

解决方案


当你尝试降低学习率是要走的路。

例如学习率 = 0.00001

tf.train.AdamOptimizer(0.00001)

尤其是对于亚当来说,这应该是有希望的,因为学习率同时是步长的上限。

最重要的是,您可以尝试学习率调度,您可以根据预定义的时间表设置学习率。

另外我觉得从你降低学习率时的表现来看,就收敛速度而言,这似乎并不算太​​糟糕。也许您可以根据自己的情况调整的另一个超参数是减少批量大小,以降低每次更新的计算成本。

注意: 我发现“不是正确的最小值”这个词相当具有误导性。为了进一步了解人工神经网络的非凸优化,我想指出Ian Goodfellow 等人的深度学习书


推荐阅读