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