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