Gradient-Descent-Optimierer: von SGD bis Adam
Das Kernproblem
Ein neuronales Netz zu trainieren bedeutet, eine Verlustfunktion über potenziell Milliarden Parameter zu minimieren. Gradient Descent tut dies iterativ:
wobei die Lernrate ist. Die Herausforderung: Den vollständigen Gradienten über den gesamten Datensatz zu berechnen ist zu teuer — deshalb verwenden wir stochastische Varianten.
Stochastic Gradient Descent (SGD)
SGD berechnet den Gradienten auf einem zufälligen Mini-Batch der Größe :
Das führt Rauschen ein, doch dieses Rauschen wirkt als Regularisierer und kann helfen, scharfen Minima zu entkommen. Mit Momentum akkumulieren wir einen Geschwindigkeitsvektor:
Momentum () glättet Updates und beschleunigt Konvergenz entlang konsistenter Gradientenrichtungen.
AdaGrad
AdaGrad passt die Lernrate pro Parameter auf Basis akkumulierter quadrierter Gradienten an:
Parameter mit großen Gradienten erhalten eine kleinere effektive Lernrate. Das hilft bei spärlichen Features, etwa Word Embeddings, doch das monoton wachsende lässt die Lernrate langfristig fast auf null sinken.
RMSProp
RMSProp behebt AdaGrads Zerfallsproblem durch einen exponentiell gleitenden Mittelwert:
Typisch ist . Die effektive Lernrate stabilisiert sich, anstatt unbegrenzt zu sinken.
Adam
Adam (Adaptive Moment Estimation) kombiniert Momentum und RMSProp:
Da , sind frühe Schätzungen in Richtung null verzerrt. Die Bias-Korrektur lautet:
Die Defaults , , funktionieren über viele Aufgaben hinweg gut.
AdamW
Adam hat eine subtile Schwäche: L2-Regularisierung über Weight Decay interagiert unerwünscht mit adaptiven Lernraten. AdamW entkoppelt Weight Decay vom Gradientenupdate:
Das ist die Standardwahl für das Training von Transformers und modernen LLMs.
Verwendung in PyTorch
import torch.optim as optim
# SGD with momentum
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-4)
# Adam
optimizer = optim.Adam(model.parameters(), lr=1e-3, betas=(0.9, 0.999))
# AdamW (preferred for Transformers)
optimizer = optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)
# Learning rate scheduler
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
Lernratenpläne
Unabhängig vom Optimierer hat der Lernratenplan großen Einfluss:
| Plan | Beschreibung | Einsatz |
|---|---|---|
| Konstant | Festes | Schnelle Experimente |
| Step decay | Alle Epochen mit multiplizieren | ResNet-artiges Training |
| Cosine annealing | folgt einer Kosinuskurve | Allgemeines Deep Learning |
| Warmup + cosine | Linearer Warmup, dann Kosinus | Transformers, LLMs |
| OneCycleLR | Schneller Anstieg, langsamer Abfall | Kurze Trainingsläufe |
Wann welchen Optimierer verwenden?
- SGD + Momentum: Computer Vision (ResNets, ConvNets) — erreicht mit passendem Plan oft bessere Generalisierung als Adam
- Adam/AdamW: NLP, Transformers und Aufgaben mit spärlichen Gradienten
- RMSProp: RNNs, Reinforcement Learning
- AdaGrad: spärliche Eingabefeatures, NLP mit Bag-of-Words-Repräsentationen
Wichtigste Erkenntnisse
- SGD ist eine starke Baseline für Vision; Adam/AdamW dominiert im Sprachbereich
- Weight Decay von adaptiver Gradientenskalierung entkoppeln — AdamW statt Adam + L2 verwenden
- Der Lernratenplan ist oft ähnlich wichtig wie der Optimierer selbst
- Warmup verhindert Instabilität zu Beginn des Transformer-Trainings