Preskočiť na obsah
coden

Gradientný zostup: ako sa model učí

Rýchlosť učenia, cik-cak v úzkych údoliach, momentum, Adam, stochastický zostup po dávkach a lokálne minimá — s animáciami skutočných trajektórií.

24 minút Matěj Žalmánek 2026-10-15

Séria Základy AI Diel 11 z 52
  1. Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
  2. Stručná história umelej inteligencie: od Turinga po jazykové modely
  3. Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
  4. Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
  6. Funkcie a zobrazenia: prečo je každý model v AI funkcia
  7. Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
  8. Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
  9. Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
  10. Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
  11. Gradientný zostup: ako sa model učí
  12. Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
  13. Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
  14. Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
  15. Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
  16. Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
  17. Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
  18. Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
  19. Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
  20. Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
  21. Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
  22. Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
  23. Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
  24. Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
  25. Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
  26. Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
  27. Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
  28. Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
  29. Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
  30. Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
  31. Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
  32. Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
  33. Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
  34. Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
  35. Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
  36. Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
  38. Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
  39. Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
  40. Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
  41. Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
  42. Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
  43. Prompty, kontext a RAG: ako modelu dať správne informácie
  44. Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
  45. Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
  46. Difúzne modely: ako sa z čistého šumu stane obrázok
  47. Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
  48. Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
  49. Policy gradient a PPO: učenie priamo stratégie
  50. Ako funguje AI agent: jazykový model v slučke s nástrojmi
  51. Programovanie s AI agentmi: zadanie, testy a kontrola
  52. Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť

Celá osnova série Hotovo: 52 z 83 tém

Čo si odnesiete
  • Ako funguje gradientný zostup a prečo na rýchlosti učenia záleží najviac.
  • Prečo obyčajný zostup v úzkom údolí cik-cakuje a ako to rieši momentum a Adam.
  • Prečo sa siete učia po malých náhodných dávkach a čo znamenajú lokálne minimá a sedlá.

Čo sa hodí vedieť vopred: Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť

V predchádzajúcich dieloch sme si pripravili všetko potrebné: model je funkcia s parametrami, stratová funkcia je krajina nad priestorom parametrov a gradient ukazuje najstrmší smer do kopca. Teraz to spojíme do algoritmu, ktorým sa učí takmer každá neurónová sieť na svete — gradientného zostupu. Jeho myšlienka sa zmestí do jednej vety a jeho detaily rozhodujú, či sa model naučí za hodinu, za týždeň, alebo vôbec.

1. Myšlienka: z kopca v hmle

Definícia — gradientný zostup

Nech d ∈ ℕ, d ≥ 1, a J : ℝd → ℝ je diferencovateľná stratová funkcia s gradientom ∇J : ℝd → ℝd, ∇J(θ) = (∂J/∂θ1(θ), …, ∂J/∂θd(θ)) (pozri diel o deriváciách a gradiente).

Gradientný zostup je algoritmus:

  • vstup: počiatočné parametre θ0 ∈ ℝd, rýchlosť učenia η ∈ ℝ, η > 0, tolerancia ε > 0 a najväčší počet krokov T ∈ ℕ;
  • výstup: parametre θt ∈ ℝd v okamihu zastavenia.
  1. Polož t = 0.
  2. Ak ‖∇J(θt)‖ < ε alebo t = T, zastav a vráť θt.
  3. Polož θt+1 = θt − η ∇J(θt), zväčši t o 1 a pokračuj krokom 2.

Algoritmus teda opakovane posúva parametre o η-násobok gradientu proti jeho smeru, kým nie je gradient takmer nulový alebo kým sa neminú kroky.

Laicky povedané

Stojíte v hustej hmle na kopci a chcete dole do údolia. Nevidíte nič, len nohami cítite sklon. Urobíte krok tam, kde to klesá najviac, a znova sa rozhliadnete. Gradient je ten sklon, rýchlosť učenia je dĺžka kroku. Nič viac v tom nie je.

θt+1 = θt − η ∇J(θt)

θt+1
nové parametre — vektor všetkých váh a biasov modelu po jednom kroku
θt
súčasné parametre — každý krok len opravuje to, čo už máme; učenie je postupné spresňovanie, nie výpočet výsledku naraz
−
gradient ukazuje smer najstrmšieho stúpania straty; my chceme stratu zmenšiť, preto ideme opačne
η
rýchlosť učenia — gradient opisuje krajinu len v tesnom okolí bodu, takže smieme urobiť len obmedzený krok; η určuje, aký dlhý
∇J(θt)
gradient straty v súčasnom bode — vektor parciálnych derivácií ∂J/∂θi; každá zložka hovorí, nakoľko a ktorým smerom daný parameter stratu zhoršuje
Každý parameter sa posunie úmerne tomu, nakoľko od neho strata závisí, a proti smeru, ktorým ju zväčšuje.

Ako algoritmus aj s podmienkou, kedy prestať (ε je malá tolerancia, napr. 10−6):

def gradientni_sestup(grad_J, theta, eta, max_kroku, eps):
    for t in range(max_kroku):
        g = grad_J(theta)             # gradient v súčasnom bode
        if norma(g) < eps:            # takmer rovina: sme (takmer) v stacionárnom bode
            break
        theta = theta - eta * g       # krok proti gradientu, všetky zložky naraz
    return theta

2. Odkiaľ sa berie gradient: dopredný a spätný prechod

Pravidlo θ ← θ − η∇J(θ) predpokladá, že gradient máme. Model s miliónmi parametrov ho však nemôže počítať numericky — to by znamenalo dva prechody sieťou pre každý parameter zvlášť. Gradient sa počíta spätným šírením chyby (backpropagation): model sa rozloží na elementárne operácie, výpočtový graf, a každá operácia vie len dve veci — vypočítať výstup zo vstupov a povedať, ako výstup závisí od každého vstupu (svoju lokálnu deriváciu).

Ukážeme to na jednom neuróne: dva vstupy, súčtová bázová funkcia z = w1x1 + w2x2 + b, logistická aktivácia ŷ = σ(z) a strata binárna krížová entropia pre cieľ t = 1. Škatuľky sú operácie. Zeleno tečú hodnoty dopredu, oranžovo gradienty späť; dole je vzorec práve vykonávaného kroku. Animáciu si môžete zastaviť a prejsť tlačidlami 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 parametre x₁ = 1, x₂ = 2, t = 1; w₁ = 0,5, w₂ = −0,3, b = 0,1; η = 0,5 dopredný prechod p₁ = w₁ · x₁ = 0,5 · 1 = 0,5 dopredný prechod p₂ = w₂ · x₂ = −0,3 · 2 = −0,6 dopredný prechod z = p₁ + p₂ + b = 0,5 + (−0,6) + 0,1 = 0 dopredný prechod ŷ = σ(z) = 1 / (1 + e^(−z)) = 0,5 dopredný prechod L = −t ln ŷ − (1 − t) ln(1 − ŷ) = 0,693 spätný prechod ∂L/∂ŷ = −t/ŷ + (1 − t)/(1 − ŷ) = −2 spätný prechod ∂L/∂z = ∂L/∂ŷ · σ′(z) = ∂L/∂ŷ · ŷ(1 − ŷ) = −2 · 0,25 = −0,5 spätný prechod ∂L/∂p₁ = ∂L/∂p₂ = ∂L/∂b = ∂L/∂z · 1 = −0,5 spätný prechod ∂L/∂w₁ = ∂L/∂p₁ · x₁ = −0,5 · 1 = −0,5 spätný prechod ∂L/∂w₂ = ∂L/∂p₂ · x₂ = −0,5 · 2 = −1 krok zostupu w₁ ← 0,5 − 0,5·(−0,5) = 0,75, w₂ ← 0,2, b ← 0,35; strata 0,693 → 0,201
Jeden neurón ako graf operácií: dopredný prechod, spätný prechod a krok zostupu dopredný prechod spätný prechod
Definícia — výpočtový graf, dopredný a spätný prechod

Nech G = (U, H) je orientovaný acyklický graf s konečnou množinou uzlov U a množinou hrán H ⊆ U × U; hranu (u, v) ∈ H píšeme u → v. Pre v ∈ U označme rod(v) = {u ∈ U : u → v} množinu jeho rodičov. G je výpočtový graf práve vtedy, keď

  1. každý uzol v nesie reálnu hodnotu, ktorú označujeme rovnakým písmenom v;
  2. uzly s rod(v) = ∅ sú vstupy (dáta a parametre) a ich hodnoty sú dané;
  3. každý uzol v s rod(v) ≠ ∅ má diferencovateľnú funkciu fv a jeho hodnota je v = fv((u)u ∈ rod(v));
  4. jeden vyznačený uzol L ∈ U je strata.

Topologické poradie je očíslovanie U = {v1, …, vN} také, že vi → vj ⇒ i < j (v acyklickom grafe vždy existuje).

Dopredný prechod vypočíta hodnoty v1, …, vN v tomto poradí podľa bodu 3 — každý uzol až po všetkých svojich rodičoch.

Spätný prechod vypočíta pre každý uzol u ∈ U jeho adjungovanú hodnotu ū = ∂L/∂u v obrátenom poradí vN, …, v1: položí L̄ = 1 a pre u ≠ L použije viacrozmerné reťazové pravidlo

ū = ∑v : u → v v̄ · ∂fv/∂u

(prázdny súčet je 0). Spätný prechod teda pre každý uzol sčíta príspevky zo všetkých uzlov, do ktorých u vstupuje; každá hrana sa pritom použije práve raz.

Lokálne derivácie operácií z obrázka

Všetky veličiny sú reálne čísla: p1, p2, b, w, x, z ∈ ℝ, cieľ t ∈ {0, 1} a výstup ŷ ∈ (0, 1).

Súčet z = p1 + p2 + b: ∂z/∂p1 = ∂z/∂p2 = ∂z/∂b = 1 — súčet pošle gradient do všetkých vstupov bez zmeny.

Súčin p = wx: ∂p/∂w = x a ∂p/∂x = w — gradient sa vynásobí druhým činiteľom.

Logistická funkcia σ : ℝ → (0, 1), σ(z) = 1/1 + e−z: σ′(z) = e−z/(1 + e−z)2 = σ(z)(1 − σ(z)) = ŷ(1 − ŷ), kde ŷ = σ(z).

Krížová entropia L = −t ln ŷ − (1 − t) ln(1 − ŷ): ∂L/∂ŷ = −t/ŷ + 1 − t/1 − ŷ.

Veta — chyba neurónu je ŷ − t

Nech t ∈ {0, 1}, z ∈ ℝ, ŷ = σ(z) je logistická funkcia a L = −t ln ŷ − (1 − t) ln(1 − ŷ) krížová entropia. Potom

∂L/∂z = ŷ − t.

Dôkaz. Reťazové pravidlo cez ŷ: ∂L/∂z = ∂L/∂ŷ · ∂ŷ/∂z = (−t/ŷ + 1 − t/1 − ŷ) · ŷ(1 − ŷ) = −t(1 − ŷ) + (1 − t)ŷ = ŷ − t. ∎

Na obrázku: ∂L/∂z = 0,500 − 1 = −0,500. Delenie ŷ a násobenie ŷ(1 − ŷ) sa navzájom skrátia — preto sa krížová entropia páruje s logistickou funkciou (a ako uvidíte, aj so softmaxom).

Veta — spätný prechod je lacný

Nech G = (U, H) je výpočtový graf s E = |H| hranami, v ktorom každý uzol ovplyvňuje stratu (z každého uzla vedie cesta do L), a nech každú hodnotu fv aj každú lokálnu deriváciu ∂fv/∂u možno vypočítať v konštantnom čase. Potom spätný prechod vypočíta všetky adjungované hodnoty ū, u ∈ U — medzi nimi všetky derivácie ∂L/∂θi podľa parametrov — v čase O(E), teda v rovnakom ráde ako dopredný prechod a nezávisle od počtu parametrov.

Dôkaz. Vo vzorci pre ū sa každá hrana u → v objaví v súčte práve raz, súčty dohromady teda majú E členov. Každý uzol okrem L má aspoň jednu odchádzajúcu hranu, takže |U| ≤ E + 1 a aj práca na jednotlivých uzloch je O(E). ∎

Numerická derivácia L(θ + hei) − L(θ − hei)/2h (ei je i-tý jednotkový vektor, h > 0 malé číslo) by potrebovala dva dopredné prechody na každý parameter — pri sieti s miliardou parametrov dve miliardy prechodov namiesto jedného spätného.

Laicky povedané

Dopredu sa počíta, čo sieť odpovie. Dozadu sa počíta, kto za chybu môže a koľko: strata pošle „výčitku“ 1 do poslednej škatuľky, tá ju vynásobí tým, ako citlivo reaguje na svoj vstup, a pošle ďalej. Súčet výčitku rozdelí všetkým rovnako, súčin ju pošle každému vstupu vynásobenú tým druhým. Keď výčitka dôjde k parametru, je to presne jeho zložka gradientu.

Po jednom kroku s η = 0,5 sa parametre posunú proti gradientu na w1 = 0,75, w2 = 0,2, b = 0,35 a strata klesne z 0,693 na 0,201. Všimnite si, že najviac sa pohla váha w2: jej vstup x2 = 2 je najväčší, takže od nej výsledok najviac závisí.

3. Príklad: spätné šírenie sieťou so softmaxom vo všetkých vrstvách

Skutočná sieť je len väčší výpočtový graf. Operácie sa zoskupia po vrstvách a namiesto čísel tečú vektory. Vezmeme sieť, v ktorej má každý neurón súčtovú bázovú funkciu a každá vrstva aktiváciu softmax, a odvodíme spätné šírenie všeobecne pre n vrstiev: najprv chybu poslednej vrstvy, potom vrstvy n − 1 a nakoniec rekurziu, ktorá funguje pre ľubovoľne hlbokú sieť. Potom všetko prepočítame na konkrétnych číslach.

Softmax v skrytých vrstvách sa v praxi takmer nepoužíva — skryté vrstvy mávajú ReLU a softmax býva len na výstupe. Na ukážku je však výborný: jeho derivácia je plná matica, pretože každý výstup závisí od všetkých vstupov vrstvy. Je tak dobre vidieť, čo spätné šírenie robí, keď aktivácia neuróny medzi sebou mieša.

Definícia — sieť, strata a chyba vrstvy

Pre m ∈ ℕ, m ≥ 1, je softmax funkcia softmax : ℝm → (0, 1)m daná po zložkách (pozri diel o softmaxe)

softmax(z)i = ezi/∑k=1m ezk,   i = 1, …, m.

Nech n ∈ ℕ, n ≥ 1, je počet vrstiev, d0, d1, …, dn ≥ 1 sú šírky vrstiev, x ∈ ℝd0 je vstup a pre ℓ = 1, …, n sú W(ℓ) ∈ ℝdℓ×dℓ−1 váhy a b(ℓ) ∈ ℝdℓ biasy vrstvy ℓ. Sieť so softmaxom vo všetkých vrstvách počíta a(0) = x a pre ℓ = 1, …, n

z(ℓ) = W(ℓ)a(ℓ−1) + b(ℓ) ∈ ℝdℓ,   a(ℓ) = softmax(z(ℓ)) ∈ (0, 1)dℓ,

po zložkách zi(ℓ) = ∑j=1dℓ−1 Wij(ℓ)aj(ℓ−1) + bi(ℓ) pre i = 1, …, dℓ (súčtová bázová funkcia).

Cieľ je vektor t ∈ {0, 1}dn s ∑k tk = 1 (jediná jednotka na pozícii správnej triedy) a strata je krížová entropia

L = −∑k=1dn tk ln ak(n).

Chyba vrstvy ℓ ∈ {1, …, n} je vektor

δ(ℓ) = ∂L/∂z(ℓ) ∈ ℝdℓ,   t. j. δi(ℓ) = ∂L/∂zi(ℓ).

Chyba vrstvy teda hovorí, ako strata závisí od vstupu aktivácie; z nej sa potom dajú prečítať gradienty váh aj biasov.

Lema 1 — Jacobiho matica softmaxu

Nech m ∈ ℕ, m ≥ 1, z ∈ ℝm a a = softmax(z). Pre i, j ∈ {1, …, m} označme δij Kroneckerovo delta (δij = 1 pre i = j, inak 0). Potom pre všetky i, j ∈ {1, …, m}

∂ai/∂zj = ai(δij − aj),

maticovo

J = ∂a/∂z = diag(a) − aaT ∈ ℝm×m.

Dôkaz. Označme S = ∑k=1m ezk, takže ∂S/∂zj = ezj. Podľa pravidla pre podiel

pre i = j: ∂ai/∂zi = eziS − eziezi/S2 = ai − ai2,

pre i ≠ j: ∂ai/∂zj = −eziezj/S2 = −aiaj. ∎

Dve vlastnosti budeme potrebovať: J je symetrická a každý jej riadok (aj stĺpec) má súčet nula, pretože ∑j ai(δij − aj) = ai − ai∑jaj = 0.

Veta 2 — chyba poslednej vrstvy: δ⁽ⁿ⁾ = a⁽ⁿ⁾ − t

Nech sieť, cieľ t a strata L sú ako v definícii vyššie. Potom

δ(n) = a(n) − t.

Dôkaz. Píšeme a = a(n), z = z(n). Strata závisí od a ako ∂L/∂ai = −ti/ai. Každé zj ovplyvní všetky ai, takže sa sčítava cez i a použije sa lema 1:

δj(n) = ∑i ∂L/∂ai · ∂ai/∂zj = ∑i (−ti/ai) · ai(δij − aj) = −tj + aj ∑i ti = aj − tj,

pretože ∑i ti = 1. ∎

Je to rovnaký tvar ako ŷ − t pri jednom neuróne: logaritmus v strate zruší exponenciálu v softmaxe a z celej Jacobiho matice zostane rozdiel „čo sieť povedala“ mínus „čo mala povedať“.

Veta 3 — chyba vrstvy n − 1

Nech n ≥ 2, sieť, cieľ a strata sú ako v definícii vyššie a J(n−1) = diag(a(n−1)) − a(n−1)(a(n−1))T je Jacobiho matica softmaxu vrstvy n − 1 (lema 1). Označme g(n−1) = ∂L/∂a(n−1) ∈ ℝdn−1. Potom

  1. g(n−1) = (W(n))T δ(n),   po zložkách gj = ∑i Wij(n) δi(n);
  2. δ(n−1) = J(n−1) g(n−1),   po zložkách δj(n−1) = aj (gj − a·g),

kde a = a(n−1), g = g(n−1) a a·g = ∑i aigi je priemer g vážený aktiváciami vrstvy (váhy ai sú kladné a dávajú súčet 1).

Dôkaz. Najprv gradient podľa výstupov vrstvy n − 1. Keďže zi(n) = ∑j Wij(n)aj(n−1) + bi(n), je ∂zi(n)/∂aj(n−1) = Wij(n) a podľa reťazového pravidla gj = ∑i ∂L/∂zi(n) · Wij(n) = ∑i Wij(n) δi(n), čo je bod 1.

Chyba sa teda vracia po tých istých váhach, ktorými signál šiel dopredu, len v opačnom smere — odtiaľ transpozícia. Potom prejde späť softmaxom vrstvy n − 1; podľa lemy 1 a vďaka symetrii J:

δj(n−1) = ∑i gi ∂ai/∂zj = ∑i ai(δij − aj)gi = ajgj − aj ∑i aigi = aj (gj − a·g),

čo je bod 2. ∎

Výklad: neurón dostane chybu úmernú tomu, o koľko je „jeho“ gradient gj nad váženým priemerom celej vrstvy, a navyše vynásobenú svojou aktiváciou. Softmax nerozlišuje absolútnu úroveň, len pomery — preto sa odčítava priemer.

Veta 4 — rekurzia pre ľubovoľnú vrstvu a gradienty parametrov

Nech sieť, cieľ a strata sú ako v definícii vyššie, J(ℓ) je Jacobiho matica softmaxu vrstvy ℓ (lema 1), ⊙ označuje násobenie po zložkách a 1 vektor jednotiek. Potom

  1. (rekurzia) pre ℓ = n − 1, n − 2, …, 1 platí g(ℓ) = (W(ℓ+1))T δ(ℓ+1),   δ(ℓ) = J(ℓ)g(ℓ) = a(ℓ) ⊙ (g(ℓ) − (a(ℓ)·g(ℓ)) 1), kde g(ℓ) = ∂L/∂a(ℓ);
  2. (gradienty parametrov) pre ℓ = 1, …, n, i = 1, …, dℓ a j = 1, …, dℓ−1 platí ∂L/∂Wij(ℓ) = δi(ℓ) aj(ℓ−1),   t. j. ∂L/∂W(ℓ) = δ(ℓ)(a(ℓ−1))T,   ∂L/∂b(ℓ) = δ(ℓ).

Dôkaz. (1) Úvaha z vety 3 nikde nevyužila, že vrstva n je posledná — len to, že z(ℓ+1) závisí od a(ℓ) lineárne s maticou W(ℓ+1) a že a(ℓ) = softmax(z(ℓ)). Rozpísané cez všetky vrstvy:

δ(ℓ) = J(ℓ)(W(ℓ+1))T J(ℓ+1)(W(ℓ+2))T ⋯ J(n−1)(W(n))T (a(n) − t).

(2) Váha Wij(ℓ) ovplyvní len zi(ℓ), a to s deriváciou ∂zi(ℓ)/∂Wij(ℓ) = aj(ℓ−1); bias bi(ℓ) s deriváciou 1. Reťazové pravidlo dá ∂L/∂Wij(ℓ) = δi(ℓ) · aj(ℓ−1) a ∂L/∂bi(ℓ) = δi(ℓ). ∎

Gradient váhy je teda „chyba neurónu, do ktorého váha vedie, krát aktivita neurónu, z ktorého vedie“. Váha z neaktívneho neurónu sa neučí.

Dôsledok 5 — súčet chýb vo vrstve je nula

Nech sieť, cieľ a strata sú ako v definícii vyššie. Potom pre každú vrstvu ℓ ∈ {1, …, n} platí

∑j=1dℓ δj(ℓ) = 0,   a teda aj   ∑j=1dℓ ∂L/∂bj(ℓ) = 0.

Dôkaz. Pre ℓ = n: ∑(aj − tj) = 1 − 1 = 0. Pre skryté vrstvy: 1Tδ(ℓ) = 1TJ(ℓ)g(ℓ) = 0, pretože stĺpce J majú súčet nula (lema 1). ∎

Dôvod je hlbší: softmax sa nezmení, keď ku všetkým zi vo vrstve pripočítate rovnaké číslo. V smere (1, 1, …, 1) je teda strata plochá a gradient doň nemôže ukazovať.

Veta 6 — softmaxová vrstva chybu aspoň zmenší na polovicu

Nech m ≥ 1, a ∈ (0, 1)m s ∑i ai = 1 (výstup softmaxu) a J = diag(a) − aaT. Potom všetky vlastné čísla J ležia v intervale [0, 1/2], a preto pre každé g ∈ ℝm platí

‖Jg‖ ≤ 1/2 ‖g‖.

Dôkaz. J je symetrická, takže má reálne vlastné čísla. Riadok i má na diagonále ai(1 − ai) a mimo nej čísla −aiaj, ktorých absolútne hodnoty dajú dohromady ai(1 − ai). Podľa Geršgorinovej vety leží každé vlastné číslo v niektorom intervale [0, 2ai(1 − ai)] a 2a(1 − a) ≤ 1/2 pre každé a ∈ ℝ. Pre symetrickú maticu je ‖Jg‖ ≤ max |λ| · ‖g‖, kde maximum je cez vlastné čísla λ. ∎

Každá softmaxová vrstva teda chybu cestou späť aspoň zmenší na polovicu (ak ju váhy nezosilnia). To je jeden z dôvodov, prečo sa softmax do skrytých vrstiev nedáva: v hlbokej sieti by gradient k prvým vrstvám takmer nedošiel. Uvidíte to aj v príklade.

Laicky povedané

Posledná vrstva má to najjednoduchšie: jej chyba je jednoducho „čo sieť povedala mínus čo mala povedať“. Každá ďalšia vrstva dozadu dostane chybu od vrstvy nad sebou, poslanú po tých istých váhach ako signál, len obrátene, a potom ju prefiltruje cez deriváciu svojej aktivácie. Pri softmaxe ten filter odčíta priemer a vynásobí aktivitou neurónu. Gradient každej váhy je nakoniec súčin dvoch čísel, ktoré už máme: chyby na jej konci a aktivity na jej začiatku.

Na číslach: sieť 2 → 3 → 3 → 2

Vstup x = 1,00,5, správna trieda je prvá, t = 10. Tri vrstvy (n = 3) so softmaxom, 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 cieľ a⁽⁰⁾ = x = (1,000; 0,500), t = (1,000; 0,000) dopredný prechod z⁽1⁾ = W⁽1⁾ a⁽0⁾ + b⁽1⁾ = (0,400; 0,500; −0,500), a⁽1⁾ = softmax(z⁽1⁾) dopredný prechod z⁽2⁾ = W⁽2⁾ a⁽1⁾ + b⁽2⁾ = (0,091; 0,254; 0,206), a⁽2⁾ = softmax(z⁽2⁾) dopredný prechod z⁽3⁾ = W⁽3⁾ a⁽2⁾ + b⁽3⁾ = (0,450; 0,169), a⁽3⁾ = softmax(z⁽3⁾) dopredný prechod L = −∑ tₖ ln aₖ⁽3⁾ = −ln 0,570 = 0,562 spätný prechod δ⁽3⁾ = a⁽3⁾ − t = (−0,430; 0,430) spätný prechod g = (W⁽3⁾)ᵀ δ⁽3⁾ = (−0,731; 0,559; 0,215), δⱼ⁽2⁾ = aⱼ (gⱼ − a·g), a·g = 0,051 spätný prechod g = (W⁽2⁾)ᵀ δ⁽2⁾ = (−0,215; 0,241; 0,017), δⱼ⁽1⁾ = aⱼ (gⱼ − a·g), a·g = 0,023 krok zostupu W⁽ˡ⁾ ← W⁽ˡ⁾ − η δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ, b⁽ˡ⁾ ← b⁽ˡ⁾ − η δ⁽ˡ⁾, η = 1,0; strata 0,562 → 0,147
Sieť so softmaxom vo všetkých vrstvách: dopredu po vrstvách, chyby δ späť po vrstvách a⁽ˡ⁾ — dopredný prechod δ⁽ˡ⁾ = ∂L/∂z⁽ˡ⁾ — spätný prechod

Dopredný prechod. Každá vrstva vypočíta súčtovú bázovú funkciu a potom 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)

Napríklad prvá zložka prvej 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. Sieť dáva správnej triede pravdepodobnosť 0,570, takže strata je L = −ln 0,570 = 0,562.

Posledná vrstva (ℓ = 3). Podľa vety 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äčši z1“: krok zostupu odčíta záporný gradient, takže váhy do správneho výstupu porastú a váhy do nesprávneho klesnú. Súčet zložiek je nula (dôsledok 5).

Vrstva n − 1 (ℓ = 2). Podľa vety 3 najprv pošleme chybu späť po váhach:

g(2) = (W(3))Tδ(3) = 1,2−0,5−0,70,60,40,9 −0,4300,430 = −0,7310,5590,215,

napríklad g1 = 1,2 · (−0,430) + (−0,5) · 0,430 = −0,731. Potom softmaxom vrstvy 2. Jacobiho matica a vážený priemer sú

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 teda δ(2) = J(2)g(2) = −0,2370,1810,056; napríklad δ1(2) = 0,303 · (−0,731 − 0,051) = −0,237. Gradient váh:

∂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. Tá istá rekurzia o vrstvu nižšie (veta 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.

Veľkosť chyby cestou dozadu klesá: ‖δ(3)‖ = 0,608, ‖δ(2)‖ = 0,304, ‖δ(1)‖ = 0,135 — presne ako predpovedá veta 6. Váhy prvej vrstvy sa preto učia najpomalšie.

Kontrola a krok. Spätné šírenie je len reťazové pravidlo, a dá sa preto overiť numericky: centrálna diferencia L(W11(1) + h) − L(W11(1) − h)/2h s h = 10−6 dá −0,094798 a spätný prechod −0,094798. Jeden krok zostupu s η = 1,0 (všetky váhy a biasy naraz, W(ℓ) ← W(ℓ) − η ∂L/∂W(ℓ)) zníži stratu z 0,562 na 0,147 a pravdepodobnosť správnej triedy stúpne z 0,570 na 0,863.

4. Rýchlosť učenia: aký dlhý krok

Dĺžka kroku je najdôležitejšia voľba celého algoritmu. Ukážeme to na najjednoduchšej krajine, parabole J(x) = x2, so štartom v x = 4. Derivácia je 2x, takže každý krok urobí x ← x − η · 2x = (1 − 2η)x. Dvanásť krokov pre štyri rôzne rýchlosti učenia:

parameter x (bez jednotky) strata f(x) (bez jednotky) η = 0,1 — pomaly
parameter x (bez jednotky) strata f(x) (bez jednotky) η = 0,4 — rýchlo
parameter x (bez jednotky) strata f(x) (bez jednotky) η = 0,9 — kmitá
parameter x (bez jednotky) strata f(x) (bez jednotky) η = 1,05 — diverguje
Dvanásť krokov po parabole x² pre štyri rýchlosti učenia
  • η = 0,1 — každý krok skráti vzdialenosť od minima len o pätinu. Po dvanástich krokoch je loptička len v x ≈ 0,27.
  • η = 0,4 — každý krok ju skráti päťkrát; po pár krokoch je loptička prakticky na dne.
  • η = 0,9 — krok je taký dlhý, že loptička preskočí na druhú stranu. Napriek tomu sa blíži, pretože skáče stále kratšie oblúky.
  • η = 1,05 — preskočí zakaždým ďalej, než bola: namiesto dole letí von a po dvanástich krokoch je v x ≈ 12,55. Učenie diverguje.
Veta — kedy zostup na parabole konverguje

Nech J : ℝ → ℝ, J(x) = x2, štart x0 ∈ ℝ, x0 ≠ 0, rýchlosť učenia η > 0 a xt+1 = xt − ηJ′(xt) pre t = 0, 1, 2, … Potom

  1. xt = (1 − 2η)t x0 pre všetky t ∈ ℕ0;
  2. xt → 0 (zostup konverguje do minima) práve vtedy, keď |1 − 2η| < 1, t. j. práve vtedy, keď η < 1;
  3. pre η = 0,5 je x1 = 0 — zostup skončí v minime jediným krokom.

Dôkaz. Jeden krok je xt+1 = xt − η · 2xt = (1 − 2η)xt; indukciou dostaneme mocninu. Postupnosť qt ide k nule práve pre |q| < 1. ∎

xt = (1 − 2η)t x0

xt
poloha po t krokoch — zároveň vzdialenosť od minima v nule
1 − 2η
koeficient jedného kroku — číslo 2 je druhá derivácia (zakrivenie) paraboly; o koľko krok skráti vzdialenosť, závisí od súčinu rýchlosti učenia a zakrivenia. Záporný koeficient znamená preskok na druhú stranu
t
počet krokov — koeficient sa násobí v každom kroku znova, preto vzdialenosť klesá (alebo rastie) geometricky
x0
štart — výsledok je mu úmerný: dvakrát ďalej od minima znamená dvakrát ďalej aj po t krokoch
Celý priebeh zostupu na parabole v jednom vzorci.
Príklad — čísla z obrázka

η = 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äťkrát bližšie

η = 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

Veta — všeobecná hranica pre rýchlosť učenia

(1) Nech a > 0, J : ℝ → ℝ, J(x) = ax2/2 (druhá derivácia je a), η > 0 a x0 ≠ 0. Potom krok zostupu je x ← (1 − ηa)x a zostup konverguje do minima 0 práve vtedy, keď

0 < η < 2/a.

Parabola x2 má a = 2, odtiaľ hranica 1.

(2) Všeobecne: nech J : ℝd → ℝ je diferencovateľná a jej gradient má Lipschitzovu konštantu L > 0, t. j. ‖∇J(u) − ∇J(v)‖ ≤ L‖u − v‖ pre všetky u, v ∈ ℝd (zakrivenie nikde neprekročí L), a nech 0 < η ≤ 1/L. Potom J(θt+1) ≤ J(θt) pre každé t — strata v žiadnom kroku nevzrastie (štandardný výsledok, pozri napr. Nesterov: Introductory Lectures on Convex Optimization, 2004, odd. 1.2.3). Rýchlosť učenia sa teda musí riadiť najstrmším zakrivením krajiny.

Laicky povedané

Malý krok je bezpečný, ale pomalý. Veľký krok je rýchly, kým neprestrelí. Príliš veľký krok učenie rozbije: chyba namiesto klesania rastie, až z nej je nekonečno.

5. Úzke údolia a cik-cak

Skutočné krajiny nie sú okrúhle misy. Bývajú to dlhé úzke údolia — v jednom smere strmé, v druhom takmer rovné. Vezmime J(x, y) = x2/2 + 10y2, v smere y dvadsaťkrát strmšiu. Obyčajný zostup tu má problém: rýchlosť učenia musí byť malá kvôli strmému smeru (inak by v y divergoval), a s takým malým krokom sa v plochom smere x sotva hýbe. Navyše v smere y stále preskakuje zo strany na stranu:

parameter x (bez jednotky) parameter y (bez jednotky)
Tri metódy v úzkom údolí: koľko krokov do straty pod 0,01 gradientný zostup: 36 krokovmomentum: 9 krokovAdam: 9 krokov

Každá metóda má svoju najlepšiu rýchlosť učenia, nájdenú skúšaním. Aj tak potrebuje obyčajný zostup 36 krokov a cik-cakuje, zatiaľ čo momentum a Adam sú dole za 9. Prečo, ukážu ďalšie dve kapitoly.

Prečo obyčajný zostup v údolí cik-cakuje

Gradient údolia je ∇J(x, y) = (x, 20y) — každá súradnica má vlastné zakrivenie, 1 v smere x a 20 v smere y. Krok zostupu sa preto rozpadne na dva nezávislé kroky, ako pri parabole vyššie:

x ← (1 − η · 1) x,   y ← (1 − η · 20) y

x
súradnica pozdĺž dna údolia — tu je krajina takmer plochá
1 − η · 1
koeficient v plochom smere — malé zakrivenie 1 dá koeficient blízky 1, takže sa x v každom kroku zmenší len o kúsok
y
súradnica naprieč údolím — strmé steny
1 − η · 20
koeficient v strmom smere — zakrivenie 20 ho rýchlo stiahne pod nulu; aby jeho absolútna hodnota zostala pod 1, musí byť η < 2/20 = 0,1
Jedna rýchlosť učenia pre oba smery: strmý smer určuje, aká veľká smie byť, plochý smer potom trpí.
Definícia — číslo podmienenosti

Nech d ≥ 1 a A ∈ ℝd×d je symetrická pozitívne definitná matica; jej vlastné čísla sú reálne a kladné, označme λmin > 0 najmenšie a λmax najväčšie z nich. Číslo podmienenosti matice A je

κ = λmax/λmin ≥ 1,

pomer najväčšieho a najmenšieho vlastného čísla. Pre kvadratickú stratu J : ℝd → ℝ, J(θ) = 1/2 θTAθ, sú vlastné čísla A zakrivenia v hlavných smeroch a číslo podmienenosti straty je číslo podmienenosti A. Naše údolie má A = diag(1, 20), teda κ = 20.

Pre túto stratu platí (štandardný výsledok): gradientný zostup s rýchlosťou učenia η konverguje z každého štartu práve vtedy, keď 0 < η < 2/λmax. Aj s najlepšou pevnou voľbou η = 2/λmin + λmax platí len ‖θt+1‖ ≤ κ − 1/κ + 1 ‖θt‖ (minimum je v θ = 0) — u nás 19/21 ≈ 0,905. Čím väčšie κ, tým bližšie je tento koeficient k 1 a tým pomalší zostup.

Laicky povedané

Číslo podmienenosti hovorí, koľkokrát je najstrmší smer strmší než najplochší. Okrúhla misa má 1 a zostup ide priamo dole. Údolie s číslom 20 je dvadsaťkrát „pretiahnutejšie“ a zostup v ňom stráca čas.

Príklad — odkiaľ je 36 krokov

η = 0,09:   x ← 0,91 · x,   y ← (−0,8) · y   (farby podľa vzorca vyššie)

štart (−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)

Znamienko y sa strieda (koeficient je záporný) — to je ten cik-cak; |y| klesá 1,25-krát za krok, x len 1,1-krát.

Strata pod 0,01 vyžaduje hlavne x2/2 < 0,01, teda |x| < √0,02 ≈ 0,141:

4 · 0,91t < 0,141   ⇔   t > ln 0,141/4/ln 0,91 ≈ 35,4,   teda 36 krokov.

6. Momentum: guľa so zotrvačnosťou

Definícia — zostup s momentom

Nech J : ℝd → ℝ je diferencovateľná stratová funkcia, θ0 ∈ ℝd počiatočné parametre, η > 0 rýchlosť učenia a β ∈ [0, 1) koeficient momentu. Zostup s momentom položí v0 = 0 ∈ ℝd a pre t = 0, 1, 2, … počíta

vt+1 = β vt − η ∇J(θt),   θt+1 = θt + vt+1;

zastaví sa rovnako ako gradientný zostup (malý gradient alebo vyčerpaný počet krokov). Vektor vt ∈ ℝd je „rýchlosť“ a β hovorí, koľko z nej zostane do ďalšieho kroku (typicky 0,9; v našom údolí najlepšie 0,6). Pre β = 0 ide o obyčajný gradientný zostup.

Laicky povedané

Namiesto opatrného chodca ťažká guľa. Kde gradient mieri stále rovnako (pozdĺž údolia), guľa naberá rýchlosť. Kde sa smer strieda (cez údolie), sa pohyby tam a späť navzájom vyrušia. Cik-cak sa utlmí a guľa sa rozbehne dole.

vt+1 = β vt − η ∇J(θt)

vt+1
nová rýchlosť — o toľko sa parametre posunú v tomto kroku (θt+1 = θt + vt+1)
β
„nedokonalé trenie“ — koľko z minulej rýchlosti zostane; musí byť menšie než 1, inak by sa staré gradienty nikdy nezabudli a guľa by nezastala
vt
minulá rýchlosť — pamäť predchádzajúcich krokov; vďaka nej sa kroky rovnakým smerom sčítavajú a kroky tam a späť rušia
η ∇J(θt)
obyčajný krok zostupu — „sila“, ktorá guľu v tomto bode postrčí z kopca
Rozpísané: vt = −η(∇Jt−1 + β∇Jt−2 + β2∇Jt−3 + …) — súčet minulých gradientov s váhami, ktoré geometricky slabnú.
Veta — momentum predĺži krok až 1/1 − β-krát

Nech η > 0, β ∈ [0, 1), g ∈ ℝd a gradient je počas zostupu stále rovnaký, ∇J(θt) = g pre všetky t (rovný svah), a v0 = 0. Potom pre každé t ≥ 1

vt = −ηg(1 + β + … + βt−1) = −ηg 1 − βt/1 − β   a   vt → −η/1 − β g   pre t → ∞.

Dôkaz. Indukciou z vt+1 = βvt − ηg; súčet geometrického radu, a βt → 0, pretože 0 ≤ β < 1. ∎

Na rovnom svahu sa teda krok ustáli na η/1 − β-násobku gradientu: pre β = 0,6 je to 2,5-krát dlhší krok, pre obvyklé β = 0,9 desaťkrát. Keď sa znamienko gradientu strieda, súčet radu sa naopak takmer vyruší.

Príklad — prvé 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)   (farby podľa vzorca vyššie)

θ2 = (−3,6 + 0,6; −1,2 + 0,96) = (−3,00; −0,24)

V smere x sa krok predĺžil z 0,4 na 0,6 (gradient má stále rovnaké znamienko), v smere y sa rýchlosť −2,4 a nový ťah +2,4 takmer vyrušili a guľa je pri dne údolia (y = −0,24). Obyčajný zostup je po dvoch krokoch len v (−3,31; 0,77).

7. Adam: vlastný krok pre každý parameter

Definícia — Adam (Kingma a Ba, 2014)

Nech J : ℝd → ℝ je diferencovateľná stratová funkcia. Adam je algoritmus:

  • vstup: počiatočné parametre θ0 ∈ ℝd, rýchlosť učenia η > 0, koeficienty β1, β2 ∈ [0, 1), malé číslo ε > 0 a počet krokov T ∈ ℕ;
  • výstup: parametre θT ∈ ℝd.

Polož m0 = s0 = 0 ∈ ℝd a pre t = 1, 2, …, T vykonaj (všetky operácie s vektormi — štvorec, odmocnina, delenie — sú po zložkách):

  1. gt = ∇J(θt−1);
  2. mt = β1mt−1 + (1 − β1)gt (priemer gradientov);
  3. st = β2st−1 + (1 − β2)gt2 (priemer štvorcov gradientov);
  4. m̂t = mt/1 − β1t,   ŝt = st/1 − β2t (oprava počiatočného skreslenia, pozri ďalšiu definíciu);
  5. θt = θt−1 − η m̂t/√ŝt + ε.

Obvyklé hodnoty: β1 = 0,9, β2 = 0,999, ε = 10−8. Adam teda robí krok v smere priemerného gradientu, v každej zložke vydelený typickou veľkosťou gradientu v tej zložke.

Laicky povedané

Adam je momentum, ktoré si navyše pri každom parametri pamätá, aké veľké gradienty v ňom bývajú, a krok nimi vydelí. V strmom smere tak robí kratšie kroky, v plochom dlhšie — akoby sa údolie roztiahlo do okrúhlej misy. Preto ide k cieľu takmer rovno (na obrázku ho len na konci kúsok prejde, pretože si stále nesie zotrvačnosť) a preto je dnes predvolenou voľbou pre tréning neurónových sietí.

Definícia — exponenciálny kĺzavý priemer

Nech g1, g2, … je postupnosť reálnych čísel (alebo vektorov z ℝd) a β ∈ [0, 1). Exponenciálny kĺzavý priemer tejto postupnosti je postupnosť (mt)t ≥ 0 daná rekurziou

m0 = 0,   mt = βmt−1 + (1 − β)gt   pre t ≥ 1,

rozpísané mt = (1 − β) ∑k=1t βt−kgk. Pre t ≥ 1 a β > 0 je jeho oprava o počiatočné skreslenie

m̂t = mt/1 − βt.

Váhy (1 − β)βt−k, k = 1, …, t, dajú dohromady len 1 − βt, nie 1 — chýbajúca časť pripadá na počiatočnú nulu. Preto je mt na začiatku skreslený k nule a oprava z neho robí skutočný vážený priemer (váhy po oprave dávajú súčet 1; pri stálom gk = g je presne m̂t = g).

θ ← θ − η · m̂/√ŝ + ε

θ
parametre; všetko ostatné sa počíta po zložkách, takže každý parameter má vlastný krok
η
rýchlosť učenia — keďže zvyšok zlomku má veľkosť zhruba 1, je η pri Adame priamo približná dĺžka kroku v každom parametri
m̂
opravený priemer gradientov (prvý moment) — smer ako pri momente: šum a cik-cak sa v priemere vyrušia
√ŝ
odmocnina z priemeru štvorcov gradientov (druhý moment) — typická veľkosť gradientu v tomto parametri; delením sa strmý a plochý smer zrovnajú na rovnakú mierku
ε
malé číslo (typicky 10−8) — len poistka, aby sa nedelilo nulou pri parametri, ktorého gradient je stále nula
Krok = rýchlosť učenia × smer/typická veľkosť — dĺžka kroku prestane závisieť od toho, aký strmý je daný smer.
Príklad — prvý 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ávame),   θ1 = (−4; 1,2) − 0,5 · (−1; 1) = (−3,5; 0,7)   (farby podľa vzorca vyššie)

Gradient v smere y je šesťkrát väčší než v smere x, a predsa sa oba parametre posunuli o rovnakých 0,5. Obyčajný zostup by sa v smere y posunul šesťkrát ďalej než v smere x.

def adam(grad_J, theta, eta, beta1=0.9, beta2=0.999, eps=1e-8, kroku=1000):
    m = s = 0                                   # vektory núl, veľkosť ako theta
    for t in range(1, kroku + 1):
        g = grad_J(theta)
        m = beta1 * m + (1 - beta1) * g         # priemer gradientov (smer)
        s = beta2 * s + (1 - beta2) * g**2      # priemer štvorcov (veľkosť), po zložkách
        m_hat = m / (1 - beta1**t)              # oprava počiatočnej nuly
        s_hat = s / (1 - beta2**t)
        theta = theta - eta * m_hat / (sqrt(s_hat) + eps)
    return theta

8. Stochastický zostup: učenie po dávkach

Definícia — stochastický gradientný zostup (SGD)

Nech n ≥ 1 je počet príkladov v dátach, L1, …, Ln : ℝd → ℝ sú diferencovateľné straty jednotlivých príkladov a celková strata je ich priemer

J(θ) = 1/n ∑i=1n Li(θ).

Stochastický gradientný zostup je gradientný zostup (so vstupmi θ0, η a počtom krokov ako vyššie), v ktorom sa v každom kroku t namiesto ∇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ždom kroku znova náhodne vybraná neprázdna množina indexov (typicky pevnej veľkosti |Bt| ≪ n). Epocha je úsek krokov, počas ktorého sa každý z n príkladov použije práve raz (pri zamiešaní dát a prechádzaní po dávkach veľkosti b je to n/b krokov, ak je n deliteľné b).

Laicky povedané

Spočítať gradient cez miliardu príkladov je drahé. Stačí sa pozrieť na pár náhodných a vziať ich priemer: odhad sklonu je trochu zašumený, ale stojí zlomok práce. Za cenu jedného presného kroku ich urobíte stovky približných.

g = 1/|B| ∑i ∈ B ∇Li(θ)

g
odhad gradientu — použije sa namiesto ∇J(θ) v obvyklom kroku θ ← θ − ηg
1/|B|
delenie veľkosťou dávky — z priemeru sa stane odhad celého priemeru J; bez neho by väčšia dávka znamenala dlhší krok
∑i ∈ B
súčet len cez náhodne vybranú dávku — tu je úspora: |B| výpočtov namiesto n
∇Li(θ)
gradient straty na jednom príklade — ktorým smerom by parametre chcel posunúť práve tento príklad
Priemer „želaní“ niekoľkých náhodných príkladov ako odhad želania všetkých.
Veta — dávkový gradient je nestranný odhad

Nech J = 1/n ∑i=1n Li je ako v definícii SGD, θ ∈ ℝd pevné a b ≥ 1. Nech I1, …, Ib sú nezávislé náhodné indexy, každý s rovnomerným rozdelením na {1, …, n} (výber s vrátením), a

g = 1/b ∑k=1b ∇LIk(θ).

Potom

  1. E[g] = ∇J(θ) — odhad je nestranný;
  2. pre každú zložku j = 1, …, d je var(gj) = 1/b var(∂LI1/∂θj(θ)), takže smerodajná odchýlka (typická chyba) odhadu klesá ako 1/√b.

Dôkaz. (1) Pre jeden náhodný index I je E[∇LI(θ)] = ∑i=1n 1/n ∇Li(θ) = ∇J(θ); priemer b takých odhadov má rovnakú strednú hodnotu. (2) Rozptyl priemeru b nezávislých rovnako rozdelených veličín je rozptyl jednej vydelený b. ∎

V praxi (aj v našom programe) sa dáta namiesto nezávislého výberu zamiešajú a berú postupne po dávkach — každý príklad sa v epoche použije práve raz. Na tvare záveru to takmer nič nemení.

Definícia — stredná kvadratická chyba (MSE) a jej gradient

Nech n ≥ 1 a (xi, yi) ∈ ℝ2, i = 1, …, n, sú dáta. Pre parametre (a, b) ∈ ℝ2 priamky ŷ = ax + b je stredná kvadratická chyba funkcia J : ℝ2 → ℝ,

J(a, b) = 1/n ∑i=1n (axi + b − yi)2.

Označme ei = axi + b − yi chybu na i-tom príklade. Potom (derivácia zloženej funkcie)

∂J/∂a = 2/n ∑i=1n eixi,   ∂J/∂b = 2/n ∑i=1n ei.

SGD počíta tie isté súčty, len cez dávku B a s 2/|B| namiesto 2/n.

def sgd(data, theta, eta, davka, epoch):
    for _ in range(epoch):
        zamichej(data)                            # nové náhodné poradie v každej epoche
        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árnej regresii so 40 bodmi porovnáme plný zostup (gradient cez všetkých 40 bodov) so SGD po dávkach 4 bodov:

0.10.010.001 krok (iterácia) strata MSE (log. mierka)
Strata počas 60 krokov (logaritmická os) plný zostup SGD, dávky po 4

Po 60 krokoch má plný zostup stratu 0,0017 a SGD 0,0027 — krivka SGD je hrboľatá, ale takmer rovnako nízko. Lenže každý krok SGD prešiel len 4 body namiesto 40, teda desaťkrát menej práce. Pri skutočných dátach s miliónmi príkladov je ten rozdiel rozhodujúci. A šum má aj výhodu: pomáha vyskočiť z plytkých jám.

plný zostup: 60 krokov · 40 bodov = 2400 gradientov jednotlivých bodov = 60 epoch

SGD: 60 krokov · 4 body = 240 gradientov = 240/40 = 6 epoch

9. Lokálne minimá a sedlá

Gradientný zostup nájde dno toho údolia, v ktorom začal. Pri konvexnej funkcii je dno len jedno, pri nekonvexnej záleží na štarte. Funkcia x4 − 3x2 + x z dielu o funkciách má dve minimá:

lokálne minimum globálne minimum parameter x (bez jednotky) strata f(x) (bez jednotky)
Rovnaký algoritmus, iný štart, iné dno

Loptička, ktorá štartuje v x = 2, skončí v lokálnom minime pri x ≈ 1,13 s hodnotou ≈ −1,07. Loptička z x = −2 nájde globálne minimum pri x ≈ −1,30 s hodnotou ≈ −3,51. Vo vysokých rozmeroch neurónových sietí sa ukazuje, že zlé lokálne minimá sú zriedkavejšie, než by sa čakalo — väčším problémom bývajú sedlá, miesta, kde je gradient nula, ale v jednom smere ide krajina hore a v inom dole. Šum SGD a momentum z nich pomáhajú skĺznuť.

Definícia — lokálne a globálne minimum, stacionárny bod, sedlo

Nech J : ℝd → ℝ a θ* ∈ ℝd.

  1. θ* je globálne minimum J práve vtedy, keď ∀θ ∈ ℝd : J(θ*) ≤ J(θ).
  2. θ* je lokálne minimum J práve vtedy, keď ∃r > 0 ∀θ ∈ ℝd : ‖θ − θ*‖ < r ⇒ J(θ*) ≤ J(θ). Lokálne maximum je definované rovnako s ≥ namiesto ≤.
  3. Ak je J diferencovateľná, je θ* stacionárny bod práve vtedy, keď ∇J(θ*) = 0.
  4. θ* je sedlo práve vtedy, keď je stacionárny bod a nie je lokálne minimum ani lokálne maximum.

V stacionárnom bode sa gradientný zostup zastaví, nech je to čokoľvek. Ak je J dvakrát spojito diferencovateľná, rozlíši typ stacionárneho bodu Hessova matica H ∈ ℝd×d, Hij = ∂2J/∂θi ∂θj(θ*): ak má všetky vlastné čísla kladné, je θ* lokálne minimum; všetky záporné — lokálne maximum; kladné aj záporné — sedlo. Ak je niektoré vlastné číslo nulové a ostatné rovnakého znamienka, test nerozhodne.

Príklad — stacionárne body funkcie x⁴ − 3x² + x

f ′(x) = 4x3 − 6x + 1 = 0   ⇒   x ≈ −1,301,   x ≈ 0,170,   x ≈ 1,131 (numericky, Newtonovou metódou)

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 pri 0,17 je „hrebeň“ medzi oboma údoliami: loptička, ktorá štartuje vpravo od neho, sa skotúľa do lokálneho minima, vľavo do globálneho. Sedlo v jednej premennej nevznikne — potrebuje aspoň dva smery. Najjednoduchšie je J(x, y) = x2 − y2: v počiatku je ∇J = (2x, −2y) = 0 a H = diag(2, −2) má vlastné čísla oboch znamienok.

Veta — pri konvexnej funkcii je každé lokálne minimum globálne

Definícia. Nech J : ℝd → ℝ. Funkcia J je konvexná práve vtedy, keď

∀u, v ∈ ℝd ∀λ ∈ [0, 1] : J(λu + (1 − λ)v) ≤ λJ(u) + (1 − λ)J(v)

— úsečka medzi dvoma bodmi grafu nikde neleží pod grafom.

Veta. Nech J : ℝd → ℝ je konvexná a θ* ∈ ℝd je lokálne minimum J. Potom θ* je globálne minimum J.

Dôkaz. Predpokladajme pre spor, že existuje u ∈ ℝd s J(u) < J(θ*). Pre body θλ = λu + (1 − λ)θ* platí J(θλ) ≤ λJ(u) + (1 − λ)J(θ*) < J(θ*) pre každé λ ∈ (0, 1]. Pre malé λ leží θλ ľubovoľne blízko θ* — to je spor s lokálnou minimalitou. ∎

Parabola aj údolie z predchádzajúcich oddielov sú konvexné, strata neurónovej siete s nelineárnymi aktiváciami vo všeobecnosti nie — preto pri sieťach záleží na štarte.

10. Ako sa to robí v praxi

  • Adam alebo SGD s momentom — dve najčastejšie voľby. Adam funguje dobre hneď, SGD s momentom býva po starostlivom ladení o kúsok lepší.
  • Plán rýchlosti učenia — na začiatku pomalý rozbeh (warmup), potom postupné znižovanie. Veľké kroky sa hodia ďaleko od cieľa, malé blízko neho.
  • Veľkosť dávky — typicky 32 až tisíce príkladov; obmedzuje ju pamäť grafickej karty.
  • Epochy a predčasné zastavenie — dáta sa prechádzajú opakovane a tréning sa zastaví, keď sa prestane zlepšovať chyba na dátach, ktoré model nevidel.
  • Normalizácia dát — keď majú vstupy podobný rozsah, je krajina okrúhlejšia a zostup jednoduchší.

11. Zhrnutie

  • Gradientný zostup opakuje θ ← θ − η∇J(θ): krok proti gradientu.
  • Rýchlosť učenia rozhoduje: malá je pomalá, veľká kmitá, príliš veľká diverguje.
  • V úzkych údoliach obyčajný zostup cik-cakuje; momentum pridá zotrvačnosť, Adam vlastný krok pre každý parameter.
  • SGD počíta gradient z malých dávok — šumí, ale každý krok je mnohonásobne lacnejší.
  • Zostup nájde dno údolia, v ktorom začal; v nekonvexných krajinách záleží na štarte.

Týmto dielom je hotová matematika, ktorú potrebujete na pochopenie učenia. Ďalšie moduly série — pravdepodobnosť, strojové učenie a neurónové siete — na nej stavajú.

Máte na to iný názor? Napíšte na support@coden-app.com.

Agent na vašom počítači, ovládaný z telefónu