Přeskočit na obsah
coden

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í.

24 minut Matěj Žalmánek 2026-10-15

Série Základy AI Díl 11 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • 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í.
  1. Polož t = 0.
  2. Je-li ‖∇J(θt)‖ < ε nebo t = T, zastav a vrať θt.
  3. 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.

Laicky řečeno

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
Každý parametr se posune úměrně tomu, jak moc na něm ztráta závisí, a proti směru, kterým ji zvětš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:

∂L/∂w₁ = −0,5 ∂L/∂w₂ = −1 p₁ = 0,5 ∂L/∂p₁ = −0,5 p₂ = −0,6 ∂L/∂p₂ = −0,5 ∂L/∂b = −0,5 z = 0 ∂L/∂z = −0,5 ŷ = 0,5 ∂L/∂ŷ = −2 L = 0,693 ∂L/∂L = 1 × × + σ L x₁ = 1 w₁ = 0,5 w₁ = 0,75 x₂ = 2 w₂ = −0,3 w₂ = 0,2 b = 0,1 b = 0,35 t = 1 vstupy a parametry x₁ = 1, x₂ = 2, t = 1; w₁ = 0,5, w₂ = −0,3, b = 0,1; η = 0,5 dopředný průchod p₁ = w₁ · x₁ = 0,5 · 1 = 0,5 dopředný průchod p₂ = w₂ · x₂ = −0,3 · 2 = −0,6 dopředný průchod z = p₁ + p₂ + b = 0,5 + (−0,6) + 0,1 = 0 dopředný průchod ŷ = σ(z) = 1 / (1 + e^(−z)) = 0,5 dopředný průchod L = −t ln ŷ − (1 − t) ln(1 − ŷ) = 0,693 zpětný průchod ∂L/∂ŷ = −t/ŷ + (1 − t)/(1 − ŷ) = −2 zpětný průchod ∂L/∂z = ∂L/∂ŷ · σ′(z) = ∂L/∂ŷ · ŷ(1 − ŷ) = −2 · 0,25 = −0,5 zpětný průchod ∂L/∂p₁ = ∂L/∂p₂ = ∂L/∂b = ∂L/∂z · 1 = −0,5 zpětný průchod ∂L/∂w₁ = ∂L/∂p₁ · x₁ = −0,5 · 1 = −0,5 zpětný průchod ∂L/∂w₂ = ∂L/∂p₂ · x₂ = −0,5 · 2 = −1 krok sestupu w₁ ← 0,5 − 0,5·(−0,5) = 0,75, w₂ ← 0,2, b ← 0,35; ztráta 0,693 → 0,201
Jeden neuron jako graf operací: dopředný průchod, zpětný průchod a krok sestupu dopředný průchod zpětný průchod
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ž

  1. každý uzel v nese reálnou hodnotu, kterou značíme stejným písmenem v;
  2. uzly s rod(v) = ∅ jsou vstupy (data a parametry) a jejich hodnoty jsou dané;
  3. každý uzel v s rod(v) ≠ ∅ má diferencovatelnou funkci fv a jeho hodnota je v = fv((u)u ∈ rod(v));
  4. 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.

Laicky řečeno

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

  1. g(n−1) = (W(n))T δ(n),   po složkách gj = ∑i Wij(n) δi(n);
  2. δ(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

  1. (rekurze) pro ℓ = n − 1, n − 2, …, 1 platí g(ℓ) = (W(ℓ+1))T δ(ℓ+1),   δ(ℓ) = J(ℓ)g(ℓ) = a(ℓ) ⊙ (g(ℓ) − (a(ℓ)·g(ℓ)) 1), kde g(ℓ) = ∂L/∂a(ℓ);
  2. (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.

Laicky řečeno

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.

vstup a⁽⁰⁾ = x vrstva 1 z = Wa + b → softmax vrstva 2 z = Wa + b → softmax vrstva 3 z = Wa + b → softmax 1,000 0,500 0,398 δ −0,095 0,440 δ 0,096 0,162 δ −0,001 0,303 δ −0,237 0,357 δ 0,181 0,340 δ 0,056 0,570 δ −0,430 0,430 δ 0,430 t = 1 t = 0 L = 0,562 L = 0,147 vstup a cíl a⁽⁰⁾ = x = (1,000; 0,500), t = (1,000; 0,000) dopředný průchod z⁽1⁾ = W⁽1⁾ a⁽0⁾ + b⁽1⁾ = (0,400; 0,500; −0,500), a⁽1⁾ = softmax(z⁽1⁾) dopředný průchod z⁽2⁾ = W⁽2⁾ a⁽1⁾ + b⁽2⁾ = (0,091; 0,254; 0,206), a⁽2⁾ = softmax(z⁽2⁾) dopředný průchod z⁽3⁾ = W⁽3⁾ a⁽2⁾ + b⁽3⁾ = (0,450; 0,169), a⁽3⁾ = softmax(z⁽3⁾) dopředný průchod L = −∑ tₖ ln aₖ⁽3⁾ = −ln 0,570 = 0,562 zpětný průchod δ⁽3⁾ = a⁽3⁾ − t = (−0,430; 0,430) zpětný průchod g = (W⁽3⁾)ᵀ δ⁽3⁾ = (−0,731; 0,559; 0,215), δⱼ⁽2⁾ = aⱼ (gⱼ − a·g), a·g = 0,051 zpětný průchod g = (W⁽2⁾)ᵀ δ⁽2⁾ = (−0,215; 0,241; 0,017), δⱼ⁽1⁾ = aⱼ (gⱼ − a·g), a·g = 0,023 krok sestupu W⁽ˡ⁾ ← W⁽ˡ⁾ − η δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ, b⁽ˡ⁾ ← b⁽ˡ⁾ − η δ⁽ˡ⁾, η = 1,0; ztráta 0,562 → 0,147
Síť se softmaxem ve všech vrstvách: dopředu po vrstvách, chyby δ zpátky po vrstvách a⁽ˡ⁾ — dopředný průchod δ⁽ˡ⁾ = ∂L/∂z⁽ˡ⁾ — zpětný průchod

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í:

parametr x (bez jednotky) ztráta f(x) (bez jednotky) η = 0,1 — pomalu
parametr x (bez jednotky) ztráta f(x) (bez jednotky) η = 0,4 — rychle
parametr x (bez jednotky) ztráta f(x) (bez jednotky) η = 0,9 — kmitá
parametr x (bez jednotky) ztráta f(x) (bez jednotky) η = 1,05 — diverguje
Dvanáct kroků po parabole x² pro čtyři 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

  1. xt = (1 − 2η)t x0 pro všechna t ∈ ℕ0;
  2. xt → 0 (sestup konverguje do minima), právě když |1 − 2η| < 1, tj. právě když η < 1;
  3. 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
Celý průběh sestupu na parabole v jednom vzorci.
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.

Laicky řečeno

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:

parametr x (bez jednotky) parametr y (bez jednotky)
Tři metody v úzkém údolí: kolik kroků do ztráty pod 0,01 gradientní sestup: 36 krokůmomentum: 9 krokůAdam: 9 kroků

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
Jedna rychlost učení pro oba směry: strmý směr určuje, jak velká smí být, plochý směr pak trpí.
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.

Laicky řečeno

Čí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.

Laicky řečeno

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
Rozepsáno: vt = −η(∇Jt−1 + β∇Jt−2 + β2∇Jt−3 + …) — součet minulých gradientů se vahami, které geometricky slábnou.
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):

  1. gt = ∇J(θt−1);
  2. mt = β1mt−1 + (1 − β1)gt (průměr gradientů);
  3. st = β2st−1 + (1 − β2)gt2 (průměr čtverců gradientů);
  4. m̂t = mt/1 − β1t,   ŝt = st/1 − β2t (oprava počátečního zkreslení, viz další definice);
  5. θ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.

Laicky řečeno

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
Krok = rychlost učení × směr/typická velikost — délka kroku přestane záviset na tom, jak strmý je daný směr.
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).

Laicky řečeno

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
Průměr „přání“ několika náhodných příkladů jako odhad přání všech.
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

  1. E[g] = ∇J(θ) — odhad je nestranný;
  2. 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ů:

0.10.010.001 krok (iterace) ztráta MSE (log. měřítko)
Ztráta během 60 kroků (logaritmická osa) plný sestup SGD, dávky po 4

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:

lokální minimum globální minimum parametr x (bez jednotky) ztráta f(x) (bez jednotky)
Stejný algoritmus, jiný start, jiné dno

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.

  1. θ* je globální minimum J, právě když ∀θ ∈ ℝd : J(θ*) ≤ J(θ).
  2. θ* je lokální minimum J, právě když ∃r > 0 ∀θ ∈ ℝd : ‖θ − θ*‖ < r ⇒ J(θ*) ≤ J(θ). Lokální maximum je definováno stejně s ≥ místo ≤.
  3. Je-li J diferencovatelná, je θ* stacionární bod, právě když ∇J(θ*) = 0.
  4. θ* 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.

Agent na vašem počítači, ovládaný z telefonu