Výběr správného optimalizéru je klíčový pro úspěšné trénování neuronových sítí. Adam a SGD jsou nejpopulárnější algoritmy, každý s vlastními výhodami a nevýhodami pro různé typy úloh.
Co jsou optimalizery a proč jsou důležité¶
Optimalizery jsou srdcem každého machine learning algoritmu. Jejich úkolem je najít takové hodnoty parametrů modelu, které minimalizují loss funkci. Představte si to jako navigaci v hornaté krajině, kde se snažíte najít nejnižší bod (globální minimum) – každý optimalizér používá jinou strategii, jak se k tomuto cíli dostat.
V praxi se nejčastěji setkáte se třemi hlavními přístupy: klasickým Stochastic Gradient Descent (SGD), adaptivním Adam optimalizérem a jeho vylepšenou verzí AdamW. Každý má své místo a správná volba může znamenat rozdíl mezi modelem, který konverguje za hodiny, a tím, který trénuje celé dny.
SGD: Jednoduchý a osvědčený¶
Stochastic Gradient Descent je nejzákladnější a zároveň nejcitlivější optimalizér. Funguje na principu postupného pohybu ve směru nejstrmějšího poklesu gradientu. Jeho hlavní výhodou je jednoduchost a předvídatelné chování.
import torch
import torch.optim as optim
# Inicializace SGD optimalizéru
optimizer = optim.SGD(model.parameters(),
lr=0.01, # learning rate
momentum=0.9, # momentum pro stabilitu
weight_decay=1e-4) # L2 regularizace
# Tréninkový loop
for batch in dataloader:
optimizer.zero_grad()
loss = criterion(model(batch.input), batch.target)
loss.backward()
optimizer.step()
SGD vyžaduje pečlivé ladění learning rate. Příliš vysoká hodnota způsobí oscilace kolem minima, příliš nízká zase pomalou konvergenci. Momentum parametr pomáhá překonávat lokální minima a stabilizuje trénink. V praxi začněte s lr=0.01 a momentum=0.9, pak experimentujte.
Kdy použít SGD¶
- Computer vision modely – SGD s momentum často překonává Adam u CNN architektur
- Dlouhý trénink – SGD má lepší generalizační schopnosti při dostatečném počtu epoch
- Velké batch size – SGD škáluje lépe s velkými batch sizes než adaptivní optimalizéry
Adam: Adaptivní a uživatelsky přívětivý¶
Adam (Adaptive Moment Estimation) kombinuje výhody momentum s adaptivním learning rate pro každý parametr. Udržuje si exponenciálně klesající průměr gradientů (první moment) i jejich druhých mocnin (druhý moment), což mu umožňuje automaticky přizpůsobovat velikost kroku.
# Adam optimalizér s typickými parametry
optimizer = optim.Adam(model.parameters(),
lr=1e-3, # obvykle 0.001
betas=(0.9, 0.999), # exponenciální decay rates
eps=1e-8, # numerická stabilita
weight_decay=0) # L2 regularizace
# Learning rate scheduling s Adam
scheduler = optim.lr_scheduler.ReduceLROnPlateau(
optimizer, mode='min', factor=0.5, patience=5
)
for epoch in range(epochs):
train_loss = train_epoch(model, optimizer, dataloader)
val_loss = validate(model, val_dataloader)
scheduler.step(val_loss)
Adam je výborný pro rychlý start – často konverguje rychleji než SGD v prvních epochách. Jeho adaptivní povaha znamená, že funguje rozumně i s výchozími parametry, což z něj dělá populární volbu pro prototypování.
Problém s generalizací¶
Adam má však jeden zásadní problém: může vést k horší generalizaci než SGD. Důvodem je jeho tendence “uvíznout” v ostrých minimech, která dobře fitují tréninková data, ale špatně generalizují na nová data.
AdamW: Nejlepší z obou světů¶
AdamW (Adam with decoupled Weight decay) řeší hlavní problém standardního Adam optimalizéru tím, že odděluje weight decay od gradient-based update. Výsledkem je lepší regularizace a často i lepší generalizace.
# AdamW s doporučenými parametry
optimizer = optim.AdamW(model.parameters(),
lr=1e-3,
betas=(0.9, 0.999),
eps=1e-8,
weight_decay=0.01) # silnější weight decay
# Warmup schedule často používaný s AdamW
def get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps):
def lr_lambda(current_step):
if current_step < num_warmup_steps:
return float(current_step) / float(max(1, num_warmup_steps))
return max(0.0, float(num_training_steps - current_step) /
float(max(1, num_training_steps - num_warmup_steps)))
return optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
AdamW se stal standardem v oblasti NLP, zejména při trénování transformer modelů. Jeho kombinace rychlé konvergence s lepší regularizací z něj dělá univerzální volbu pro většinu moderních deep learning úloh.
Praktické tipy pro výběr optimalizéru¶
Podle typu úlohy¶
Computer Vision: Začněte s SGD + momentum. Pro ResNet a podobné architektury často dosáhnete lepších výsledků než s Adam.
NLP a Transformers: AdamW je jasnou volbou. Kombinujte s warmup schedulingem pro optimální výsledky.
Prototypování: Adam pro rychlé experimenty, AdamW pro finální modely.
Ladění hyperparametrů¶
# Typické rozsahy pro grid search
sgd_params = {
'lr': [0.1, 0.01, 0.001],
'momentum': [0.9, 0.95, 0.99],
'weight_decay': [1e-4, 1e-3, 5e-3]
}
adam_params = {
'lr': [1e-2, 1e-3, 1e-4],
'weight_decay': [0, 1e-4, 1e-3] # pro Adam
}
adamw_params = {
'lr': [1e-3, 5e-4, 1e-4],
'weight_decay': [0.01, 0.05, 0.1] # vyšší pro AdamW
}
Nezapomeňte na learning rate scheduling – může výrazně zlepšit konvergenci všech optimalizérů. Cosine annealing nebo step decay jsou dobré výchozí body.
Monitoring a debugging¶
Sledujte nejen loss, ale i normu gradientů a parametrů. Exploding gradienty indikují příliš vysoký learning rate, zatímco vanishing gradienty mohou znamenat opak nebo problém s architekturou.
# Monitoring gradientů
total_norm = 0
for p in model.parameters():
if p.grad is not None:
param_norm = p.grad.data.norm(2)
total_norm += param_norm.item() ** 2
total_norm = total_norm ** (1. / 2)
print(f'Gradient norm: {total_norm:.4f}')
Shrnutí¶
Volba správného optimalizéru závisí na vaší konkrétní úloze. SGD s momentum zůstává králem pro computer vision úlohy s dlouhým tréninkem, Adam je skvělý pro rychlé prototypování, zatímco AdamW kombinuje rychlost Adam s lepší generalizací a stal se standardem pro transformer modely. Klíčem k úspěchu není jen výběr optimalizéru, ale i správné nastavení learning rate a scheduling strategie.