Adam 论文说:“......许多目标函数由在不同数据子样本处评估的子函数的总和组成;在这种情况下,可以通过对各个子函数采取梯度步骤来提高优化效率......”在这里,他们只是意味着目标函数是训练样例误差的总和,训练可以在单个样例或小批量上进行。这与随机梯度下降 (SGD) 中的相同,因为参数更新更频繁,所以它比批量训练更有效地解决大规模问题。
至于亚当为什么工作,它使用了一些技巧。
这些技巧之一是动量,它可以提供更快的收敛速度。想象一个目标函数,它的形状像一个狭长的峡谷,逐渐向最小值倾斜。假设我们想使用梯度下降来最小化这个函数。如果我们从峡谷壁上的某个点开始,负梯度将指向下降最陡的方向,即主要朝向峡谷底部。这是因为峡谷壁比峡谷逐渐向最小值倾斜的坡度要陡峭得多。如果学习率(即步长)很小,我们可以下降到峡谷底部,然后沿着它向最小值移动。但是,进展会很慢。我们可以提高学习率,但这不会改变步骤的方向。在这种情况下,我们会越过峡谷底部并最终落到对面的墙上。然后,我们将重复这种模式,在墙壁之间摆动,同时缓慢地向最小值前进。在这种情况下,动量可以提供帮助。
动量只是意味着将先前更新的一部分添加到当前更新中,以便在特定方向复合重复更新;我们积聚动力,朝着这个方向越来越快地前进。在峡谷的情况下,我们会在最小值的方向上建立动量,因为所有更新都在那个方向上有一个分量。相比之下,在峡谷壁上来回移动需要不断地反转方向,因此动量将有助于抑制这些方向的振荡。
Adam 使用的另一个技巧是为每个参数自适应地选择一个单独的学习率。通常接收较小或较不频繁更新的参数使用 Adam 接收较大的更新(反之亦然)。在适当的学习率因参数而异的情况下,这可以加快学习速度。例如,在深度网络中,梯度在早期层会变小,因此增加相应参数的学习率是有意义的。这种方法的另一个好处是,因为学习率是自动调整的,手动调整变得不那么重要了。标准 SGD 需要对学习率进行仔细调整(可能还有在线调整),但对于 Adam 和相关方法而言,情况并非如此。仍然需要选择超参数,
相关方法:
Momentum 通常与标准 SGD 一起使用。改进的版本称为 Nesterov 动量或 Nesterov 加速梯度。对每个参数使用自动调整学习率的其他方法包括:Adagrad、RMSprop 和 Adadelta。RMSprop 和 Adadelta 解决了 Adagrad 可能导致学习停止的问题。Adam 类似于具有动量的 RMSprop。Nadam 修改 Adam 以使用 Nesterov 动量而不是经典动量。
参考资料:
金马和巴(2014)。亚当:一种随机优化方法。
古德费罗等人。(2016 年)。深度学习,第 8 章。
Geoff Hinton 课程的幻灯片
多扎特(2016 年)。将 Nesterov Momentum 融入 Adam。