Adam maintient deux moyennes mobiles par paramètre : le premier moment (moyenne des gradients — momentum) et le second moment (moyenne des gradients au carré — mise à l'échelle adaptative). La règle de mise à jour : paramètre -= lr × m̂ / (√v̂ + ε), où m̂ et v̂ sont les moments corrigés du biais. Les paramètres avec des gradients constamment grands reçoivent des mises à jour plus petites (ils sont déjà bien calibrés). Les paramètres avec des gradients petits et bruités reçoivent des mises à jour plus grandes (ils ont besoin d'un mouvement plus agressif).
L'Adam original appliquait le déclin de poids en l'ajoutant au gradient avant de calculer les moments, ce qui faisait que le déclin était mis à l'échelle par le taux d'apprentissage adaptatif — pas ce qu'on veut. AdamW (Loshchilov & Hutter, 2017) découple le déclin de poids de la mise à jour du gradient, en l'appliquant directement aux paramètres. Ça semble être une correction mineure mais ça améliore significativement la généralisation. Tout entraînement de LLM moderne utilise AdamW.
Adam stocke deux valeurs supplémentaires par paramètre (premier et second moments), triplant la mémoire nécessaire pour l'état de l'optimiseur : un modèle 70B a besoin de ~140 Go pour les poids (FP16) plus ~280 Go pour les états Adam (FP32), totalisant ~420 Go. C'est pourquoi le sharding de l'état de l'optimiseur (DeepSpeed ZeRO, FSDP) est essentiel pour l'entraînement de grands modèles. Certains optimiseurs plus récents (Adafactor, CAME, Lion) réduisent cette charge mémoire au prix d'une certaine stabilité.