Optimerare: momentum, Adam, schemaläggning
Kunna förklara momentum och Adam, välja inlärningstakt och schema, och felsöka en träning som inte konvergerar.
Förkunskaper
- DGradient descentkrävs
- DTräna ett neuronnät i PyTorchkrävs
Intuition
SGD tar ett steg mot minus gradienten. Problemet: gradienten hoppar mellan batchar, och i en avlång dal studsar den mellan väggarna i stället för att gå framåt.
Momentum lägger till tröghet: steget är ett glidande medelvärde av tidigare gradienter. Studsarna tar ut varandra, framåtriktningen förstärks.
Adam lägger till en sak till: varje parameter får sin egen steglängd, baserad på hur stora dess gradienter brukar vara. Parametrar med små gradienter får större steg. Det gör Adam robust mot dåligt skalade problem — därför är den standardvalet.
Inlärningstakten är fortfarande viktigast. För stor: loss blir NaN eller studsar. För liten: inget händer. Typiska värden: 3e-4 för transformers, 1e-3 för små nät, 2e-5 för finjustering.
Formellt
Momentum: , med .
Adam: håller två glidande medelvärden — första momentet (riktning) och andra momentet (storlek):
,
Bias-korrigering (viktig i början när medelvärdena startar på noll): , .
Uppdatering: med , , .
AdamW skiljer weight decay från gradienten ( separat) — det är korrekt regularisering och standard för transformers.
Schema: linjär uppvärmning över några hundra steg (annars är de första Adam-stegen instabila) följt av cosinusavtagande mot noll.
Kod
import torch
opt = torch.optim.AdamW(modell.parameters(), lr=3e-4, weight_decay=0.01, betas=(0.9, 0.999))
sched = torch.optim.lr_scheduler.OneCycleLR(opt, max_lr=3e-4, total_steps=steg_totalt, pct_start=0.05)
for xb, yb in loader:
loss = kriterium(modell(xb), yb)
loss.backward()
torch.nn.utils.clip_grad_norm_(modell.parameters(), 1.0) # mot exploderande gradienter
opt.step(); sched.step(); opt.zero_grad()
Felsökningsschema när träningen inte konvergerar:
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| loss = NaN direkt | lr för hög, eller division med noll i datan | sänk lr 10×, kolla datan |
| loss studsar | lr för hög, batch för liten | sänk lr, öka batch |
| loss står still | lr för låg, död ReLU, felaktig loss | höj lr, kontrollera gradienternas norm |
| loss sjunker men val stiger | överanpassning | regularisera, tidigt stopp |
| loss sjunker inte ens på 10 exempel | bugg, inte hyperparameter | överanpassa medvetet en liten batch först |
Den sista raden är det bästa testet som finns: en korrekt implementation ska kunna få loss nära noll på tio exempel. Går inte det är felet i koden.
Behärskning innebär
- Förklarar momentum och Adams två moment
- Väljer inlärningstakt och schema
- Felsöker en träning som inte konvergerar
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- arXiv — Adam: A Method for Stochastic Optimization — arXiv (öppen åtkomst; licens per artikel)
- arXiv — Decoupled Weight Decay Regularization (AdamW) — arXiv (öppen åtkomst; licens per artikel)
- Dive into Deep Learning (CC BY-SA 4.0) — CC BY-SA 4.0