Adam 最佳化器
單一的全域學習率是一把鈍器:有些權重的梯度微小而一致,想要大步走;另一些的梯度龐大而善變,想要小步走。Adam(自適應動量估計,Kingma 與 Ba,2015)給每個參數各自一個自動調校的步長。其想法融合兩個技巧。第一是動量:保持梯度的滑動平均使更新平滑。第二是逐參數縮放:保持梯度平方的滑動平均,作為每個座標梯度通常有多大、多吵的度量,並用它去除每次更新,於是梯度一貫很小的權重被放大、一貫很大的權重被壓抑。結果是一個幾乎不需調參就能在大量問題上「直接能用」的最佳化器,這也是它成為訓練 transformer、CLIP、擴散模型與多數現代視覺語言系統預設選擇的原因。
更新維護兩個指數移動平均。第一動量 m ← β₁ m + (1−β₁) g 估計平均梯度(動量),第二動量 v ← β₂ v + (1−β₂) g² 逐元素估計平均梯度平方,其中 g 是當前梯度、g² 是逐分量平方。由於兩者都從零開始,在訓練早期會偏向零,所以 Adam 在第 t 步施加偏差修正 m̂ = m/(1−β₁ᵗ) 與 v̂ = v/(1−β₂ᵗ)。參數接著更新為 θ ← θ − η · m̂ / (√v̂ + ε)。除以 √v̂ 是自適應的部分:就像用每個座標梯度的均方根大小估計去正規化它的步長。微小常數 ε(epsilon)只是防止除以零。
預設超參數出奇地穩健:β₁ = 0.9、β₂ = 0.999、ε = 1e-8,學習率 η 約 1e-3(常被引用的 3e-4 是深度網路上熱門的安全選擇)。β₁ 控制動量的時間尺度,β₂ 控制估計逐參數縮放那條長得多的時間尺度。由於早期對 v̂ 的估計不可靠,Adam 幾乎總是搭配學習率暖身(warmup),在前數百到數千步將 η 逐步拉升,對 transformer 與大批次訓練尤其如此。
最重要的陷阱是權重衰減。在 Adam 下把 L2 懲罰加進損失,並不會得到乾淨的權重衰減,因為懲罰的梯度會和其它一切一起被 √v̂ 除掉,於是更新頻繁的權重反而衰減較少。AdamW(Loshchilov 與 Hutter)藉由把權重衰減從梯度步驟中解耦來修正此問題——直接從參數中減去 λθ——而 AdamW 如今已是訓練 ViT、DETR 與多數大型視覺模型的標準。其他注意事項:原始 Adam 在某些凸問題上可能無法收斂(這促成了 AMSGrad 修正),而在純 CNN 影像分類器上帶動量的 SGD 有時泛化得比 Adam 更好,所以「最好的」最佳化器確實取決於架構。
如果你照抄一份寫著 weight_decay=0.05、optimizer='adam' 的設定,你得到的很可能不是論文的本意——他們幾乎肯定用的是 AdamW。解耦與耦合的差別會悄悄改變結果,把兩者搞混是視覺領域最常見的可重現性錯誤之一。