Adam为每个参数维护两个移动平均值:一阶矩(梯度均值——动量)和二阶矩(梯度平方均值——自适应缩放)。更新规则:parameter -= lr × m̂ / (√v̂ + ε),其中m̂和v̂是偏差校正后的矩。梯度持续较大的参数获得较小的更新(它们已经校准得很好)。梯度小且嘈杂的参数获得较大的更新(它们需要更激进的移动)。
原始Adam通过在计算矩之前将权重衰减添加到梯度中来应用,导致衰减被自适应学习率缩放——这不是你想要的。AdamW(Loshchilov & Hutter,2017)将权重衰减从梯度更新中解耦,直接应用于参数。这看起来是一个小修复,但显著改善了泛化能力。所有现代LLM训练都使用AdamW。
Adam为每个参数存储两个额外的值(一阶和二阶矩),将优化器状态的内存需求增至三倍:一个70B模型需要约140 GB存储权重(FP16),加上约280 GB用于Adam状态(FP32),总计约420 GB。这就是为什么优化器状态分片(DeepSpeed ZeRO、FSDP)对大模型训练至关重要。一些更新的优化器(Adafactor、CAME、Lion)在牺牲一定稳定性的情况下减少了这一内存开销。