Gradientní sestup: jak se model učí
Rychlost učení, cik-cak v úzkých údolích, momentum, Adam, stochastický sestup po dávkách a lokální minima — s animacemi skutečných trajektorií.
Série Základy AI Díl 11 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Jak funguje gradientní sestup a proč na rychlosti učení záleží nejvíc.
- Proč obyčejný sestup v úzkém údolí cik-cakuje a jak to řeší momentum a Adam.
- Proč se sítě učí po malých náhodných dávkách a co znamenají lokální minima a sedla.
- Jak se gradient počítá zpětným šířením — po operacích jednoho neuronu i po vrstvách sítě se softmaxem.
Co se hodí znát předem: Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
V předchozích dílech jsme si připravili všechno potřebné: model je funkce s parametry, ztrátová funkce je krajina nad prostorem parametrů a gradient ukazuje nejprudší směr do kopce. Teď to spojíme do algoritmu, kterým se učí skoro každá neuronová síť na světě — gradientního sestupu. Jeho myšlenka se vejde do jedné věty a jeho detaily rozhodují, jestli se model naučí za hodinu, za týden, nebo vůbec.
1. Myšlenka: z kopce v mlze
Definice — gradientní sestup
Nechť d ∈ ℕ, d ≥ 1, a J : ℝd → ℝ je diferencovatelná ztrátová funkce s gradientem ∇J : ℝd → ℝd, ∇J(θ) = (∂J/∂θ1(θ), …, ∂J/∂θd(θ)) (viz díl o derivaci a gradientu).
Gradientní sestup je algoritmus:
- vstup: počáteční parametry θ0 ∈ ℝd, rychlost učení η ∈ ℝ, η > 0, tolerance ε > 0 a největší počet kroků T ∈ ℕ;
- výstup: parametry θt ∈ ℝd v okamžiku zastavení.
- Polož t = 0.
- Je-li ‖∇J(θt)‖ < ε nebo t = T, zastav a vrať θt.
- Polož θt+1 = θt − η ∇J(θt), zvětši t o 1 a pokračuj krokem 2.
Algoritmus tedy opakovaně posouvá parametry o η-násobek gradientu proti jeho směru, dokud není gradient skoro nulový nebo nedojdou kroky.
Stojíte v husté mlze na kopci a chcete dolů do údolí. Nevidíte nic, jen nohama cítíte sklon. Uděláte krok tam, kde to klesá nejvíc, a znovu se rozhlédnete. Gradient je ten sklon, rychlost učení je délka kroku. Nic víc v tom není.
θt+1 = θt − η ∇J(θt)
- θt+1
- nové parametry — vektor všech vah a biasů modelu po jednom kroku
- θt
- současné parametry — každý krok jen opravuje to, co už máme; učení je postupné zpřesňování, ne výpočet výsledku najednou
- −
- gradient ukazuje směr nejprudšího stoupání ztráty; my chceme ztrátu zmenšit, proto jdeme opačně
- η
- rychlost učení — gradient popisuje krajinu jen v těsném okolí bodu, takže smíme udělat jen omezený krok; η určuje, jak dlouhý
- ∇J(θt)
- gradient ztráty v současném bodě — vektor parciálních derivací ∂J/∂θi; každá složka říká, jak moc a kterým směrem daný parametr ztrátu zhoršuje
Jako algoritmus i s podmínkou, kdy přestat (ε je malá tolerance, např. 10−6):
def gradientni_sestup(grad_J, theta, eta, max_kroku, eps):
for t in range(max_kroku):
g = grad_J(theta) # gradient v současném bodě
if norma(g) < eps: # skoro rovina: jsme (skoro) ve stacionárním bodě
break
theta = theta - eta * g # krok proti gradientu, všechny složky naráz
return theta
2. Odkud se bere gradient: dopředný a zpětný průchod
Pravidlo θ ← θ − η∇J(θ) předpokládá, že gradient máme. Model s miliony parametrů ho ale nemůže počítat numericky — to by znamenalo dva průchody sítí pro každý parametr zvlášť. Gradient se počítá zpětným šířením chyby (backpropagation): model se rozloží na elementární operace, výpočetní graf, a každá operace umí jen dvě věci — spočítat výstup ze vstupů a říct, jak výstup závisí na každém vstupu (svou lokální derivaci).
Ukážeme to na jednom neuronu: dva vstupy, součtová bázová funkce z = w1x1 + w2x2 + b, logistická aktivace ŷ = σ(z) a ztráta binární křížová entropie pro cíl t = 1. Krabičky jsou operace. Zeleně tečou hodnoty dopředu, oranžově gradienty zpátky; dole je vzorec právě prováděného kroku. Animaci si můžete zastavit a projít tlačítky krok po kroku:
Definice — výpočetní graf, dopředný a zpětný průchod
Nechť G = (U, H) je orientovaný acyklický graf s konečnou množinou uzlů U a množinou hran H ⊆ U × U; hranu (u, v) ∈ H píšeme u → v. Pro v ∈ U označme rod(v) = {u ∈ U : u → v} množinu jeho rodičů. G je výpočetní graf, právě když
- každý uzel v nese reálnou hodnotu, kterou značíme stejným písmenem v;
- uzly s rod(v) = ∅ jsou vstupy (data a parametry) a jejich hodnoty jsou dané;
- každý uzel v s rod(v) ≠ ∅ má diferencovatelnou funkci fv a jeho hodnota je v = fv((u)u ∈ rod(v));
- jeden vyznačený uzel L ∈ U je ztráta.
Topologické pořadí je očíslování U = {v1, …, vN} takové, že vi → vj ⇒ i < j (v acyklickém grafu vždy existuje).
Dopředný průchod spočítá hodnoty v1, …, vN v tomto pořadí podle bodu 3 — každý uzel až po všech svých rodičích.
Zpětný průchod spočítá pro každý uzel u ∈ U jeho adjungovanou hodnotu ū = ∂L/∂u v obráceném pořadí vN, …, v1: položí L̄ = 1 a pro u ≠ L použije vícerozměrné řetízkové pravidlo
ū = ∑v : u → v v̄ · ∂fv/∂u
(prázdný součet je 0). Zpětný průchod tedy pro každý uzel sečte příspěvky ze všech uzlů, do kterých u vstupuje; každá hrana se při tom použije právě jednou.
Lokální derivace operací z obrázku
Všechny veličiny jsou reálná čísla: p1, p2, b, w, x, z ∈ ℝ, cíl t ∈ {0, 1} a výstup ŷ ∈ (0, 1).
Součet z = p1 + p2 + b: ∂z/∂p1 = ∂z/∂p2 = ∂z/∂b = 1 — součet pošle gradient do všech vstupů beze změny.
Součin p = wx: ∂p/∂w = x a ∂p/∂x = w — gradient se vynásobí druhým činitelem.
Logistická funkce σ : ℝ → (0, 1), σ(z) = 1/1 + e−z: σ′(z) = e−z/(1 + e−z)2 = σ(z)(1 − σ(z)) = ŷ(1 − ŷ), kde ŷ = σ(z).
Křížová entropie L = −t ln ŷ − (1 − t) ln(1 − ŷ): ∂L/∂ŷ = −t/ŷ + 1 − t/1 − ŷ.
Věta — chyba neuronu je ŷ − t
Nechť t ∈ {0, 1}, z ∈ ℝ, ŷ = σ(z) je logistická funkce a L = −t ln ŷ − (1 − t) ln(1 − ŷ) křížová entropie. Pak
∂L/∂z = ŷ − t.
Důkaz. Řetízkové pravidlo přes ŷ: ∂L/∂z = ∂L/∂ŷ · ∂ŷ/∂z = (−t/ŷ + 1 − t/1 − ŷ) · ŷ(1 − ŷ) = −t(1 − ŷ) + (1 − t)ŷ = ŷ − t. ∎
V obrázku: ∂L/∂z =0,500 − 1 = −0,500. Dělení ŷ a násobení ŷ(1 − ŷ) se navzájem zkrátí — proto se křížová entropie páruje s logistickou funkcí (a jak uvidíte, i se softmaxem).
Věta — zpětný průchod je levný
Nechť G = (U, H) je výpočetní graf s E = |H| hranami, ve kterém každý uzel ovlivňuje ztrátu (z každého uzlu vede cesta do L), a nechť každou hodnotu fv i každou lokální derivaci ∂fv/∂u lze spočítat v konstantním čase. Pak zpětný průchod spočítá všechny adjungované hodnoty ū, u ∈ U — mezi nimi všechny derivace ∂L/∂θi podle parametrů — v čase O(E), tedy ve stejném řádu jako dopředný průchod a nezávisle na počtu parametrů.
Důkaz. Ve vzorci pro ū se každá hrana u → v objeví v součtu právě jednou, součty dohromady tedy mají E členů. Každý uzel kromě L má aspoň jednu odchozí hranu, takže |U| ≤ E + 1 a i práce na jednotlivých uzlech je O(E). ∎
Numerická derivace L(θ + hei) − L(θ − hei)/2h (ei je i-tý jednotkový vektor, h > 0 malé číslo) by potřebovala dva dopředné průchody na každý parametr — u sítě s miliardou parametrů dvě miliardy průchodů místo jednoho zpětného.
Dopředu se počítá, co síť odpoví. Zpátky se počítá, kdo za chybu může a kolik: ztráta pošle „výčitku“ 1 do poslední krabičky, ta ji vynásobí tím, jak citlivě reaguje na svůj vstup, a pošle dál. Součet výčitku rozdělí všem stejně, součin ji pošle každému vstupu vynásobenou tím druhým. Až výčitka dojde k parametru, je to přesně jeho složka gradientu.
Po jednom kroku s η = 0,5 se parametry posunou proti gradientu na w1 = 0,75, w2 = 0,2, b = 0,35 a ztráta klesne z 0,693 na 0,201. Všimněte si, že nejvíc se pohnula váha w2: její vstup x2 = 2 je největší, takže na ní výsledek nejvíc závisí.
3. Příklad: zpětné šíření sítí se softmaxem ve všech vrstvách
Skutečná síť je jen větší výpočetní graf. Operace se seskupí po vrstvách a místo čísel tečou vektory. Vezmeme síť, ve které má každý neuron součtovou bázovou funkci a každá vrstva aktivaci softmax, a odvodíme zpětné šíření obecně pro n vrstev: nejdřív chybu poslední vrstvy, pak vrstvy n − 1 a nakonec rekurzi, která funguje pro libovolně hlubokou síť. Potom všechno přepočítáme na konkrétních číslech.
Softmax ve skrytých vrstvách se v praxi skoro nepoužívá — skryté vrstvy mívají ReLU a softmax bývá jen na výstupu. Na ukázku je ale výborný: jeho derivace je plná matice, protože každý výstup závisí na všech vstupech vrstvy. Je tak dobře vidět, co zpětné šíření dělá, když aktivace neurony mezi sebou míchá.
Definice — síť, ztráta a chyba vrstvy
Pro m ∈ ℕ, m ≥ 1, je softmax funkce softmax : ℝm → (0, 1)m daná po složkách (viz díl o softmaxu)
softmax(z)i = ezi/∑k=1m ezk, i = 1, …, m.
Nechť n ∈ ℕ, n ≥ 1, je počet vrstev, d0, d1, …, dn ≥ 1 jsou šířky vrstev, x ∈ ℝd0 je vstup a pro ℓ = 1, …, n jsou W(ℓ) ∈ ℝdℓ×dℓ−1 váhy a b(ℓ) ∈ ℝdℓ biasy vrstvy ℓ. Síť se softmaxem ve všech vrstvách počítá a(0) = x a pro ℓ = 1, …, n
z(ℓ) = W(ℓ)a(ℓ−1) + b(ℓ) ∈ ℝdℓ, a(ℓ) = softmax(z(ℓ)) ∈ (0, 1)dℓ,
po složkách zi(ℓ) = ∑j=1dℓ−1 Wij(ℓ)aj(ℓ−1) + bi(ℓ) pro i = 1, …, dℓ (součtová bázová funkce).
Cíl je vektor t ∈ {0, 1}dn s ∑k tk = 1 (jediná jednička na pozici správné třídy) a ztráta je křížová entropie
L = −∑k=1dn tk ln ak(n).
Chyba vrstvy ℓ ∈ {1, …, n} je vektor
δ(ℓ) = ∂L/∂z(ℓ) ∈ ℝdℓ, tj. δi(ℓ) = ∂L/∂zi(ℓ).
Chyba vrstvy tedy říká, jak ztráta závisí na vstupu aktivace; z ní se pak dají přečíst gradienty vah i biasů.
Lemma 1 — Jacobiho matice softmaxu
Nechť m ∈ ℕ, m ≥ 1, z ∈ ℝm a a = softmax(z). Pro i, j ∈ {1, …, m} označme δij Kroneckerovo delta (δij = 1 pro i = j, jinak 0). Pak pro všechna i, j ∈ {1, …, m}
∂ai/∂zj = ai(δij − aj),
maticově
J = ∂a/∂z = diag(a) − aaT ∈ ℝm×m.
Důkaz. Označme S = ∑k=1m ezk, takže ∂S/∂zj = ezj. Podle pravidla pro podíl
pro i = j: ∂ai/∂zi = eziS − eziezi/S2 = ai − ai2,
pro i ≠ j: ∂ai/∂zj = −eziezj/S2 = −aiaj. ∎
Dvě vlastnosti budeme potřebovat: J je symetrická a každý její řádek (i sloupec) má součet nula, protože ∑j ai(δij − aj) = ai − ai∑jaj = 0.
Věta 2 — chyba poslední vrstvy: δ⁽ⁿ⁾ = a⁽ⁿ⁾ − t
Nechť síť, cíl t a ztráta L jsou jako v definici výše. Pak
δ(n) = a(n) − t.
Důkaz. Píšeme a = a(n), z = z(n). Ztráta závisí na a jako ∂L/∂ai = −ti/ai. Každé zj ovlivní všechna ai, takže se sčítá přes i a použije se lemma 1:
δj(n) = ∑i ∂L/∂ai · ∂ai/∂zj = ∑i (−ti/ai) · ai(δij − aj) = −tj + aj ∑i ti = aj − tj,
protože ∑i ti = 1. ∎
Je to stejný tvar jako ŷ − t u jednoho neuronu: logaritmus ve ztrátě zruší exponenciálu v softmaxu a z celé Jacobiho matice zbude rozdíl „co síť řekla“ minus „co měla říct“.
Věta 3 — chyba vrstvy n − 1
Nechť n ≥ 2, síť, cíl a ztráta jsou jako v definici výše a J(n−1) = diag(a(n−1)) − a(n−1)(a(n−1))T je Jacobiho matice softmaxu vrstvy n − 1 (lemma 1). Označme g(n−1) = ∂L/∂a(n−1) ∈ ℝdn−1. Pak
- g(n−1) = (W(n))T δ(n), po složkách gj = ∑i Wij(n) δi(n);
- δ(n−1) = J(n−1) g(n−1), po složkách δj(n−1) = aj (gj − a·g),
kde a = a(n−1), g = g(n−1) a a·g = ∑i aigi je průměr g vážený aktivacemi vrstvy (váhy ai jsou kladné a dávají součet 1).
Důkaz. Nejdřív gradient podle výstupů vrstvy n − 1. Protože zi(n) = ∑j Wij(n)aj(n−1) + bi(n), je ∂zi(n)/∂aj(n−1) = Wij(n) a podle řetízkového pravidla gj = ∑i ∂L/∂zi(n) · Wij(n) = ∑i Wij(n) δi(n), což je bod 1.
Chyba se tedy vrací po stejných vahách, kterými signál šel dopředu, jen v opačném směru — odtud transpozice. Pak projde zpátky softmaxem vrstvy n − 1; podle lemmatu 1 a díky symetrii J:
δj(n−1) = ∑i gi ∂ai/∂zj = ∑i ai(δij − aj)gi = ajgj − aj ∑i aigi = aj (gj − a·g),
což je bod 2. ∎
Výklad: neuron dostane chybu úměrnou tomu, o kolik je „jeho“ gradient gj nad váženým průměrem celé vrstvy, a navíc vynásobenou svou aktivací. Softmax nerozlišuje absolutní úroveň, jen poměry — proto se odečítá průměr.
Věta 4 — rekurze pro libovolnou vrstvu a gradienty parametrů
Nechť síť, cíl a ztráta jsou jako v definici výše, J(ℓ) je Jacobiho matice softmaxu vrstvy ℓ (lemma 1), ⊙ značí násobení po složkách a 1 vektor jedniček. Pak
- (rekurze) pro ℓ = n − 1, n − 2, …, 1 platí g(ℓ) = (W(ℓ+1))T δ(ℓ+1), δ(ℓ) = J(ℓ)g(ℓ) = a(ℓ) ⊙ (g(ℓ) − (a(ℓ)·g(ℓ)) 1), kde g(ℓ) = ∂L/∂a(ℓ);
- (gradienty parametrů) pro ℓ = 1, …, n, i = 1, …, dℓ a j = 1, …, dℓ−1 platí ∂L/∂Wij(ℓ) = δi(ℓ) aj(ℓ−1), tj. ∂L/∂W(ℓ) = δ(ℓ)(a(ℓ−1))T, ∂L/∂b(ℓ) = δ(ℓ).
Důkaz. (1) Úvaha z věty 3 nikde nevyužila, že vrstva n je poslední — jen to, že z(ℓ+1) závisí na a(ℓ) lineárně s maticí W(ℓ+1) a že a(ℓ) = softmax(z(ℓ)). Rozepsáno přes všechny vrstvy:
δ(ℓ) = J(ℓ)(W(ℓ+1))T J(ℓ+1)(W(ℓ+2))T ⋯ J(n−1)(W(n))T (a(n) − t).
(2) Váha Wij(ℓ) ovlivní jen zi(ℓ), a to s derivací ∂zi(ℓ)/∂Wij(ℓ) = aj(ℓ−1); bias bi(ℓ) s derivací 1. Řetízkové pravidlo dá ∂L/∂Wij(ℓ) = δi(ℓ) · aj(ℓ−1) a ∂L/∂bi(ℓ) = δi(ℓ). ∎
Gradient váhy je tedy „chyba neuronu, do kterého váha vede, krát aktivita neuronu, ze kterého vede“. Váha z neaktivního neuronu se neučí.
Důsledek 5 — součet chyb ve vrstvě je nula
Nechť síť, cíl a ztráta jsou jako v definici výše. Pak pro každou vrstvu ℓ ∈ {1, …, n} platí
∑j=1dℓ δj(ℓ) = 0, a tedy i ∑j=1dℓ ∂L/∂bj(ℓ) = 0.
Důkaz. Pro ℓ = n: ∑(aj − tj) = 1 − 1 = 0. Pro skryté vrstvy: 1Tδ(ℓ) = 1TJ(ℓ)g(ℓ) = 0, protože sloupce J mají součet nula (lemma 1). ∎
Důvod je hlubší: softmax se nezmění, když ke všem zi ve vrstvě přičtete stejné číslo. Ve směru (1, 1, …, 1) je tedy ztráta plochá a gradient do něj nemůže ukazovat.
Věta 6 — softmaxová vrstva chybu nejvýš zpoloviční
Nechť m ≥ 1, a ∈ (0, 1)m s ∑i ai = 1 (výstup softmaxu) a J = diag(a) − aaT. Pak všechna vlastní čísla J leží v intervalu [0, 1/2], a proto pro každé g ∈ ℝm platí
‖Jg‖ ≤ 1/2 ‖g‖.
Důkaz. J je symetrická, takže má reálná vlastní čísla. Řádek i má na diagonále ai(1 − ai) a mimo ni čísla −aiaj, jejichž absolutní hodnoty dají dohromady ai(1 − ai). Podle Geršgorinovy věty leží každé vlastní číslo v některém intervalu [0, 2ai(1 − ai)] a 2a(1 − a) ≤ 1/2 pro každé a ∈ ℝ. Pro symetrickou matici je ‖Jg‖ ≤ max |λ| · ‖g‖, kde maximum je přes vlastní čísla λ. ∎
Každá softmaxová vrstva tedy chybu cestou zpátky přinejmenším zpoloviční (pokud ji váhy nezesílí). To je jeden z důvodů, proč se softmax do skrytých vrstev nedává: v hluboké síti by gradient k prvním vrstvám skoro nedošel. Uvidíte to i v příkladu.
Poslední vrstva má to nejjednodušší: její chyba je prostě „co síť řekla minus co měla říct“. Každá další vrstva dozadu dostane chybu od vrstvy nad sebou, poslanou po stejných vahách jako signál, jen obráceně, a pak ji přefiltruje přes derivaci své aktivace. U softmaxu ten filtr odečte průměr a vynásobí aktivitou neuronu. Gradient každé váhy je nakonec součin dvou čísel, která už máme: chyby na jejím konci a aktivity na jejím začátku.
Na číslech: síť 2 → 3 → 3 → 2
Vstup x = 1,00,5, správná třída je první, t = 10. Tři vrstvy (n = 3) se softmaxem, váhy a biasy:
W(1) = 0,5−0,40,30,8−0,60,2, b(1) = 0,1−0,20,0, W(2) = 0,7−0,50,2−0,30,40,60,10,9−0,8, b(2) = 0,00,1−0,1, W(3) = 1,2−0,70,4−0,50,60,9, b(3) = 0,2−0,2.
Dopředný průchod. Každá vrstva spočítá součtovou bázovou funkci a pak softmax:
| vrstva ℓ | z(ℓ) = W(ℓ)a(ℓ−1) + b(ℓ) | a(ℓ) = softmax(z(ℓ)) |
|---|---|---|
| 1 | (0,400; 0,500; −0,500) | (0,398; 0,440; 0,162) |
| 2 | (0,091; 0,254; 0,206) | (0,303; 0,357; 0,340) |
| 3 | (0,450; 0,169) | (0,570; 0,430) |
Například první složka první vrstvy: z1(1) = 0,5 · 1,0 + (−0,4) · 0,5 + 0,1 = 0,400 a a1(1) = e0,400/e0,400 + e0,500 + e−0,500 = 0,398. Síť dává správné třídě pravděpodobnost 0,570, takže ztráta je L = −ln 0,570 = 0,562.
Poslední vrstva (ℓ = 3). Podle věty 2:
δ(3) = a(3) − t = 0,5700,430 − 10 = −0,4300,430, ∂L/∂W(3) = δ(3)(a(2))T = −0,4300,430 0,3030,3570,340 = −0,130−0,153−0,1460,1300,1530,146, ∂L/∂b(3) = δ(3).
Záporné δ1 znamená „zvětši z1“: krok sestupu odečte záporný gradient, takže váhy do správného výstupu porostou a váhy do špatného klesnou. Součet složek je nula (důsledek 5).
Vrstva n − 1 (ℓ = 2). Podle věty 3 nejdřív pošleme chybu zpátky po vahách:
g(2) = (W(3))Tδ(3) = 1,2−0,5−0,70,60,40,9 −0,4300,430 = −0,7310,5590,215,
například g1 = 1,2 · (−0,430) + (−0,5) · 0,430 = −0,731. Pak softmaxem vrstvy 2. Jacobiho matice a vážený průměr jsou
J(2) = diag(a(2)) − a(2)(a(2))T = 0,211−0,108−0,103−0,1080,229−0,121−0,103−0,1210,224, a(2)·g(2) = 0,051,
a tedy δ(2) = J(2)g(2) = −0,2370,1810,056; třeba δ1(2) = 0,303 · (−0,731 − 0,051) = −0,237. Gradient vah:
∂L/∂W(2) = δ(2)(a(1))T = −0,094−0,104−0,0380,0720,0800,0290,0220,0250,009, ∂L/∂b(2) = δ(2).
Vrstva 1. Stejná rekurze o vrstvu níž (věta 4):
g(1) = (W(2))Tδ(2) = −0,2150,2410,017, a(1)·g(1) = 0,023, δ(1) = a(1) ⊙ (g(1) − 0,023 · 1) = −0,0950,096−0,001,
∂L/∂W(1) = δ(1)xT = −0,0948−0,04740,09590,0479−0,0011−0,0005.
Velikost chyby cestou dozadu klesá: ‖δ(3)‖ = 0,608, ‖δ(2)‖ = 0,304, ‖δ(1)‖ = 0,135 — přesně jak předpovídá věta 6. Váhy první vrstvy se proto učí nejpomaleji.
Kontrola a krok. Zpětné šíření je jen řetízkové pravidlo, a dá se proto ověřit numericky: centrální diference L(W11(1) + h) − L(W11(1) − h)/2h s h = 10−6 dá −0,094798 a zpětný průchod −0,094798. Jeden krok sestupu s η = 1,0 (všechny váhy a biasy naráz, W(ℓ) ← W(ℓ) − η ∂L/∂W(ℓ)) sníží ztrátu z 0,562 na 0,147 a pravděpodobnost správné třídy stoupne z 0,570 na 0,863.
4. Rychlost učení: jak dlouhý krok
Délka kroku je nejdůležitější volba celého algoritmu. Ukážeme to na nejjednodušší krajině, parabole J(x) = x2, se startem v x = 4. Derivace je 2x, takže každý krok udělá x ← x − η · 2x = (1 − 2η)x. Dvanáct kroků pro čtyři různé rychlosti učení:
- η = 0,1 — každý krok zkrátí vzdálenost od minima jen o pětinu. Po dvanácti krocích je míček teprve v x ≈ 0,27.
- η = 0,4 — každý krok ji zkrátí pětkrát; po pár krocích je míček prakticky na dně.
- η = 0,9 — krok je tak dlouhý, že míček přeskočí na druhou stranu. Přesto se blíží, protože skáče pořád kratší oblouky.
- η = 1,05 — přeskočí pokaždé dál, než byl: místo dolů letí ven a po dvanácti krocích je v x ≈ 12,55. Učení diverguje.
Věta — kdy sestup na parabole konverguje
Nechť J : ℝ → ℝ, J(x) = x2, start x0 ∈ ℝ, x0 ≠ 0, rychlost učení η > 0 a xt+1 = xt − ηJ′(xt) pro t = 0, 1, 2, … Pak
- xt = (1 − 2η)t x0 pro všechna t ∈ ℕ0;
- xt → 0 (sestup konverguje do minima), právě když |1 − 2η| < 1, tj. právě když η < 1;
- pro η = 0,5 je x1 = 0 — sestup skončí v minimu jediným krokem.
Důkaz. Jeden krok je xt+1 = xt − η · 2xt = (1 − 2η)xt; indukcí dostaneme mocninu. Posloupnost qt jde k nule právě pro |q| < 1. ∎
xt = (1 − 2η)t x0
- xt
- poloha po t krocích — zároveň vzdálenost od minima v nule
- 1 − 2η
- koeficient jednoho kroku — číslo 2 je druhá derivace (zakřivení) paraboly; o kolik krok zkrátí vzdálenost, závisí na součinu rychlosti učení a zakřivení. Záporný koeficient znamená přeskok na druhou stranu
- t
- počet kroků — koeficient se násobí v každém kroku znovu, proto vzdálenost klesá (nebo roste) geometricky
- x0
- start — výsledek je mu úměrný: dvakrát dál od minima znamená dvakrát dál i po t krocích
Příklad — čísla z obrázku
η = 0,1: koeficient 1 − 0,2 = 0,8, x1 = 0,8 · 4 = 3,2, x12 = 0,812 · 4 ≈ 0,0687 · 4 ≈ 0,27
η = 0,4: koeficient 0,2, x1 = 0,8, x2 = 0,16, x3 = 0,032 — každý krok pětkrát blíž
η = 0,9: koeficient −0,8, x1 = −3,2, x2 = 2,56, x3 = −2,048 — skáče, ale |x| klesá
η = 1,05: koeficient −1,1, x1 = −4,4, x2 = 4,84, x12 = (−1,1)12 · 4 ≈ 3,138 · 4 ≈ 12,55
Věta — obecná hranice pro rychlost učení
(1) Nechť a > 0, J : ℝ → ℝ, J(x) = ax2/2 (druhá derivace je a), η > 0 a x0 ≠ 0. Pak krok sestupu je x ← (1 − ηa)x a sestup konverguje do minima 0, právě když
0 < η < 2/a.
Parabola x2 má a = 2, odtud hranice 1.
(2) Obecně: nechť J : ℝd → ℝ je diferencovatelná a její gradient má Lipschitzovu konstantu L > 0, tj. ‖∇J(u) − ∇J(v)‖ ≤ L‖u − v‖ pro všechna u, v ∈ ℝd (zakřivení nikde nepřesáhne L), a nechť 0 < η ≤ 1/L. Pak J(θt+1) ≤ J(θt) pro každé t — ztráta v žádném kroku nevzroste (standardní výsledek, viz např. Nesterov: Introductory Lectures on Convex Optimization, 2004, odd. 1.2.3). Rychlost učení se tedy musí řídit nejstrmějším zakřivením krajiny.
Malý krok je bezpečný, ale pomalý. Velký krok je rychlý, dokud nepřestřelí. Moc velký krok učení rozbije: chyba místo klesání roste, až z ní je nekonečno.
5. Úzká údolí a cik-cak
Skutečné krajiny nejsou kulaté mísy. Bývají to dlouhá úzká údolí — v jednom směru strmá, v druhém skoro rovná. Vezmeme J(x, y) = x2/2 + 10y2, ve směru y dvacetkrát strmější. Obyčejný sestup tu má problém: rychlost učení musí být malá kvůli strmému směru (jinak by v y divergoval), a s tak malým krokem se v plochém směru x sotva hýbe. Navíc ve směru y pořád přeskakuje ze strany na stranu:
Každá metoda má svou nejlepší rychlost učení, nalezenou zkoušením. I tak potřebuje obyčejný sestup 36 kroků a cik-cakuje, zatímco momentum a Adam jsou dole za 9. Proč, ukážou další dvě kapitoly.
Proč obyčejný sestup v údolí cik-cakuje
Gradient údolí je ∇J(x, y) = (x, 20y) — každá souřadnice má vlastní zakřivení, 1 ve směru x a 20 ve směru y. Krok sestupu se proto rozpadne na dva nezávislé kroky, jako u paraboly výše:
x ← (1 − η · 1) x, y ← (1 − η · 20) y
- x
- souřadnice podél dna údolí — tady je krajina skoro plochá
- 1 − η · 1
- koeficient v plochém směru — malé zakřivení 1 dá koeficient blízký 1, takže se x v každém kroku zmenší jen o kousek
- y
- souřadnice napříč údolím — strmé stěny
- 1 − η · 20
- koeficient ve strmém směru — zakřivení 20 ho rychle stáhne pod nulu; aby jeho absolutní hodnota zůstala pod 1, musí být η < 2/20 = 0,1
Definice — číslo podmínky
Nechť d ≥ 1 a A ∈ ℝd×d je symetrická pozitivně definitní matice; její vlastní čísla jsou reálná a kladná, označme λmin > 0 nejmenší a λmax největší z nich. Číslo podmínky matice A je
κ = λmax/λmin ≥ 1,
poměr největšího a nejmenšího vlastního čísla. Pro kvadratickou ztrátu J : ℝd → ℝ, J(θ) = 1/2 θTAθ, jsou vlastní čísla A zakřivení v hlavních směrech a číslo podmínky ztráty je číslo podmínky A. Naše údolí má A = diag(1, 20), tedy κ = 20.
Pro tuto ztrátu platí (standardní výsledek): gradientní sestup s rychlostí učení η konverguje z každého startu, právě když 0 < η < 2/λmax. I s nejlepší pevnou volbou η = 2/λmin + λmax platí jen ‖θt+1‖ ≤ κ − 1/κ + 1 ‖θt‖ (minimum je v θ = 0) — u nás 19/21 ≈ 0,905. Čím větší κ, tím blíž je tento koeficient k 1 a tím pomalejší sestup.
Číslo podmínky říká, kolikrát je nejstrmější směr strmější než nejplošší. Kulatá mísa má 1 a sestup jde přímo dolů. Údolí s číslem 20 je dvacetkrát „protáhlejší“ a sestup v něm ztrácí čas.
Příklad — odkud je 36 kroků
η = 0,09: x ← 0,91 · x, y ← (−0,8) · y (barvy podle vzorce výše)
start (−4,0; 1,2), po 1. kroku (−3,64; −0,96), po 2. kroku (−3,312; 0,768), po 3. kroku (−3,014; −0,614)
Znaménko y se střídá (koeficient je záporný) — to je ten cik-cak; |y| klesá 1,25krát za krok, x jen 1,1krát.
Ztráta pod 0,01 vyžaduje hlavně x2/2 < 0,01, tedy |x| < √0,02 ≈ 0,141:
4 · 0,91t < 0,141 ⇔ t > ln 0,141/4/ln 0,91 ≈ 35,4, tedy 36 kroků.
6. Momentum: koule se setrvačností
Definice — sestup s momentem
Nechť J : ℝd → ℝ je diferencovatelná ztrátová funkce, θ0 ∈ ℝd počáteční parametry, η > 0 rychlost učení a β ∈ [0, 1) koeficient momenta. Sestup s momentem položí v0 = 0 ∈ ℝd a pro t = 0, 1, 2, … počítá
vt+1 = β vt − η ∇J(θt), θt+1 = θt + vt+1;
zastaví se stejně jako gradientní sestup (malý gradient nebo vyčerpaný počet kroků). Vektor vt ∈ ℝd je „rychlost“ a β říká, kolik z ní zůstane do dalšího kroku (typicky 0,9; v našem údolí nejlépe 0,6). Pro β = 0 jde o obyčejný gradientní sestup.
Místo opatrného chodce těžká koule. Kde gradient míří pořád stejně (podél údolí), koule nabírá rychlost. Kde se směr střídá (přes údolí), se pohyby tam a zpátky navzájem vyruší. Cik-cak se utlumí a koule se rozjede dolů.
vt+1 = β vt − η ∇J(θt)
- vt+1
- nová rychlost — o tolik se parametry posunou v tomto kroku (θt+1 = θt + vt+1)
- β
- „nedokonalé tření“ — kolik z minulé rychlosti zůstane; musí být menší než 1, jinak by se staré gradienty nikdy nezapomněly a koule by nezastavila
- vt
- minulá rychlost — paměť předchozích kroků; díky ní se kroky stejným směrem sčítají a kroky tam a zpět ruší
- η ∇J(θt)
- obyčejný krok sestupu — „síla“, která kouli v tomto bodě postrčí z kopce
Věta — momentum prodlouží krok až 1/1 − β-krát
Nechť η > 0, β ∈ [0, 1), g ∈ ℝd a gradient je v průběhu sestupu pořád stejný, ∇J(θt) = g pro všechna t (rovný svah), a v0 = 0. Pak pro každé t ≥ 1
vt = −ηg(1 + β + … + βt−1) = −ηg 1 − βt/1 − β a vt → −η/1 − β g pro t → ∞.
Důkaz. Indukcí z vt+1 = βvt − ηg; součet geometrické řady, a βt → 0, protože 0 ≤ β < 1. ∎
Na rovném svahu se tedy krok ustálí na η/1 − β-násobku gradientu: pro β = 0,6 je to 2,5krát delší krok, pro obvyklé β = 0,9 desetkrát. Když se znaménko gradientu střídá, součet řady se naopak skoro vyruší.
Příklad — první dva kroky v údolí (η = 0,1, β = 0,6)
θ0 = (−4; 1,2), ∇J = (−4; 24), v1 = −0,1 · (−4; 24) = (0,4; −2,4), θ1 = (−3,6; −1,2)
∇J(θ1) = (−3,6; −24), v2 = 0,6 · (0,4; −2,4) − 0,1 · (−3,6; −24) = (0,24 + 0,36; −1,44 + 2,4) = (0,6; 0,96) (barvy podle vzorce výše)
θ2 = (−3,6 + 0,6; −1,2 + 0,96) = (−3,00; −0,24)
Ve směru x se krok prodloužil z 0,4 na 0,6 (gradient má pořád stejné znaménko), ve směru y se rychlost −2,4 a nový tah +2,4 skoro vyrušily a koule je u dna údolí (y = −0,24). Obyčejný sestup je po dvou krocích teprve v (−3,31; 0,77).
7. Adam: vlastní krok pro každý parametr
Definice — Adam (Kingma a Ba, 2014)
Nechť J : ℝd → ℝ je diferencovatelná ztrátová funkce. Adam je algoritmus:
- vstup: počáteční parametry θ0 ∈ ℝd, rychlost učení η > 0, koeficienty β1, β2 ∈ [0, 1), malé číslo ε > 0 a počet kroků T ∈ ℕ;
- výstup: parametry θT ∈ ℝd.
Polož m0 = s0 = 0 ∈ ℝd a pro t = 1, 2, …, T proveď (všechny operace s vektory — čtverec, odmocnina, dělení — jsou po složkách):
- gt = ∇J(θt−1);
- mt = β1mt−1 + (1 − β1)gt (průměr gradientů);
- st = β2st−1 + (1 − β2)gt2 (průměr čtverců gradientů);
- m̂t = mt/1 − β1t, ŝt = st/1 − β2t (oprava počátečního zkreslení, viz další definice);
- θt = θt−1 − η m̂t/√ŝt + ε.
Obvyklé hodnoty: β1 = 0,9, β2 = 0,999, ε = 10−8. Adam tedy dělá krok ve směru průměrného gradientu, v každé složce vydělený typickou velikostí gradientu v té složce.
Adam je momentum, které si navíc u každého parametru pamatuje, jak velké gradienty v něm bývají, a krok jimi vydělí. Ve strmém směru tak dělá kratší kroky, v plochém delší — jako by se údolí roztáhlo do kulaté mísy. Proto jde k cíli skoro rovně (na obrázku ho jen na konci kousek přejede, protože si stále nese setrvačnost) a proto je dnes výchozí volbou pro trénink neuronových sítí.
Definice — exponenciální klouzavý průměr
Nechť g1, g2, … je posloupnost reálných čísel (nebo vektorů z ℝd) a β ∈ [0, 1). Exponenciální klouzavý průměr této posloupnosti je posloupnost (mt)t ≥ 0 daná rekurzí
m0 = 0, mt = βmt−1 + (1 − β)gt pro t ≥ 1,
rozepsáno mt = (1 − β) ∑k=1t βt−kgk. Pro t ≥ 1 a β > 0 je jeho oprava o počáteční zkreslení
m̂t = mt/1 − βt.
Váhy (1 − β)βt−k, k = 1, …, t, dají dohromady jen 1 − βt, ne 1 — chybějící část připadá na počáteční nulu. Proto je mt na začátku zkreslený k nule a oprava z něj dělá skutečný vážený průměr (váhy po opravě dávají součet 1; při stálém gk = g je přesně m̂t = g).
θ ← θ − η · m̂/√ŝ + ε
- θ
- parametry; všechno ostatní se počítá po složkách, takže každý parametr má vlastní krok
- η
- rychlost učení — protože zbytek zlomku má velikost zhruba 1, je η u Adama přímo přibližná délka kroku v každém parametru
- m̂
- opravený průměr gradientů (první moment) — směr jako u momenta: šum a cik-cak se v průměru vyruší
- √ŝ
- odmocnina z průměru čtverců gradientů (druhý moment) — typická velikost gradientu v tomto parametru; dělením se strmý a plochý směr srovnají na stejné měřítko
- ε
- malé číslo (typicky 10−8) — jen pojistka, aby se nedělilo nulou u parametru, jehož gradient je stále nula
Příklad — první krok Adama v údolí (η = 0,5)
g = ∇J(−4; 1,2) = (−4; 24), m1 = (1 − β1)g, m̂1 = m1/1 − β1 = g = (−4; 24)
s1 = (1 − β2)g2, ŝ1 = g2 = (16; 576), √ŝ1 = (4; 24)
m̂1/√ŝ1 ≈ (−4/4; 24/24) = (−1; 1) (ε = 10−8 zanedbáváme), θ1 = (−4; 1,2) − 0,5 · (−1; 1) = (−3,5; 0,7) (barvy podle vzorce výše)
Gradient ve směru y je šestkrát větší než ve směru x, a přesto se oba parametry posunuly o stejných 0,5. Obyčejný sestup by se ve směru y posunul šestkrát dál než ve směru x.
def adam(grad_J, theta, eta, beta1=0.9, beta2=0.999, eps=1e-8, kroku=1000):
m = s = 0 # vektory nul, velikost jako theta
for t in range(1, kroku + 1):
g = grad_J(theta)
m = beta1 * m + (1 - beta1) * g # průměr gradientů (směr)
s = beta2 * s + (1 - beta2) * g**2 # průměr čtverců (velikost), po složkách
m_hat = m / (1 - beta1**t) # oprava počáteční nuly
s_hat = s / (1 - beta2**t)
theta = theta - eta * m_hat / (sqrt(s_hat) + eps)
return theta
8. Stochastický sestup: učení po dávkách
Definice — stochastický gradientní sestup (SGD)
Nechť n ≥ 1 je počet příkladů v datech, L1, …, Ln : ℝd → ℝ jsou diferencovatelné ztráty jednotlivých příkladů a celková ztráta je jejich průměr
J(θ) = 1/n ∑i=1n Li(θ).
Stochastický gradientní sestup je gradientní sestup (se vstupy θ0, η a počtem kroků jako výše), ve kterém se v každém kroku t místo ∇J(θt) použije odhad
gt = 1/|Bt| ∑i ∈ Bt ∇Li(θt), θt+1 = θt − ηgt,
kde dávka Bt ⊆ {1, …, n} je v každém kroku znovu náhodně vybraná neprázdná množina indexů (typicky pevné velikosti |Bt| ≪ n). Epocha je úsek kroků, během kterého se každý z n příkladů použije právě jednou (při zamíchání dat a procházení po dávkách velikosti b je to n/b kroků, je-li n dělitelné b).
Spočítat gradient přes miliardu příkladů je drahé. Stačí se podívat na pár náhodných a vzít jejich průměr: odhad sklonu je trochu zašuměný, ale stojí zlomek práce. Za cenu jednoho přesného kroku jich uděláte stovky přibližných.
g = 1/|B| ∑i ∈ B ∇Li(θ)
- g
- odhad gradientu — použije se místo ∇J(θ) v obvyklém kroku θ ← θ − ηg
- 1/|B|
- dělení velikostí dávky — z průměru se stane odhad celého průměru J; bez něj by větší dávka znamenala delší krok
- ∑i ∈ B
- součet jen přes náhodně vybranou dávku — tady je úspora: |B| výpočtů místo n
- ∇Li(θ)
- gradient ztráty na jednom příkladu — kterým směrem by parametry chtěl posunout právě tenhle příklad
Věta — dávkový gradient je nestranný odhad
Nechť J = 1/n ∑i=1n Li je jako v definici SGD, θ ∈ ℝd pevné a b ≥ 1. Nechť I1, …, Ib jsou nezávislé náhodné indexy, každý s rovnoměrným rozdělením na {1, …, n} (výběr s vracením), a
g = 1/b ∑k=1b ∇LIk(θ).
Pak
- E[g] = ∇J(θ) — odhad je nestranný;
- pro každou složku j = 1, …, d je var(gj) = 1/b var(∂LI1/∂θj(θ)), takže směrodatná odchylka (typická chyba) odhadu klesá jako 1/√b.
Důkaz. (1) Pro jeden náhodný index I je E[∇LI(θ)] = ∑i=1n 1/n ∇Li(θ) = ∇J(θ); průměr b takových odhadů má stejnou střední hodnotu. (2) Rozptyl průměru b nezávislých stejně rozdělených veličin je rozptyl jedné vydělený b. ∎
V praxi (i v našem programu) se data místo nezávislého výběru zamíchají a berou postupně po dávkách — každý příklad se v epoše použije právě jednou. Na tvaru závěru to skoro nic nemění.
Definice — střední kvadratická chyba (MSE) a její gradient
Nechť n ≥ 1 a (xi, yi) ∈ ℝ2, i = 1, …, n, jsou data. Pro parametry (a, b) ∈ ℝ2 přímky ŷ = ax + b je střední kvadratická chyba funkce J : ℝ2 → ℝ,
J(a, b) = 1/n ∑i=1n (axi + b − yi)2.
Označme ei = axi + b − yi chybu na i-tém příkladu. Pak (derivace složené funkce)
∂J/∂a = 2/n ∑i=1n eixi, ∂J/∂b = 2/n ∑i=1n ei.
SGD počítá tytéž součty, jen přes dávku B a s 2/|B| místo 2/n.
def sgd(data, theta, eta, davka, epoch):
for _ in range(epoch):
zamichej(data) # nové náhodné pořadí v každé epoše
for zacatek in range(0, len(data), davka):
B = data[zacatek : zacatek + davka]
g = prumer(grad_L(theta, priklad) for priklad in B)
theta = theta - eta * g
return theta
Na lineární regresi se 40 body porovnáme plný sestup (gradient přes všech 40 bodů) se SGD po dávkách 4 bodů:
Po 60 krocích má plný sestup ztrátu 0,0017 a SGD 0,0027 — křivka SGD je hrbolatá, ale skoro stejně nízko. Jenže každý krok SGD prošel jen 4 body místo 40, tedy desetkrát méně práce. U skutečných dat s miliony příkladů je ten rozdíl rozhodující. A šum má i výhodu: pomáhá vyskočit z mělkých jam.
plný sestup: 60 kroků · 40 bodů = 2400 gradientů jednotlivých bodů = 60 epoch
SGD: 60 kroků · 4 body = 240 gradientů = 240/40 = 6 epoch
9. Lokální minima a sedla
Gradientní sestup najde dno toho údolí, ve kterém začal. U konvexní funkce je dno jen jedno, u nekonvexní záleží na startu. Funkce x4 − 3x2 + x z dílu o funkcích má dvě minima:
Míček, který startuje v x = 2, skončí v lokálním minimu u x ≈ 1,13 s hodnotou ≈ −1,07. Míček ze x = −2 najde globální minimum u x ≈ −1,30 s hodnotou ≈ −3,51. Ve vysokých rozměrech neuronových sítí se ukazuje, že špatná lokální minima jsou vzácnější, než by se čekalo — větší potíž bývají sedla, místa, kde je gradient nula, ale v jednom směru jde krajina nahoru a v jiném dolů. Šum SGD a momentum z nich pomáhají sklouznout.
Definice — lokální a globální minimum, stacionární bod, sedlo
Nechť J : ℝd → ℝ a θ* ∈ ℝd.
- θ* je globální minimum J, právě když ∀θ ∈ ℝd : J(θ*) ≤ J(θ).
- θ* je lokální minimum J, právě když ∃r > 0 ∀θ ∈ ℝd : ‖θ − θ*‖ < r ⇒ J(θ*) ≤ J(θ). Lokální maximum je definováno stejně s ≥ místo ≤.
- Je-li J diferencovatelná, je θ* stacionární bod, právě když ∇J(θ*) = 0.
- θ* je sedlo, právě když je stacionární bod a není lokální minimum ani lokální maximum.
Ve stacionárním bodě se gradientní sestup zastaví, ať je to cokoli. Je-li J dvakrát spojitě diferencovatelná, rozliší typ stacionárního bodu Hessova matice H ∈ ℝd×d, Hij = ∂2J/∂θi ∂θj(θ*): má-li všechna vlastní čísla kladná, je θ* lokální minimum; všechna záporná — lokální maximum; kladná i záporná — sedlo. Je-li některé vlastní číslo nulové a ostatní stejného znaménka, test nerozhodne.
Příklad — stacionární body funkce x⁴ − 3x² + x
f ′(x) = 4x3 − 6x + 1 = 0 ⇒ x ≈ −1,301, x ≈ 0,170, x ≈ 1,131 (numericky, Newtonovou metodou)
f ″(x) = 12x2 − 6: f ″(−1,301) ≈ 14,3 > 0 — minimum, f ″(0,170) ≈ −5,65 < 0 — maximum, f ″(1,131) ≈ 9,35 > 0 — minimum
f(−1,301) ≈ −3,51, f(0,170) ≈ 0,08, f(1,131) ≈ −1,07
Maximum u 0,17 je „hřeben“ mezi oběma údolími: míček, který startuje vpravo od něj, se skutálí do lokálního minima, vlevo do globálního. Sedlo v jedné proměnné nevznikne — potřebuje aspoň dva směry. Nejjednodušší je J(x, y) = x2 − y2: v počátku je ∇J = (2x, −2y) = 0 a H = diag(2, −2) má vlastní čísla obou znamének.
Věta — u konvexní funkce je každé lokální minimum globální
Definice. Nechť J : ℝd → ℝ. Funkce J je konvexní, právě když
∀u, v ∈ ℝd ∀λ ∈ [0, 1] : J(λu + (1 − λ)v) ≤ λJ(u) + (1 − λ)J(v)
— úsečka mezi dvěma body grafu nikde neleží pod grafem.
Věta. Nechť J : ℝd → ℝ je konvexní a θ* ∈ ℝd je lokální minimum J. Pak θ* je globální minimum J.
Důkaz. Předpokládejme pro spor, že existuje u ∈ ℝd s J(u) < J(θ*). Pro body θλ = λu + (1 − λ)θ* platí J(θλ) ≤ λJ(u) + (1 − λ)J(θ*) < J(θ*) pro každé λ ∈ (0, 1]. Pro malé λ leží θλ libovolně blízko θ* — to je spor s lokální minimalitou. ∎
Parabola i údolí z předchozích oddílů jsou konvexní, ztráta neuronové sítě s nelineárními aktivacemi obecně ne — proto u sítí záleží na startu.
10. Jak se to dělá v praxi
- Adam nebo SGD s momentem — dvě nejčastější volby. Adam funguje dobře hned, SGD s momentem bývá po pečlivém ladění o kousek lepší.
- Plán rychlosti učení — na začátku pomalý rozjezd (warmup), pak postupné snižování. Velké kroky se hodí daleko od cíle, malé blízko něj.
- Velikost dávky — typicky 32 až tisíce příkladů; omezuje ji paměť grafické karty.
- Epochy a předčasné zastavení — data se prochází opakovaně a trénink se zastaví, když se přestane zlepšovat chyba na datech, která model neviděl.
- Normalizace dat — když mají vstupy podobný rozsah, je krajina kulatější a sestup snazší.
11. Shrnutí
- Gradientní sestup opakuje θ ← θ − η∇J(θ): krok proti gradientu.
- Rychlost učení rozhoduje: malá je pomalá, velká kmitá, moc velká diverguje.
- V úzkých údolích obyčejný sestup cik-cakuje; momentum přidá setrvačnost, Adam vlastní krok pro každý parametr.
- SGD počítá gradient z malých dávek — šumí, ale každý krok je mnohonásobně levnější.
- Sestup najde dno údolí, ve kterém začal; v nekonvexních krajinách záleží na startu.
Tímhle dílem je hotová matematika, kterou potřebujete k pochopení učení. Další moduly série — pravděpodobnost, strojové učení a neuronové sítě — na ni stavějí.
Máte na to jiný názor? Napište na support@coden-app.com.