Přeskočit na obsah
coden

Rekurentní sítě: paměť pro posloupnosti a mizející gradient

Síť se skrytým stavem, zpětné šíření v čase, úloha s pamětí, na které obyčejná RNN narazí, útlum gradientu krok za krokem, ořezání gradientu a předpověď časové řady — na síti napsané od nuly.

12 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 65 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 rekurentní síť zpracovává posloupnost a jak se učí.
  • Proč si obyčejná RNN nepamatuje vzdálenou minulost a co je mizející gradient v čase.
  • Kdy RNN stačí a co přišlo po ní.

Co se hodí znát předem: Neuronová síť od nuly: zpětné šíření chyby krok za krokem, Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí

Věta „Pes, kterého jsme loni v létě našli u silnice, dnes …“ se dá dokončit jen tehdy, když si pamatujete, že podmětem je pes. Řeč, text, hudba, kurzy akcií i tep srdce jsou posloupnosti: na pořadí záleží a to, co přijde, závisí na tom, co bylo. Sítě z předchozích dílů ale berou vstup pevné velikosti a nic si nepamatují. Rekurentní sítě to mění jednoduchým trikem — předávají si informaci z kroku na krok. V tomhle dílu jednu napíšeme od nuly, ukážeme, co umí, a hlavně kde a proč přestane stačit.

Navazuje na díly Neuronová síť od nuly a Aktivace, inicializace a normalizace.

1. Síť s vnitřním stavem

Definice — rekurentní neuronová síť

Nechť m ≥ 1 je rozměr vstupu, n ≥ 1 počet skrytých neuronů a K ≥ 2 počet tříd výstupu. Parametry sítě jsou matice a vektory

W ∈ ℝn×n,   U ∈ ℝn×m,   b ∈ ℝn,   V ∈ ℝK×n,   c ∈ ℝK.

Rekurentní síť (RNN) s těmito parametry přiřadí posloupnosti vstupů x1, …, xT ∈ ℝm libovolné délky T ≥ 1 posloupnost skrytých stavů h0, …, hT ∈ ℝn a výstup y ∈ (0, 1)K předpisem

h0 = 0,   ht = tanh(Wht−1 + Uxt + b) pro t = 1, …, T,   y = softmax(VhT + c),

kde tanh se používá po složkách a softmax je definovaný v dílu Konvoluční neuronové sítě. Parametry W, U, b jsou tedy ve všech krocích stejné a stav ht závisí jen na předchozím stavu a aktuálním vstupu. (Výstup se dá počítat i jinak, třeba v každém kroku nebo bez softmaxu; u úlohy s pamětí bereme výstup takto.)

Laicky řečeno

Čtenář, který čte slovo po slově a v hlavě si drží shrnutí dosavadního textu. S každým novým slovem shrnutí upraví: trochu ze starého shrnutí, trochu z nového slova. Stav h je to shrnutí — vektor čísel pevné délky, ať je text jakkoli dlouhý. A pravidlo, jak shrnutí upravit, je pro každé slovo stejné, takže síť zvládne posloupnost libovolné délky se stejným počtem vah.

ht = tanh( Wht−1 + Uxt + b )

ht
nový stav — jediné, co se z kroku t přenese dál; proto musí shrnout vše, co bude síť později potřebovat
Wht−1
paměť — bez tohohle členu by byl každý krok samostatný a síť by o minulosti nic nevěděla; matice W určuje, co ze starého stavu zůstane a jak se to promíchá
Uxt
nová informace — přes U se do stavu dostane aktuální vstup
b
práh — posune, kdy se neuron „rozsvítí“, nezávisle na vstupu i stavu
tanh
nelinearita, která drží stav v (−1, 1) — bez ní by se stav při opakovaném násobení W mohl rozletět do nekonečna a síť by uměla jen lineární závislosti
Stejné W, U a b v každém kroku: síť se učí jedno pravidlo „jak upravit shrnutí“, ne zvlášť pro každou pozici.
h0 W h1 x1 U W h2 x2 U W h3 x3 U W h4 x4 U V y W, U a V jsou v každém kroku tytéž
Rekurentní síť rozvinutá v čase

Když síť „rozvineme“ v čase, je to obyčejná hluboká síť — tolik vrstev, kolik je kroků — jen se stejnými vahami v každé vrstvě. Naše síť má 16 skrytých neuronů a celkem 338 vah, a stejných 338 vah použije v každém z 30 kroků.

Příklad — dva kroky malé sítě ručně

Síť se dvěma skrytými neurony a jedním vstupem (n = 2, m = 1) s parametry

W = 0,5−0,30,20,4,   U = 0,8−0,5,   b = 00,1.

Rovnice ht = tanh(Wht−1 + Uxt + b) rozepsaná po neuronech (h(1), h(2) jsou složky stavu, a je vektor před tanh):

a(1) = 0,5 h(1)t−1 − 0,3 h(2)t−1 + 0,8 xt,   a(2) = 0,2 h(1)t−1 + 0,4 h(2)t−1 − 0,5 xt + 0,1,   ht = tanh(a).

Krok 1, h0 = (0; 0), x1 = 1: a = (0; 0) + (0,8; −0,5) + (0; 0,1) = (0,8; −0,4), h1 = (tanh 0,8; tanh(−0,4)) = (0,664; −0,380).

Krok 2, x2 = 0: a(1) = 0,5 · 0,664 − 0,3 · (−0,380) + 0 + 0 = 0,332 + 0,114 = 0,446, a(2) = 0,2 · 0,664 + 0,4 · (−0,380) + 0 + 0,1 = 0,081, h2 = (tanh 0,446; tanh 0,081) = (0,419; 0,081).

Barvy podle vzorce výše: Wht−1, Uxt, b, ht. Vstup ve druhém kroku je nula, a stav přesto nulový není: nese stopu jedničky z kroku 1. To je celá „paměť“ rekurentní sítě.

Příklad — odkud je 338 vah

Vstup jsou dvě čísla (bit b kódovaný jako [b, 1 − b]), skrytých neuronů 16, výstupy 2 (pravděpodobnost bitu 0 a 1), tedy m = 2, n = 16, K = 2:

W: 16 × 16 = 256, U: 16 × 2 = 32, b: 16, V: 2 × 16 = 32, c: 2; celkem 256 + 32 + 16 + 32 + 2 = 338. Počet nezávisí na délce posloupnosti — 30 kroků nebo 3 000, vah je pořád 338.

2. Zpětné šíření v čase

Definice — chyba E, norma a násobení po složkách

Nechť rekurentní síť z definice výše vrátí pro posloupnost x1, …, xT pravděpodobnosti y = softmax(z), z = VhT + c ∈ ℝK, a nechť k ∈ {1, …, K} je správná třída. Chyba (křížová entropie) je číslo

E = −ln yk ≥ 0:

nula, právě když síť dá správné třídě jistotu 1, a roste nade všechny meze, když jí dá pravděpodobnost blízkou 0. Označme ek ∈ ℝK vektor s jedničkou na místě k a jinde nulami. Gradient chyby podle vstupu softmaxu je

∂E/∂z = y − ek.

Nechť p ≥ 1 a u, v ∈ ℝp. Norma (délka) vektoru v je číslo ‖v‖ = √v12 + … + vp2. Násobení po složkách je vektor u ⊙ v = (u1v1, …, upvp) ∈ ℝp; podobně v2 = v ⊙ v a 1 − v2 = (1 − v12, …, 1 − vp2) bereme po složkách. Pro matici W ∈ ℝq×p je transponovaná matice WT ∈ ℝp×q dána (WT)ij = Wji (řádky a sloupce prohozené).

Definice — zpětné šíření v čase (BPTT)

Zpětné šíření v čase (backpropagation through time) je zpětné šíření chyby na síti rozvinuté v čase. Jako algoritmus:

  • vstup: parametry W, U, b, V, c rekurentní sítě, posloupnost x1, …, xT ∈ ℝm a správná třída k ∈ {1, …, K};
  • výstup: chyba E a gradienty ∂E/∂W, ∂E/∂U, ∂E/∂b, ∂E/∂V, ∂E/∂c.
  1. Dopředný průchod: spočti a ulož h0, …, hT, y a E podle definic výše.
  2. Polož ∂E/∂V = (y − ek)hTT, ∂E/∂c = y − ek a chybový signál posledního stavu ∂E/∂hT = VT(y − ek).
  3. Pro t = T, T − 1, …, 1 (odzadu) spočti δt = (1 − ht2) ⊙ ∂E/∂ht,   ∂E/∂ht−1 = WTδt.
  4. Gradienty sdílených parametrů sečti přes všechny kroky: ∂E/∂W = ∑t=1T δtht−1T,   ∂E/∂U = ∑t=1T δtxtT,   ∂E/∂b = ∑t=1T δt.

Algoritmus skončí po kroku t = 1. Vzorce plynou z řetízkového pravidla a z tanh′ = 1 − tanh2; chybový signál se tedy počítá od posledního kroku k prvnímu a gradient každého sdíleného parametru je součtem příspěvků ze všech kroků, ve kterých byl použit.

Laicky řečeno

Chyba na konci se posílá zpátky krok po kroku, stejně jako v dílu o síti od nuly vrstvu po vrstvě. V každém kroku se vynásobí maticí W a derivací tanh. Po třiceti krocích je to součin třiceti takových činitelů — a z dílu o aktivacích víme, co se se součinem mnoha činitelů stane.

∂E/∂ht−1 = WT [ (1 − ht2) ⊙ ∂E/∂ht ]

∂E/∂ht, ∂E/∂ht−1
chybový signál — o kolik by se změnila chyba, kdybychom pohnuli stavem; ten, který známe v kroku t, posíláme o krok zpět
1 − ht2
derivace tanh (tanh′(a) = 1 − tanh2(a)) — signál musí projít zpátky přes nelinearitu; u nasyceného neuronu (h blízko ±1) je skoro nula a signál zastaví
WT
tatáž matice, která dopředu převáděla ht−1 na ht, jen obráceně — signál se vrací po stejných spojích, kudy šla informace
Hranatou závorku — signál na vstupu tanh v kroku t — značíme δt. Každý krok zpátky přidá jeden činitel WT a jednu derivaci tanh; o s kroků zpět jich je s.

∂E/∂W = ∑t=1T δt ht−1T

∂E/∂W
gradient sdílené matice — podle něj se W v kroku učení posune
∑t
součet přes kroky — W se použilo v každém kroku, takže každý krok přispěje svým dílem; váha je jedna, oprav je T
δt
signál na vstupu tanh v kroku t (hranatá závorka z předchozího vzorce) — jak moc a kterým směrem má neuron v tom kroku změnit svůj součet
ht−1T
co do toho součtu přes W přišlo — váha ze složky stavu, která byla nulová, za chybu nemůže a nemění se
Stejně ∂E/∂U = ∑t δtxtT a ∂E/∂b = ∑t δt.
Příklad — jeden krok zpátky v malé síti

Pokračujme v síti z příkladu výše (h1 = (0,664; −0,380), h2 = (0,419; 0,081)) s výstupní maticí V = 1−1−11, c = 0, a správnou odpovědí je první třída.

Výstup: Vh2 = (0,338; −0,338), softmax dá y = (0,663; 0,337), chyba E = −ln 0,663 = 0,411.

Signál na konci: y − e1 = (−0,337; 0,337), ∂E/∂h2 = VT(y − e1) = (−0,674; 0,674), norma 0,954.

Přes tanh: 1 − h22 = (1 − 0,175; 1 − 0,007) = (0,825; 0,993), δ2 = (0,825 · (−0,674); 0,993 · 0,674) = (−0,556; 0,670).

Přes WT: ∂E/∂h1 = (0,5 · (−0,556) + 0,2 · 0,670; (−0,3) · (−0,556) + 0,4 · 0,670) = (−0,144; 0,435), norma 0,458.

Barvy podle vzorce pro ∂E/∂ht−1 výše: prvky WT, derivace tanh, chybové signály.

Po jediném kroku zpátky zbývá 0,458/0,954 = 48 % signálu. Neurony tu nasycené nejsou; ztrátu způsobila hlavně matice W, jejíž čísla jsou menší než 1.

Celý algoritmus pro jednu posloupnost:

h[0] = 0
for t in 1 … T:                        # dopředu; stavy si schováme
    h[t] = tanh(W·h[t−1] + U·x[t] + b)
y = softmax(V·h[T] + c);  E = −ln y[cíl]
gV, gc = (y − e_cíl)·h[T]ᵀ, y − e_cíl
d = Vᵀ·(y − e_cíl)                     # ∂E/∂h[T]
gW, gU, gb = 0
for t in T … 1:                        # dozadu
    δ = (1 − h[t]²) ⊙ d                # přes tanh
    gW += δ·h[t−1]ᵀ;  gU += δ·x[t]ᵀ;  gb += δ   # sdílené váhy: sčítat
    d = Wᵀ·δ                           # ∂E/∂h[t−1]
ořízni gradient na normu 5, pak krok gradientního sestupu

3. Jak daleko RNN dohlédne

Úloha na čistou paměť: síť dostane 30 náhodných bitů, jeden po druhém, a na konci má říct, jaký bit přišel k kroků před posledním. Žádná nápověda, žádný vzor — musí si průběžně pamatovat posledních k + 1 bitů. Pro každé k naučíme síť ze tří náhodných startů na 4 000 posloupnostech:

Definice — úloha se zpožděním k a přesnost

Nechť k ∈ {0, 1, …, 29} je zpoždění. Jeden příklad úlohy tvoří bity b1, …, b30 ∈ {0, 1}, navzájem nezávislé, s P(bt = 0) = P(bt = 1) = 1/2. Síť z definice výše (T = 30, m = 2, K = 2) dostane vstupy xt = (bt, 1 − bt) ∈ ℝ2, t = 1, …, 30, a jejím cílem je bit

b30−k

(k = 0 je poslední bit). Odpověď sítě je bit, jehož třídě dá výstup y vyšší pravděpodobnost. Nechť síť odpoví na N = 500 nových příkladech, které při učení neviděla, a S je počet správných odpovědí. Přesnost je číslo

přesnost = S/N ∈ [0, 1].

Protože jsou bity nezávislé, ostatní bity o cíli nic neprozradí: síť, která si b30−k nezapamatovala, nemůže být lepší než hod mincí, tedy 50 %. Na 500 posloupnostech kolísá hádání zhruba o ±2,2 procentního bodu (směrodatná odchylka √0,5 · 0,5/500 ≈ 0,022), takže 48,9 % i 50,3 % je čisté hádání.

50 %100 % 0 2 4 5 6 8 12 zpoždění k (kroky) přesnost (%) 10010−110−210−310−410−5 0102029 vzdálenost od konce (kroky) ‖∂E/∂hₜ‖ (vůči konci, log.)
Vlevo přesnost podle zpoždění k, vpravo velikost gradientu podle vzdálenosti v čase vlevo sloupec = průměr tří startů, tečky = jednotlivé starty · vpravo ∂E/∂hₜ vůči poslednímu kroku

Bit z posledního kroku, ze dvou i ze čtyř kroků zpátky si síť pamatuje bezchybně. Při k = 5 se to podaří jen jednomu ze tří startů (průměr 73,0 %), a od k = 6 už síť jen hádá: 50,3 %, 50,2 %, 48,9 %. Kapacita přitom není problém — šestnáct neuronů by šest bitů pojalo. Problém je v učení.

4. Mizející gradient v čase

Pravý graf ukazuje proč. Je to velikost chybového signálu ∂E/∂ht, který při zpětném šíření dorazí do kroku t, vztažená k poslednímu kroku. O krok zpátky zbývá 67 %, o pět kroků 21 %, o deset kroků 3,3 %, o dvacet kroků 0,07 % a na začátku posloupnosti, 29 kroků zpět, 0,005 %.

Laicky řečeno

Aby se síť naučila „bit před šesti kroky je důležitý“, musí se o tom dozvědět z chyby — a chyba k tomu kroku dorazí zeslabená zhruba na šestinu (15 %) a přehlušená signály z bližších kroků. Síť se proto naučí to, co je blízko, a vzdálené souvislosti nevidí. Tenhle jev popsal Sepp Hochreiter v diplomové práci v roce 1991 a Yoshua Bengio s kolegy v roce 1994; je to hlavní slabina obyčejných rekurentních sítí.

Věta — signál slábne nejméně exponenciálně

Nechť je dána rekurentní síť z definice výše s maticí W ∈ ℝn×n, posloupnost délky T ≥ 1, chyba E a chybové signály ∂E/∂ht ∈ ℝn spočtené zpětným šířením v čase. Označme

‖W‖ = max {‖Wv‖ : v ∈ ℝn, ‖v‖ = 1}

největší faktor, kterým W může prodloužit vektor (spektrální norma; ‖WT‖ = ‖W‖). Pak pro každý krok k ∈ {1, …, T} platí

‖∂E/∂hk‖ ≤ ‖W‖T−k · μT−k · ‖∂E/∂hT‖ ≤ ‖W‖T−k · ‖∂E/∂hT‖,

kde μ = max {1 − (ht)i2 : t = k + 1, …, T,   i = 1, …, n} ∈ (0, 1] je největší derivace tanh v krocích mezi k a T (pro k = T je T − k = 0, obě strany jsou si rovny a μ nepotřebujeme).

Důkaz. Podle rekurze zpětného šíření je ∂E/∂ht−1 = WT[(1 − ht2) ⊙ ∂E/∂ht]. Protože |ht| < 1 po složkách, leží čísla 1 − (ht)i2 v (0, 1]; násobení po složkách jimi vynásobí každou složku vektoru číslem z (0, μ], takže délka vektoru se zvětší nejvýš μ-krát. WT vektor prodlouží nejvýš ‖W‖-krát, takže pro t = k + 1, …, T je ‖∂E/∂ht−1‖ ≤ ‖W‖ · μ · ‖∂E/∂ht‖. Zopakováním T − kkrát dostaneme první nerovnost, druhá plyne z μ ≤ 1. ∎

Tuto podmínku (‖W‖ < 1 stačí k mizení) formulovali Razvan Pascanu, Tomáš Mikolov a Yoshua Bengio v článku On the difficulty of training recurrent neural networks (2013).

‖∂E/∂hk‖ ≤ ‖W‖T−k · μT−k · ‖∂E/∂hT‖

‖∂E/∂hk‖, ‖∂E/∂hT‖
síla chybového signálu v kroku k a na konci — jejich poměr je to, co ukazuje červená křivka v pravém grafu
‖W‖
kolik může jeden průchod maticí signál zesílit; je-li menší než 1, každý krok ho zeslabí
μ
největší derivace tanh 1 − h2 přes všechny neurony a kroky od k + 1 do T, nejvýš 1 — nasycené neurony signál zeslabí ještě víc, nikdy nezesílí
T − k
vzdálenost od konce v krocích — je v exponentu, a proto signál neslábne postupně, ale exponenciálně
Je-li ‖W‖ · μ < 1, signál mizí; je-li W velká, může naopak explodovat.
Příklad — o kolik signál průměrně slábne za krok

V naší síti zbude 29 kroků zpět 0,005 % signálu, přesněji 0,0000457 původní síly. Kdyby každý krok ubral stejný díl, byl by činitel jednoho kroku q splňující q29 = 0,0000457, tedy

q = 29√0,0000457 = exp(ln 0,0000457/29) = exp(−10,0/29) = 0,708.

Každý krok tedy průměrně ubere asi 29 % signálu. Zpětně: 0,70810 = 0,032, tedy kolem 3 % po deseti krocích, jak ukazuje graf. Číslo q hraje roli součinu ‖W‖ · μ ze vzorce výše, jen průměrného, ne nejhoršího; exponent je vzdálenost od konce.

Definice — ořezání gradientu

Nechť p ≥ 1 je počet všech parametrů sítě, g ∈ ℝp gradient chyby podle všech parametrů (sestavený do jednoho vektoru) a c > 0 mez. Ořezání gradientu (gradient clipping) je zobrazení ℝp → ℝp,

g ↦ g · min(1, c/‖g‖)   (pro g = 0 je výsledek 0),

tj. g se nezmění, je-li ‖g‖ ≤ c, a jinak se zkrátí na délku přesně c se stejným směrem. Krok gradientního sestupu se pak dělá s ořezaným gradientem. Chrání proti explodujícímu gradientu; proti mizejícímu nepomůže.

g ← g · min(1, c/‖g‖)

g
gradient všech vah — jeho směr říká, kam se pohnout, a ten chceme zachovat
min(1, c/‖g‖)
zkracující činitel — dokud je ‖g‖ ≤ c, je roven 1 a nic se neděje; jinak zkrátí g přesně na délku c, takže jeden krok učení nemůže váhy odhodit příliš daleko
Příklad: s mezí c = 5 se gradient délky 12,5 vynásobí min(1, 5/12,5) = 0,4; gradient délky 3 zůstane, jak je (min(1, 5/3) = 1).

Opačný problém — gradient, který v čase roste — se řeší snadno ořezáním; i naše síť se učí s mezí 5. Na mizející gradient je potřeba změnit samotnou architekturu: dát síti cestu, po které se informace (i chyba) přenese mnoho kroků beze ztráty. To dělají sítě LSTM a GRU, kterým je věnovaný další díl.

5. Kde RNN stačí: krátká paměť

Mnoho úloh dlouhou paměť nepotřebuje. Simulovaná denní spotřeba tepla: pomalý roční cyklus, výkyvy o víkendech a šum. Síť dostane posledních 14 dní a předpovídá zítřek; učí se na prvních 450 dnech, testuje na zbylých 150.

Definice — simulovaná řada a jednoduché předpovědi

Nechť ε0, …, ε599 jsou nezávislé náhodné veličiny s rozdělením N(0, 1). Pro den t = 0, 1, …, 599 označme

vt = 1, je-li t mod 7 ∈ {5, 6} (víkend), jinak vt = −0,4 (pracovní den),

a spotřebu v den t definujme jako

yt = 0,6 · sin(2πt/365) + 0,3 · vt + 0,1 · εt.

Šum 0,1 · εt má tedy směrodatnou odchylku 0,1 a nedá se předpovědět z ničeho. Dny 0, …, 449 jsou trénovací, dny 450, …, 599 testovací.

Předpověď na den t ≥ 14 je číslo ŷt spočtené jen z hodnot y0, …, yt−1. Srovnáváme:

  1. „jako dnes“: ŷt = yt−1;
  2. „jako před týdnem“: ŷt = yt−7;
  3. rekurentní síť (m = 1, T = 14, výstup jedno číslo bez softmaxu, tj. V ∈ ℝ1×n, c ∈ ℝ): dostane vstupy xs = yt−15+s, s = 1, …, 14 (tedy yt−14, …, yt−1), a předpoví ŷt = Vh14 + c; učí se na chybě 1/2(ŷt − yt)2.

RMSE = √1/N ∑t (ŷt − yt)2

ŷt
předpověď na den t (v grafu oranžově)
yt
co se skutečně stalo — rozdíl je chyba jednoho dne
2
čtverec — chyba nahoru i dolů se počítá stejně a velké chyby váží víc než malé
1/N ∑t
průměr přes N = 150 testovacích dní t = 450, …, 599 — jedno číslo za celou předpověď
√
odmocnina vrátí výsledek do jednotek spotřeby, takže RMSE se dá přímo srovnat se směrodatnou odchylkou šumu
Odmocnina z průměrného čtverce chyby (root mean square error): „typická“ chyba jednoho dne.
−101 450500550599 den (pořadí v řadě) spotřeba tepla (bez jednotky)
Předpověď spotřeby o den dopředu na testovacích dnech skutečnost předpověď RNN
Předpověď na zítřekRMSE na 150 testovacích dnech
„jako dnes“0,247
„jako před týdnem“0,163
rekurentní síť (14 dní zpět)0,149
samotný šum v datech (nepřekonatelné)0,100

Síť porazí oba jednoduché odhady, ale proti „jako před týdnem“ jen o kousek. Týdenní rytmus je přitom sedm kroků zpátky — přesně na hranici, kde obyčejná RNN v úloze s pamětí přestala stačit.

Věta — proč je 0,100 dolní mez

Nechť je řada yt definovaná jako výše a označme st = 0,6 · sin(2πt/365) + 0,3 · vt její předpověditelnou část (sinus plus týdenní rytmus), takže yt = st + 0,1εt. Nechť pro každý testovací den t = 450, …, 599 je předpověď ŷt = φt(y0, …, yt−1) libovolnou (měřitelnou) funkcí minulých hodnot s E[ŷt2] < ∞ — sem patří i síť naučená na trénovacích dnech. Pak pro každé takové t

E[(ŷt − yt)2] = E[(ŷt − st)2] + 0,01 ≥ 0,01,

a proto i střední hodnota průměrného čtverce chyby přes N testovacích dní je aspoň 0,01, tj. E[RMSE2] ≥ 0,01 a √E[RMSE2] ≥ √0,01 = 0,100. Rovnost nastane, právě když ŷt = st (s pravděpodobností 1) pro všechna testovací t.

Důkaz. ŷt závisí jen na ε0, …, εt−1, a je proto nezávislá na εt. Rozepsáním (ŷt − yt)2 = (ŷt − st)2 − 0,2εt(ŷt − st) + 0,01εt2. Ve střední hodnotě je prostřední člen nulový (E[εt(ŷt − st)] = E[εt] · E[ŷt − st] = 0) a poslední je 0,01, protože E[εt2] = 1. První sčítanec je nezáporný a nulový, právě když ŷt = st s pravděpodobností 1. Průměr přes dny tuto mez zachová. ∎

Předpověď se tedy může šumu přiblížit nejvýš na „typickou“ chybu 0,100, a to jen tehdy, když zná st přesně.

Na konkrétních 150 testovacích dnech má sám šum RMSE 0,107 (náhodně o něco víc než 0,1). Síť s chybou 0,149 je tedy od ideálu ještě kus daleko.

6. Rekurentní sítě dnes

  • Historie. Jednoduchou rekurentní síť v dnešní podobě popsali Michael Jordan (1986) a Jeffrey Elman (1990), který na ní zkoumal, jak se z textu dá naučit gramatika.
  • LSTM a GRU (1997, 2014) mizející gradient obcházejí a v letech 2014–2017 pohánějí strojový překlad, rozpoznávání řeči i našeptávání na klávesnici telefonu.
  • Transformery (2017) posloupnosti nezpracovávají krok po kroku, ale vidí všechna slova naráz; v jazyce rekurentní sítě skoro vytlačily. Nové architektury jako stavové modely (Mamba, 2023) ale myšlenku rekurence vracejí — pro velmi dlouhé posloupnosti je výhodné nést pevně velký stav.

7. Shrnutí

  • Rekurentní síť nese skrytý stav a v každém kroku ho upraví stejnými vahami; zpracuje posloupnost libovolné délky.
  • Učí se zpětným šířením v čase — jako hluboká síť, která má tolik vrstev, kolik je kroků.
  • Bit z doby před 4 kroky si naše síť pamatovala na 100 %, před 6 kroky už jen hádala (50 %).
  • Důvodem je mizející gradient: o deset kroků zpět dorazí 3,3 % chybového signálu, o 29 kroků 0,005 %.
  • Na úlohy s krátkou pamětí RNN stačí: předpověď spotřeby s chybou 0,149 proti 0,247 u odhadu „jako dnes“.

Chcete si to osahat? Nechte AI agenta natrénovat malou znakovou RNN na textu vaší oblíbené knihy a nechat ji psát pokračování. Jak dlouhé souvislosti v generovaném textu vydrží?

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