优化与训练

Adam 优化器(Adam optimizer)

/ AD-um OP-tih-my-zer /

Adam 是大多数人最先伸手去拿的优化器,因为它往往不用怎么调就能「就这么work了」。理解它最好的方式,是把它看成两个更早的念头的一次明智结合。从动量那里,它保留一份「自己一直朝哪个方向走」的滑动记忆,于是不会东倒西歪。从 RMSprop 之类的自适应方法那里,它给每一个权重都配一个专属的步长,按那个权重的梯度近来抖动得有多厉害来缩放。

这个名字是「自适应矩估计」(Adaptive Moment Estimation)的缩写。它为每个参数追踪两份滑动平均:梯度的平均(「一阶矩」,就像动量的速度)和梯度平方的平均(「二阶矩」,衡量那个方向近来有多带噪声)。梯度一向又大又飘忽的参数,会得到更小、更谨慎的步子;梯度一向又小又稳的参数,则会得到相对更大的步子。正是这种「逐权重」的自适应,让 Adam 往往训练得快,并且开箱即用就能很好地应付那些杂乱、尺度不齐的问题。

Adam 的流行实至名归,但它并不是魔法。它的默认设置出奇地常常管用,这正是人们倚重它的原因——可在某些视觉任务上,它的泛化可能比调好的普通 SGD 略差一点,也可能收敛到不那么「平坦」的解。被广泛使用的变体 AdamW 修正了 Adam 处理权重衰减的方式,如今已是训练大语言模型的标准。Adam 减少了你必须摆弄学习率的程度,但并没有免去你设一个学习率的必要。

假设有一个权重的梯度一直又大又跳,另一个权重的梯度一直又小又稳。普通 SGD 对两者用同样的步长。而 Adam 因为追踪了每个权重近来的梯度平方,会自动把那个乱跳权重的步子缩小,让那个平稳权重走得更自如——无需逐权重地手动调。

Adam 给每个权重配一个自适应的专属步长。

Adam 的默认值是个很好的起点,而不是保证。论泛化的极致,在某些任务上调好的带动量 SGD 仍然胜出——而对 Transformer,要用 AdamW(权重衰减解耦的那个版本),而不是原版 Adam。

又称
AdamAdaptive Moment EstimationAdamWAdam 优化器Adam 優化器