Takémetoda největšího spádu, steepest descentPokročilý

Definice

Gradientní sestup je optimalizační metoda, která postupně mění parametry modelu ve směru nejrychlejšího poklesu ztrátové funkce. V praxi se používá hlavně při trénování modelů strojového učení, kde pomáhá najít váhy s menší chybou, i když prostor možných řešení má miliony rozměrů.

Kategorie: Strojové učeníAktualizováno

Proč gradient ukazuje cestu dolů

Gradientní sestup hledá takové hodnoty parametrů, při kterých je ztrátová funkce co nejmenší. Gradient je vektor parciálních derivací: říká, kterým směrem funkce nejrychleji roste. Algoritmus proto udělá krok opačným směrem. Pro parametr θ, ztrátu L a rychlost učení η se jeden krok často zapisuje jako θ = θ - η ∇L(θ).

Myšlenka je jednoduchá, ale praktický dopad je velký. U modelu strojového učení mohou parametry představovat váhy lineární regrese, miliony vah neuronové sítě nebo embeddingy v jazykovém modelu. Ztráta měří rozdíl mezi predikcí a správnou odpovědí. Gradientní sestup tento rozdíl postupně zmenšuje, pokud je ztráta dostatečně hladká a krok není nastavený nešťastně.

Velikost kroku rozhoduje o osudu tréninku

Learning rate, česky často rychlost učení, určuje délku jednoho kroku. Příliš malá hodnota vede k pomalému tréninku, který se může zdát zaseknutý. Příliš velká hodnota může minimum přeskakovat, rozkmitat ztrátu nebo výpočet úplně rozbít numerickou nestabilitou. Správná hodnota závisí na měřítku dat, tvaru ztrátové funkce i použitém optimalizátoru.

Gradientní sestup proto v praxi nebývá jen ručně opakovaný vzorec. Frameworky jako PyTorch nebo TensorFlow používají optimalizátory, které ukládají stav, mění efektivní krok pro různé parametry a často pracují s plánem rychlosti učení. Základní princip ale zůstává stejný: parametry se aktualizují podle signálu, který poskytne gradient.

Batch, mini-batch a náhodný šum

Plný gradientní sestup počítá gradient ze všech trénovacích dat v každém kroku. Takový výpočet je přesný, ale u velkých datasetů drahý. Stochastic Gradient Descent používá jeden příklad nebo malou dávku příkladů, obvykle označovanou jako mini-batch. Výpočet je levnější a častější, ale gradient obsahuje šum.

Šum není jen problém. Mini-batche mohou modelu pomoci uniknout z plochých oblastí nebo sedlových bodů, kde čistý gradient neposkytuje prakticky užitečný pohyb. Na druhou stranu šum ztěžuje ladění a výsledná ztráta může kolísat i tehdy, když se model celkově zlepšuje.

Vztah k backpropagation

Gradientní sestup není totéž co Backpropagation. Backpropagation je efektivní způsob, jak v neuronové síti spočítat gradient ztráty podle jednotlivých vah. Gradientní sestup tento gradient použije k aktualizaci parametrů. Jedna část tedy dodá směr, druhá provede krok.

Co gradientní sestup nezaručí

Gradientní sestup nezaručuje globálně nejlepší řešení u každé úlohy. U konvexních funkcí má silnější teoretické vlastnosti, protože lokální minimum odpovídá globálnímu. U hlubokých neuronových sítí je krajina ztráty složitá: existují sedlové body, ploché oblasti a mnoho různých konfigurací parametrů s podobnou kvalitou. Výsledek závisí na inicializaci, datech, regularizaci, architektuře modelu i režimu učení.

Příklady z praxe

  1. Jeden krok lineární regrese

    Vývojář trénuje jednoduchou lineární regresi, která má najít vztah přibližně ve tvaru y = 2x. První predikce s vahou 0 je špatná, ztráta je vysoká a gradient ukáže, že váhu je potřeba zvýšit. Po jednom kroku se váha posune správným směrem, ale k dobrému výsledku je potřeba více iterací.

    import numpy as np
    
    x = np.array([1.0, 2.0, 3.0])
    y = np.array([2.0, 4.0, 6.0])
    
    w = 0.0
    learning_rate = 0.01
    
    prediction = w * x
    loss = ((prediction - y) ** 2).mean()
    gradient = (2 * x * (prediction - y)).mean()
    w = w - learning_rate * gradient
    
    print(round(loss, 2), round(w, 2))
  2. Mini-batch v PyTorchi

    Datový tým trénuje malý model v PyTorchi na dávce 32 záznamů. Volání backward spočítá gradienty všech trénovatelných parametrů a optimizer.step provede aktualizaci podle SGD. Pokud se loss dlouhodobě snižuje, zvolený krok a model pravděpodobně dávají pro danou úlohu smysl.

    import torch
    
    model = torch.nn.Linear(10, 1)
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    loss_fn = torch.nn.MSELoss()
    
    x = torch.randn(32, 10)
    y = torch.randn(32, 1)
    
    optimizer.zero_grad()
    prediction = model(x)
    loss = loss_fn(prediction, y)
    loss.backward()
    optimizer.step()

Časté omyly

MýtusGradientní sestup vždycky najde globální minimum.
Ve skutečnostiGradientní sestup má silné záruky hlavně u vhodně konvexních úloh. U neuronových sítí a jiných nekonvexních problémů může skončit v lokálním minimu, poblíž sedlového bodu nebo v řešení, které je prakticky dobré, ale ne globálně nejlepší.
MýtusKdyž se model učí pomalu, stačí zvýšit learning rate.
Ve skutečnostiVyšší learning rate může trénink zrychlit, ale také způsobit nestabilitu nebo horší minimum. Pomalé učení může souviset i se špatným škálováním vstupů, nevhodnou architekturou, nedostatkem dat nebo nevhodným optimalizátorem.

Časté dotazy

Proč gradientní sestup někdy zvyšuje chybu místo aby ji snižoval?
Gradientní sestup může ztrátu dočasně zvýšit, když je learning rate příliš vysoký, gradient je spočítaný z hlučného mini-batche nebo je povrch ztrátové funkce špatně škálovaný. Jednotlivý krok proto není vždy monotónní zlepšení. Důležitější je dlouhodobý trend validační a trénovací ztráty, případně stabilita metrik po více dávkách.
Je gradientní sestup použitelný jen pro neuronové sítě?
Gradientní sestup není omezený na neuronové sítě. Gradientní metody se používají v lineární a logistické regresi, optimalizaci parametrů ve statistice, maticové faktorizaci i v některých numerických úlohách. Neuronové sítě jsou jen nejznámější případ, protože mají mnoho parametrů a analytické ruční nalezení nejlepšího řešení by bylo nepraktické.
Jak poznat, že learning rate je u gradientního sestupu špatně nastavený?
Špatně nastavený learning rate se často projeví charakteristicky. Příliš malý learning rate vede k velmi pomalému poklesu ztráty a model se učí neefektivně. Příliš velký learning rate způsobuje kolísání, náhlý růst ztráty nebo hodnoty typu NaN. Praktické ladění obvykle kombinuje sledování křivky ztráty, normalizaci dat a plán snižování kroku během tréninku.
Proč se při gradientním sestupu používají mini-batche?
Mini-batch u gradientního sestupu snižuje cenu jednoho kroku, protože gradient se nepočítá z celého datasetu. Mini-batch také lépe využívá GPU a umožňuje častější aktualizace parametrů. Gradient z malé dávky je sice nepřesný, ale při vhodné velikosti dávky poskytuje dost dobrý směr a může zlepšit praktickou rychlost učení.

Zdroje

  1. Gradient descent(otevře se v novém okně)Wikipedia
  2. torch.optim(otevře se v novém okně)PyTorch
  3. tf.keras.optimizers(otevře se v novém okně)TensorFlow
  4. An overview of gradient descent optimization algorithms(otevře se v novém okně)arXiv, 2016

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.