假设我有一个已保存的模型,该模型几乎是最少的,但仍有一些改进的空间。例如,损失(由tf.keras.Models.model.evaluate()报告)可能是11.390,我知道该模型可以降至11.300。
问题在于,尝试细化此模型(使用tf.keras.Models.model.fit())始终会导致权重在第一个时期期间收到初始“颠簸”,从而使损耗向上传递。之后,它开始减小,但是并不总是收敛在正确的最小值上(甚至可能无法回到起点)。
它看起来像这样:
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。
我可以通过降低学习率来缓解这种情况,但是这需要永远的收敛。
有什么方法可以防止培训从一开始就“狂野”,而不会影响长期收敛速度?
答案 0 :(得分:0)
当您尝试降低学习率时,是必经之路。
例如学习率= 0.00001
tf.train.AdamOptimizer(0.00001)
特别是对于亚当,这是有希望的,因为学习率同时是步长的上限。
最重要的是,您可以尝试learning rate scheduling,在此根据您预定的时间表设置学习率。
我还认为,从您降低学习率时所显示的情况来看,就收敛速度而言,这似乎还不错。 您可能需要调整的另一个超参数可能是减小批处理大小,降低每次更新的计算成本。
注意: 我发现“不正确的最小值”一词颇具误导性。为了进一步了解人工神经网络的非凸优化,我想指出Ian Goodfellow等人的deep learning book