Přeskočit na obsah
_CORE
AI & Agentic Systems Core Informační Systémy Cloud & Platform Engineering Data Platforma & Integrace Security & Compliance QA, Testing & Observability IoT, Automatizace & Robotika Mobile & Digital Banky & Finance Pojišťovnictví Veřejná správa Obrana & Bezpečnost Zdravotnictví Energetika & Utility Telco & Média Průmysl & Výroba Logistika & E-commerce Retail & Loyalty
Reference Technologie Blog Knowledge Base O nás Spolupráce Kariéra
Pojďme to probrat

Optimalizery — Adam, SGD a jak vybrat správný

01. 01. 2024 4 min čtení intermediate

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.

adamsgdadamw