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ů.
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
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))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
- Gradient descent(otevře se v novém okně)
- torch.optim(otevře se v novém okně)
- tf.keras.optimizers(otevře se v novém okně)
- An overview of gradient descent optimization algorithms(otevře se v novém okně)