Adam 為每個參數維護兩個移動平均:第一動差(梯度均值——動量)和第二動差(梯度平方的均值——自適應縮放)。更新規則:參數 -= 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)在穩定性的某些代價下減少了這種記憶體開銷。