Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
Aktivační funkce a jejich derivace, mizející a explodující gradient ve dvaceti vrstvách, Xavierova a Heova inicializace, past symetrie, normalizace vstupů a vrstev a pokus s hlubokou sítí na dvou měsících.
Série Základy AI Díl 63 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
- Proč v hluboké síti gradient mizí nebo exploduje a co s tím má aktivační funkce.
- Jak správná inicializace udrží signál a proč nesmí být všechny váhy stejné.
- Proč se normalizují vstupy i vrstvy uvnitř sítě.
Co se hodí znát předem: Neuronová síť od nuly: zpětné šíření chyby krok za krokem
Zpětné šíření chyby se rozšířilo v roce 1986, a přesto se sítě s víc než dvěma třemi vrstvami dalších dvacet let učit skoro nedařilo. Nebylo to tím, že by chyběla velká myšlenka. Chyběly drobnosti: jakou funkci dát do neuronů, jak nastavit váhy na začátku, jak udržet čísla uvnitř sítě v rozumném rozsahu. Když se je kolem roku 2010 podařilo vyřešit, začaly se najednou učit sítě s desítkami a pak stovkami vrstev. Tenhle díl je o těch drobnostech — a o tom, proč na nich všechno stojí.
Navazuje na díl Neuronová síť od nuly.
1. Aktivační funkce
Definice — běžné aktivační funkce
Aktivační funkce je funkce f : ℝ → ℝ, kterou neuron použije na svůj vážený součet z ∈ ℝ; na vektor z ∈ ℝd ji používáme po složkách, f(z) = (f(z1), …, f(zd)) (viz definici vícevrstvé sítě v dílu Neuronová síť od nuly). Běžné aktivační funkce jsou:
- sigmoida σ : ℝ → (0, 1), σ(z) = 1/1 + e−z, s derivací σ′(z) = σ(z)(1 − σ(z)), pro kterou platí 0 < σ′(z) ≤ 1/4 pro všechna z ∈ ℝ (rovnost právě když z = 0);
- hyperbolický tangens tanh : ℝ → (−1, 1), tanh z = ez − e−z/ez + e−z, s derivací tanh′ z = 1 − tanh2 z, pro kterou platí 0 < tanh′ z ≤ 1 (rovnost právě když z = 0);
- ReLU (rectified linear unit) ReLU : ℝ → [0, ∞), ReLU(z) = max(0, z), s derivací ReLU′(z) = 1 pro z > 0 a ReLU′(z) = 0 pro z < 0; v bodě z = 0 derivace neexistuje a dodefinovává se (u nás i v běžných knihovnách) hodnotou 0;
- GELU (Gaussian error linear unit) GELU : ℝ → ℝ, GELU(z) = z · Φ(z), kde Φ je distribuční funkce normálního rozdělení N(0, 1) (přesně v definici GELU níže) — hladká varianta ReLU.
Aktivace je to, co dělá síť nelineární — bez ní by byla celá síť jen jedno násobení maticí, ať by měla vrstev kolik chce. Pro učení je ale důležitější její derivace: ta říká, kolik chybového signálu neuron pošle při zpětném šíření dál. Sigmoida pustí nejvýš čtvrtinu, tanh až všechno, ReLU buď všechno, nebo nic.
Věta — bez aktivace je hluboká síť jen jedna vrstva
Nechť n ∈ ℕ, n ≥ 1, je počet vrstev, d0, …, dn ≥ 1 jsou šířky vrstev a pro ℓ = 1, …, n jsou W(ℓ) ∈ ℝdℓ×dℓ−1 váhy a b(ℓ) ∈ ℝdℓ prahy vrstvy ℓ. Nechť síť nemá aktivaci (f je identita), tj. pro vstup x ∈ ℝd0 je a(0) = x a
a(ℓ) = W(ℓ)a(ℓ−1) + b(ℓ), ℓ = 1, …, n.
Pak existují W ∈ ℝdn×d0 a b ∈ ℝdn takové, že a(n) = Wx + b pro všechna x ∈ ℝd0; celá síť tedy počítá totéž co jediná vrstva.
Důkaz indukcí podle n. Pro n = 1 stačí W = W(1), b = b(1). Platí-li tvrzení pro n − 1 vrstev s maticí W′ a prahem b′, je
a(n) = W(n)(W′x + b′) + b(n) = (W(n)W′)x + (W(n)b′ + b(n)),
takže stačí W = W(n)W′ a b = W(n)b′ + b(n). Celkem W = W(n)W(n−1) ⋯ W(1): složení afinních zobrazení je afinní. ∎
Teprve nelineární f mezi vrstvami tenhle součin „rozbije“.
Derivace sigmoidy se dá spočítat z její vlastní hodnoty — proto ji síti stačí si pamatovat výstup neuronu z dopředného průchodu:
σ′(z) = σ(z) · (1 − σ(z))
- σ′(z)
- derivace aktivace — činitel, kterým se při zpětném šíření násobí chybový signál procházející neuronem; o něj tu jde
- σ(z)
- výstup neuronu — u velmi záporného z je skoro 0, a tak derivaci stáhne k nule: neuron, který „mlčí“, se skoro neučí
- 1 − σ(z)
- kolik zbývá do nasycení na 1 — u velmi kladného z je skoro 0, takže ani „křičící“ neuron signál nepustí
Odvození — derivace sigmoidy a tanh
Z σ(z) = (1 + e−z)−1 podle pravidla pro derivaci složené funkce:
σ′(z) = e−z/(1 + e−z)2 = 1/1 + e−z · e−z/1 + e−z = σ(z) · (1 − σ(z)),
protože e−z/1 + e−z = 1 − 1/1 + e−z. Pro tanh vyjde stejným postupem tanh′(z) = 1 − tanh2(z); tanh je jen natažená a posunutá sigmoida, tanh(z) = 2σ(2z) − 1, a odtud i čtyřikrát vyšší strop derivace (dvojka uvnitř a dvojka venku).
Příklad — kolik signálu projde při z = 0, 2 a 4
| z | σ(z) | σ′(z) | tanh′(z) | ReLU′(z) |
|---|---|---|---|---|
| 0 | 0,500 | 0,500 · 0,500 = 0,250 | 1 − 02 = 1,000 | (nedefinována, bere se 0) |
| 2 | 0,881 | 0,881 · 0,119 = 0,105 | 1 − 0,9642 = 0,071 | 1 |
| 4 | 0,982 | 0,982 · 0,018 = 0,018 | 1 − 0,99932 = 0,0013 | 1 |
Ve sloupci σ′(z) barvy podle vzorce σ′(z) = σ(z) · (1 − σ(z)) výše.
Sigmoida i tanh se pro velké z nasytí a signál skoro zastaví; ReLU pustí pro každé kladné z celý signál. (V bodě 0 ReLU derivaci nemá; knihovny i náš kód tam berou 0.)
Definice — GELU přesně a přibližně
Nechť Z je náhodná veličina se standardním normálním rozdělením N(0, 1) (střední hodnota 0, rozptyl 1). Její distribuční funkce je funkce Φ : ℝ → (0, 1),
Φ(z) = P(Z ≤ z) = 1/√2π ∫−∞z exp(−t2/2) dt = 1/2(1 + erf(z/√2)),
kde erf(u) = 2/√π ∫0u exp(−t2) dt je chybová funkce. GELU je funkce GELU : ℝ → ℝ,
GELU(z) = z · Φ(z).
Neuron tedy svůj vstup z vynásobí pravděpodobností, že standardní normální veličina nepřesáhne z. Hendrycks a Gimpel (2016) uvádějí i rychlejší přiblížení
GELU(z) ≈ 1/2 z (1 + tanh(√2/π · (z + 0,044715 z3))),
které kreslí obrázek. Například GELU(1) = 1 · Φ(1) = 0,8413 (přiblížení dá 0,8412) a GELU(−1) = −0,159: na rozdíl od ReLU propustí i kousek záporných hodnot a nemá v nule zlom.
2. Mizející a explodující gradient
Definice — mizející a explodující gradient
Nechť je dána vícevrstvá síť s n ≥ 2 vrstvami, šířkami d0, …, dn, váhami W(ℓ) ∈ ℝdℓ×dℓ−1 a aktivací f (definice v dílu Neuronová síť od nuly), příklad se vstupem x a ztráta E. Nechť δ(ℓ) = ∂E/∂z(ℓ) ∈ ℝdℓ je chybový signál vrstvy ℓ = 1, …, n a D(ℓ) ∈ ℝdℓ×dℓ diagonální matice s čísly f′(z1(ℓ)), …, f′(zdℓ(ℓ)) na diagonále. Z rekurence zpětného šíření (níže) plyne
δ(1) = D(1)(W(2))T D(2)(W(3))T ⋯ D(n−1)(W(n))T δ(n),
tedy chybový signál první vrstvy vznikne ze signálu poslední vrstvy vynásobením n − 1 činiteli D(ℓ)(W(ℓ+1))T. Velikost signálu měříme eukleidovskou normou ‖·‖ a jeho zesílení poměrem
r = ‖δ(1)‖/‖δ(n)‖ (pro δ(n) ≠ 0).
- Gradient mizí, když r ≪ 1, takže váhy prvních vrstev dostávají proti posledním zanedbatelně malé gradienty.
- Gradient exploduje, když r ≫ 1, takže krok gradientního sestupu v prvních vrstvách je proti posledním obrovský.
Pevná hranice („≪“) se v literatuře nestanovuje; podstatné je, že r se s počtem vrstev mění exponenciálně. Například platí-li pro všechna ℓ = 1, …, n − 1 odhad ‖D(ℓ)(W(ℓ+1))T‖ ≤ q s konstantou q < 1 (‖·‖ je tu maticová norma indukovaná eukleidovskou), pak r ≤ qn−1, protože norma součinu je nejvýš součin norem. Slovy: je-li typická velikost činitele „derivace krát váhy“ menší než 1, gradient s hloubkou exponenciálně mizí; je-li větší, exploduje.
Tichá pošta přes dvacet lidí: když každý zopakuje jen čtvrtinu toho, co slyšel, na konci nezbude nic — 0,2520 je zhruba jedna biliontina. Když každý přidá, je z toho na konci řev. Váhy prvních vrstev se pak buď vůbec nehnou, nebo se rozletí. Učit se dá jen síť, ve které signál projde oběma směry zhruba stejně silný.
Přesně to říká rekurence zpětného šíření z dílu Neuronová síť od nuly. Chybový signál vrstvy ℓ je δ(ℓ) = ∂E/∂z(ℓ), tedy jak citlivá je chyba na vážené součty té vrstvy; gradient jejích vah je pak ∂E/∂W(ℓ) = δ(ℓ) (a(ℓ−1))T. Pro ℓ = 1, …, n − 1 platí:
δ(ℓ) = f′(z(ℓ)) ⊙ (W(ℓ+1))T δ(ℓ+1)
- δ(ℓ)
- chybový signál vrstvy ℓ — z něj se počítá gradient vah této vrstvy; když je malý, váhy se nehnou
- f′(z(ℓ))
- derivace aktivace v každém neuronu (⊙ je násobení po složkách) — neuron propustí jen tolik signálu, kolik je jeho sklon; u sigmoidy nejvýš 0,25
- (W(ℓ+1))T
- tytéž váhy jako dopředu, jen v opačném směru — každý neuron dostane zpět signál od těch, kterým posílal výstup, v poměru svých vah
- δ(ℓ+1)
- signál vrstvy o patro výš, už spočtený — proto se počítá od výstupu dozadu a v každé vrstvě se jen přinásobí další dva činitele
Příklad — dvacet vrstev po jednom neuronu
Pro řetízek s jedním neuronem ve vrstvě je všechno číslo a signál, který dorazí k první vrstvě, je zjednodušeně signál z výstupu krát dvacet činitelů wℓ · f′(zℓ), po jednom za každou vrstvu. Když je každý z nich roven
- 0,25 (sigmoida v nejlepším bodě, váha 1): 0,2520 = 9,1 · 10−13,
- 0,5: 0,520 = 9,5 · 10−7, tedy zhruba miliontina,
- 1,5: 1,520 ≈ 3 325 — gradient první vrstvy přes tři tisíce krát větší než poslední.
Jen činitel velmi blízký 1 udrží signál celý. Ve skutečné síti se místo čísel násobí matice, ale princip je stejný: rozhoduje typická velikost součinu „váhy krát derivace“.
3. Inicializace vah
Definice — Xavierova a Heova inicializace
Nechť ℓ je vrstva sítě s n = dℓ−1 ≥ 1 vstupy a dℓ ≥ 1 neurony, s vahami W(ℓ) ∈ ℝdℓ×dℓ−1 a prahy b(ℓ) ∈ ℝdℓ. Inicializace s rozptylem v > 0 nastaví před učením
- každou váhu Wij(ℓ), i = 1, …, dℓ, j = 1, …, dℓ−1, na hodnotu nezávisle vylosovanou z rozdělení se střední hodnotou 0 a rozptylem v (u nás normálního N(0, v), knihovny používají i rovnoměrné);
- prahy na nulu, b(ℓ) = 0.
Rozptyl se volí podle aktivace tak, aby si aktivace vrstvu za vrstvou udržely rozptyl (odvození níže):
- Xavierova inicializace (Glorot, Bengio, 2010) pro tanh a sigmoidu: v = 1/n, tj. směrodatná odchylka √1/n;
- Heova inicializace (He a kol., 2015) pro ReLU: v = 2/n, tj. směrodatná odchylka √2/n.
Dvojka u Heovy inicializace vyrovná to, že ReLU polovinu vstupů vynuluje. Glorot a Bengio v původním článku navrhli obecněji v = 2/dℓ−1 + dℓ; pro vrstvy stejné šířky (dℓ−1 = dℓ), jako jsou naše, je to totéž co 1/n.
Neuron sečte n vstupů. Kdyby každá váha byla kolem 1, součet by byl √nkrát větší než vstupy a za pár vrstev by čísla utekla. Váhy se proto zmenší tak, aby součet vyšel zhruba stejně velký jako vstup. Jedna číselná konstanta na začátku rozhodne, jestli se síť vůbec začne učit.
Odkud se berou 1/n a 2/n
Věta — rozptyl váženého součtu
Nechť n ∈ ℕ, n ≥ 1, a w1, …, wn, a1, …, an jsou reálné náhodné veličiny s konečnými druhými momenty, pro které platí
- w1, …, wn jsou navzájem nezávislé a pro každé j = 1, …, n je E[wj] = 0 a Var(wj) = Var(w);
- vektor (w1, …, wn) je nezávislý na vektoru (a1, …, an);
- E[aj2] = E[a2] pro každé j = 1, …, n.
Označme z = ∑j=1n wj aj. Pak E[z] = 0 a
Var(z) = n · Var(w) · E[a2].
Důkaz. Z předpokladu 2 je E[z] = ∑j E[wj] E[aj] = 0. V součtu E[z2] = ∑j,k E[wjwk] E[ajak] (opět předpoklad 2) jsou pro j ≠ k členy nulové, protože podle předpokladu 1 je E[wjwk] = E[wj] E[wk] = 0, a zbude n členů E[wj2] E[aj2] = Var(w) E[a2] (předpoklady 1 a 3). Tedy Var(z) = E[z2] − E[z]2 = n · Var(w) · E[a2]. ∎
Var(z(ℓ)) = n · Var(w) · E[(a(ℓ−1))2]
- n · Var(w)
- zesílení vrstvy — n = dℓ−1 vstupů znamená n nezávislých příspěvků, jejichž rozptyly se sčítají; jediná věc, kterou volíme, je Var(w), a volíme ji tak, aby celý činitel vyrovnal ztrátu nebo zisk v aktivaci
- E[(a(ℓ−1))2]
- síla vstupu — střední kvadrát aktivací předchozí vrstvy; kolik z rozptylu z(ℓ−1) v nich zbylo, rozhoduje aktivace
Zbývá dosadit, co z rozptylu nechá aktivace. Tanh je kolem nuly skoro identita (tanh z ≈ z), takže E[a2] ≈ Var(z) a rovnováha vyjde pro n · Var(w) = 1, tedy Var(w) = 1/n. ReLU nechá z z symetrického kolem nuly jen kladnou polovinu, a proto E[ReLU(z)2] = 1/2 E[z2] = 1/2 Var(z); rovnováha pak chce n · Var(w) · 1/2 = 1, tedy Var(w) = 2/n. Glorot a Bengio (2010) ve skutečnosti navrhli Var(w) = 2/nvst + nvýst, kompromis mezi rovnováhou dopředu (počet vstupů) a dozadu (počet výstupů); pro vrstvy stejné šířky, jako jsou naše, je to totéž co 1/n.
Příklad — vrstvy po 50 neuronech
- Xavier: směrodatná odchylka vah √1/50 = 0,141; He: √2/50 = 0,200.
- Tanh s malými vahami (0,05): zesílení 50 · 0,052 = 0,125, takže směrodatná odchylka aktivací klesne v každé vrstvě √0,125 = 0,354krát. Za 19 vrstev z 0,31: 0,31 · 0,35419 ≈ 8 · 10−10. Pokus dal 7 · 10−10 (v průměru 0,350 na vrstvu).
- Tanh s N(0, 1): zesílení 50 · 1 = 50 — vážené součty mají směrodatnou odchylku kolem √50 ≈ 7 a tanh je na ±1, v nasycení.
- ReLU s Xavierem: 50 · 1/50 · 1/2 = 1/2, rozptyl se v každé vrstvě půlí a směrodatná odchylka klesá √1/2 = 0,71krát; teorie dává 0,57 · 0,7119 ≈ 0,0008, pokus 0,0004 (v průměru 0,68 na vrstvu — s padesáti neurony a sto vzorky se náhodné odchylky násobí také).
- ReLU s He: 50 · 2/50 · 1/2 = 1 — rovnováha.
Barvy podle vzorce výše: zesílení n · Var(w); činitel 1/2 u ReLU je podíl rozptylu, který aktivace nechá v E[a2].
for každá vrstva l s n_vst vstupy a n_výst neurony:
if aktivace je tanh nebo sigmoida:
s = 1/√n_vst # Xavier (pro n_vst = n_výst)
else if aktivace je ReLU:
s = √(2/n_vst) # He
W[l] = s · matice n_výst × n_vst čísel z N(0, 1)
b[l] = 0 # prahy mohou začít v nule, symetrii rozbijí váhy
Pokus: dávka náhodných vstupů projde sítí s 20 skrytými vrstvami po 50 neuronech. Sledujeme, jak velké (směrodatná odchylka) jsou aktivace v každé vrstvě a jak velký je gradient v první vrstvě proti poslední:
| Aktivace a inicializace | aktivace ve vrstvě 1 | ve vrstvě 20 | poměr gradientů 1. vrstva/20. vrstva |
|---|---|---|---|
| sigmoida, N(0, 1) | 0,43 | 0,40 | 0,03 (mizí) |
| tanh, příliš malé váhy (σ = 0,05) | 0,31 | 7 · 10⁻¹⁰ | — |
| tanh, N(0, 1) | 0,93 | 0,93 | 127 000 (exploduje) |
| tanh, Xavier | 0,61 | 0,14 | 1,00 |
| ReLU, Xavier | 0,57 | 0,0004 | 3,9 |
| ReLU, He | 0,81 | 0,37 | 3,9 |
S příliš malými vahami aktivace v tanh síti zmizí: ve dvacáté vrstvě mají velikost 7 · 10⁻¹⁰ a síť neví nic o vstupu. S vahami N(0, 1) se tanh nasytí — skoro všechny neurony jsou na ±1 — a gradient první vrstvy je 127 000krát větší než poslední. Sigmoida s N(0, 1) má aktivace v pořádku, ale gradient k první vrstvě dorazí 31krát zeslabený. Xavier udrží tanh v rovnováze (poměr gradientů 1,00), u ReLU ale nestačí: každá vrstva rozptyl zhruba způlí a ve dvacáté vrstvě zbude 0,0004. Heova inicializace s dvojkou navíc to opraví — aktivace zůstanou v řádu desetin až do konce.
4. Past symetrie
Proč váhy vůbec losovat? Nešlo by je nastavit všechny na stejné rozumné číslo? Zkusme síť 2-4-1 na XOR se všemi vahami 0,5.
Čtyři skryté neurony začnou stejně, dostanou stejný vstup a stejný chybový signál — a tak se změní stejně. Po 2 000 epochách mají všechny čtyři přesně tytéž váhy (5,571 a 5,571), rozdíl je nula. Čtyři neurony se chovají jako jeden, a jeden neuron XOR nezvládne: pro vstup (1, 1) síť vrací 0,669 místo 0. Náhodná inicializace je tedy nutná už jen proto, aby se neurony od sebe lišily — rozbije symetrii.
Proč přesně se neurony nerozdělí, je vidět z gradientu váhy wij ze vstupu j do skrytého neuronu i. Síť má skryté výstupy hi = σ(∑j wijxj + bi), výstup o = σ(∑i vihi + c) a křížovou entropii jako ztrátu (u ní je chybový signál výstupu prostě o − y):
∂E/∂wij = (o − y) · vi · hi(1 − hi) · xj
- ∂E/∂wij
- o kolik a kterým směrem se váha změní — chceme ukázat, že pro všechna i vyjde stejně
- o − y
- chyba výstupu — jedna pro celou síť, pro všechny skryté neurony stejná
- vi
- výstupní váha neuronu i — jakým dílem neuron k chybě přispěl; při stejné inicializaci všude 0,5
- hi(1 − hi)
- derivace sigmoidy v neuronu i — závisí jen na jeho vážených vstupech, a ty jsou při stejných vahách stejné
- xj
- vstup j — tentýž pro všechny skryté neurony
Věta — stejně inicializované neurony zůstanou stejné
Nechť je dána síť s m ≥ 1 vstupy, jednou skrytou vrstvou s d ≥ 2 sigmoidními neurony a jedním sigmoidním výstupem jako v odstavci výše: pro vstup x ∈ ℝm je hi = σ(∑j=1m wijxj + bi) pro i = 1, …, d a o = σ(∑i=1d vihi + c). Nechť ztráta E je součet křížových entropií přes konečně mnoho trénovacích příkladů a parametry se mění gradientním sestupem s krokem η > 0,
θ ← θ − η ∂E/∂θ pro každý parametr θ ∈ {wij, bi, vi, c}.
Nechť pro dva skryté neurony i ≠ k platí na začátku
wij = wkj pro všechna j = 1, …, m, bi = bk, vi = vk.
Pak tyto rovnosti platí i po každém počtu t ∈ ℕ kroků gradientního sestupu.
Důkaz indukcí podle t. Pro t = 0 platí rovnosti z předpokladu. Jsou-li před krokem váhy neuronů i a k stejné, jsou stejné i hi = hk pro každý vstup, a podle vzorce výše tedy i gradienty ∂E/∂wij = ∂E/∂wkj, ∂E/∂bi = ∂E/∂bk a ∂E/∂vi = (o − y) hi = ∂E/∂vk, sečtené přes všechny příklady. Stejné váhy minus stejný násobek stejných gradientů dají stejné váhy. ∎
Proto v pokusu vyšel rozdíl vah přesně nula, ne jen malý. Když se váhy na začátku liší třeba jen o málo, dostanou neurony různé gradienty a rozdíly mezi nimi se učením obvykle prohloubí.
5. Normalizace vstupů
Stejná potíž s měřítkem jako uvnitř sítě nastává už na vstupu. Lineární regrese se dvěma příznaky, jeden v jednotkách (směrodatná odchylka 1), druhý ve stovkách (směrodatná odchylka 100):
Definice — podmíněnost úlohy
Nechť p ≥ 1 a E : ℝp → ℝ je kvadratická funkce (ztráta), E(w) = wTAw + cTw + e se symetrickou maticí A ∈ ℝp×p, c ∈ ℝp a e ∈ ℝ. Její Hessova matice H = ∇2E = 2A nezávisí na w; nechť je pozitivně definitní, s vlastními čísly λmax = λ1 ≥ λ2 ≥ … ≥ λp = λmin > 0. Číslo podmíněnosti úlohy je
κ = λmax/λmin ≥ 1.
Číslo κ tedy říká, kolikrát je údolí ztráty v nejstrmějším směru zakřivenější než v nejplošším; κ = 1 právě když je zakřivení ve všech směrech stejné. Gradientní sestup s pevným krokem potřebuje řádově tolik kroků, kolik je κ (odvození níže).
Ztráta je údolí. Když jsou příznaky v různých jednotkách, je údolí v jednom směru stokrát užší než ve druhém. Krok musí být malý kvůli úzkému směru, a v širokém se pak postupuje hlemýždím tempem — známe to z dílu o gradientním sestupu. U nás má údolí podmíněnost 8 434 a gradientní sestup potřebuje 14 822 kroků. Po standardizaci obou příznaků je podmíněnost 1,07 a stačí jeden krok.
Definice — standardizace příznaku
Nechť N ≥ 2 a x1, …, xN ∈ ℝ jsou hodnoty jednoho příznaku na trénovacích datech, ne všechny stejné. Označme jejich průměr a směrodatnou odchylku
μ = 1/N ∑k=1N xk, s = √1/N ∑k=1N (xk − μ)2 > 0.
Standardizace příznaku je funkce ℝ → ℝ,
x ↦ x̃ = x − μ/s.
Standardizované trénovací hodnoty x̃1, …, x̃N mají průměr 0 a směrodatnou odchylku 1. Tytéž μ a s se pak použijí i na nová data. Má-li příklad víc příznaků, standardizuje se každý zvlášť se svým průměrem a směrodatnou odchylkou.
Proč počet kroků roste s podmíněností
Ztráta lineární regrese E(w) = 1/N ∑k=1N (wTxk − yk)2 je kvadratická, s Hessovou maticí 2C, kde C = 1/N ∑k=1N xkxkT (λi níže jsou vlastní čísla C, takže κ = λmax/λmin je stejné jako u 2C). Ve směrech vlastních vektorů C se gradientní sestup rozpadne na nezávislé jednorozměrné úlohy, a pro chybu po k krocích s krokem η = 1/2λmax (největší, který ještě v žádném směru nepřestřelí) platí přesně:
E(wk) − E* = ∑i gi · (1 − λi/λmax)2k
- E(wk) − E*
- kolik chyby zbývá do optima po k krocích — sestup zastavíme, až klesne pod 1 % počáteční hodnoty
- gi
- kolik počáteční chyby leží ve směru i — směr, ve kterém skoro nic chybět nebude, nás nezdrží, i kdyby byl pomalý
- λi/λmax
- zakřivení údolí ve směru i vůči nejstrmějšímu směru — krok musíme nastavit podle nejstrmějšího, a v mělkém směru pak uděláme jen zlomek cesty; nejpomalejší směr má poměr 1/κ
- 2k
- počet kroků, zdvojený — vzdálenost od optima se každým krokem násobí (1 − λi/λmax) a chyba je kvadratická, tedy roste se čtvercem vzdálenosti
Příklad — odkud je 14 822 kroků
- Data: v našem vzorku 200 bodů mají příznaky směrodatné odchylky 1,00 a 91,7. Matice C je skoro diagonální, s vlastními čísly λmax = 8 415 a λmin = 0,998, tedy κ = 8 434 — zhruba (91,7/1,00)2, poměr rozptylů příznaků.
- Počáteční chyba (z w = 0) leží z 33,6 % v pomalém směru.
- Podmínka zastavení: 0,336 · (1 − 1/8 434)2k ≤ 0,01, tedy k ≥ ln(0,336/0,01)/−2 ln(1 − 1/8 434) = 3,51479/0,000237139 ≈ 14 821,6 (zhruba κ/2 · ln 33,6). Nejmenší celé k je 14 822 — přesně tolik kroků potřeboval pokus.
- Po standardizaci je λmax = 1,033, λmin = 0,967; pomalý směr ubude za jeden krok činitelem (1 − 0,967/1,033)2 = 0,004, a protože v něm leželo jen 2,3 % chyby, stačí jeden krok.
Barvy podle vzorce pro E(wk) − E* výše (chyby jsou tu v podílech počáteční chyby).
6. Normalizace uvnitř sítě
Definice — batch normalization a layer normalization
Nechť ε > 0 je malá konstanta. Pro čísla u1, …, uK ∈ ℝ (K ≥ 1) označme jejich průměr a rozptyl
μ = 1/K ∑k=1K uk, σ2 = 1/K ∑k=1K (uk − μ)2.
- Batch normalization (Ioffe, Szegedy, 2015). Nechť m ≥ 1 je velikost dávky a z1, …, zm ∈ ℝ jsou vážené součty jednoho neuronu pro m příkladů dávky; μ a σ2 jsou jejich průměr a rozptyl (K = m, uk = zk). Neuron má naučené parametry γ, β ∈ ℝ. Výstup pro příklad k = 1, …, m je yk = γ · zk − μ/√σ2 + ε + β. Totéž se dělá pro každý neuron vrstvy zvlášť, každý s vlastními γ, β.
- Layer normalization (Ba, Kiros, Hinton, 2016). Nechť d ≥ 1 je počet neuronů vrstvy a z1, …, zd ∈ ℝ jsou vážené součty všech neuronů vrstvy pro jeden příklad; μ a σ2 jsou jejich průměr a rozptyl (K = d, ui = zi). Neuron i má naučené parametry γi, βi ∈ ℝ. Výstup neuronu i = 1, …, d je yi = γi · zi − μ/√σ2 + ε + βi. Totéž se dělá pro každý příklad zvlášť.
Obě normalizace tedy srovnají vážené součty na průměr 0 a rozptyl (skoro) 1 a pak přidají naučené měřítko γ a posun β; batch normalization průměruje přes příklady dávky, layer normalization přes neurony vrstvy. Při použití naučené sítě batch normalization místo μ a σ2 dávky dosadí jejich klouzavé průměry z učení (pseudokód níže).
Místo spoléhání na šťastnou inicializaci se čísla po každé vrstvě srovnají na stejnou velikost. Ve stejném pokusu jako výše: tanh s příliš malými vahami, kde aktivace jinak zmizely na 7 · 10⁻¹⁰, má s normalizací vrstev velikost aktivací kolem 0,63 ve všech dvaceti vrstvách. Transformery v jazykových modelech mají layer normalization v každém bloku.
Obě normalizace počítají pro každý vážený součet zi totéž; liší se jen tím, přes co se berou průměr a rozptyl:
yi = γ · zi − μ/√σ2 + ε + β
- zi − μ
- posun do nuly — μ je průměr přes dávku (batch norm) nebo přes neurony vrstvy (layer norm); tanh a sigmoida jsou nejcitlivější kolem nuly a ReLU tam má zlom
- √σ2 + ε
- dělení směrodatnou odchylkou — srovná velikost na 1 bez ohledu na to, jak velké váhy byly; malé ε (v PyTorchi výchozí 10−5) chrání před dělením nulou, když jsou všechna z stejná
- γ
- naučené měřítko — kdyby síti víc vyhovovala jiná velikost, může si ji vrátit; s γ = σ a β = μ by normalizaci dokonce zrušila
- β
- naučený posun — totéž pro střed; zastoupí práh neuronu, který by se jinak odečtením průměru ztratil
Příklad — normalizace čtyř čísel
Dávka čtyř příkladů dá jednomu neuronu vážené součty z = (1, 2, 3, 6). Průměr μ = 12/4 = 3, rozptyl σ2 = (−2)2 + (−1)2 + 02 + 32/4 = 14/4 = 3,5, směrodatná odchylka √3,5 = 1,871 (ε zanedbáme). Normalizované hodnoty jsou
(−2, −1, 0, 3)/1,871 = (−1,069; −0,535; 0; 1,604)
— průměr 0, rozptyl 1. S počátečními γ = 1 a β = 0 jsou to rovnou výstupy. Barvy podle vzorce výše: zi − μ jsou čísla (1, 2, 3, 6) minus 3.
# batch normalization jednoho neuronu
při učení, pro dávku z_1 … z_m:
μ = průměr(z)
σ² = průměr((z − μ)²)
y = γ · (z − μ) / √(σ² + ε) + β
μ_běh = 0,9 · μ_běh + 0,1 · μ # klouzavé průměry pro pozdější použití
σ²_běh = 0,9 · σ²_běh + 0,1 · σ²
při použití, pro jediný příklad z:
y = γ · (z − μ_běh) / √(σ²_běh + ε) + β
# layer normalization: μ a σ² přes neurony vrstvy jednoho příkladu,
# stejně při učení i při použití, žádné klouzavé průměry
Váhu 0,1 klouzavého průměru má PyTorch jako výchozí. Rozdíl mezi učením a použitím je u batch normalization nutný: jeden příklad dávku nemá, a výsledek nesmí záviset na tom, s čím jiným zrovna přišel.
7. Pokus: hluboká síť na dvou měsících
Dva měsíce z minulého dílu, tentokrát síť se šesti skrytými vrstvami po 12 neuronech, stejný gradientní sestup, čtyři různé kombinace aktivace a inicializace. Ztrátou je křížová entropie: síť vrací pravděpodobnost p, že bod patří do třídy 1, a za každý z N trénovacích bodů se třídou y ∈ {0, 1} zaplatí
E = −1/N ∑k=1N [ yk ln pk + (1 − yk) ln(1 − pk) ]
- y ln p
- platí jen pro body třídy 1 (pro y = 0 je nulový) — logaritmus pravděpodobnosti, kterou síť dala správné odpovědi; ln p jde k −∞, když je síť sebejistě vedle, takže sebejistý omyl stojí nejvíc
- (1 − y) ln(1 − p)
- totéž pro body třídy 0, kde je správná odpověď „ne“ s pravděpodobností 1 − p; jedna rovnice tak pokryje obě třídy
Příklad — co znamenají čísla na svislé ose
Bod třídy 1 a odhad p = 0,9 stojí −ln 0,9 = 0,105; odhad p = 0,1 stojí −ln 0,1 = 2,303. Síť, která o ničem neví a na všechno odpoví p = 0,5, platí za každý bod −ln 0,5 = ln 2 = 0,693 (u bodu třídy 0 stejně −ln(1 − 0,5)) — proto je 0,693 hranice „nic jsem se nenaučil“. Barvy podle vzorce výše: u bodu třídy 1 (y = 1) zbude jen člen y ln p = ln p.
ReLU s Heovou inicializací a tanh s Xavierem srazí ztrátu už během prvních 20 epoch (na 0,351 a 0,121). Obě pak chvíli poskakují — krok učení 0,5 je pro ně skoro moc velký a tanh kolem 100. epochy na chvíli vyskočí až na 0,597 — ale po 200 epochách má ReLU 0,001 a tanh 0,005. Sigmoida s N(0, 1) se prvních sto epoch skoro nehne (z 0,713 na 0,496), protože gradient k prvním vrstvám dorazí zeslabený, a po 200 epochách je teprve na 0,218. ReLU s příliš malými vahami se nenaučí nic — ztráta zůstane na 0,693, tedy ln 2, což je výsledek sítě, která na všechno odpoví „50 %“. Tři úspěšné sítě skončily po 600 epochách na nových bodech kolem 98,5 % — rozdíl nebyl v tom, jestli se naučí, ale jak rychle, a jedna nevhodná konstanta učení zablokovala úplně.
8. Co se používá dnes
- ReLU a příbuzné. ReLU se prosadila kolem roku 2010 (Vinod Nair a Geoffrey Hinton) a hlavně s AlexNetem v roce 2012. Jazykové modely používají její hladké varianty jako GELU (Dan Hendrycks a Kevin Gimpel, 2016).
- Inicializace podle aktivace. Knihovny mají jako výchozí inicializaci škálovanou podle počtu vstupů (Keras Xavierovu, PyTorch podobnou rovnoměrnou); Heovu pro ReLU stačí zapnout. Vrstvy se tak nastaví, aby signál prošel.
- Normalizace. Obrazové sítě používají batch normalization, transformery layer normalization.
- Reziduální spojení. Další trik, díky kterému se učí sítě se stovkami vrstev: vstup vrstvy se přičte k jejímu výstupu, takže gradient má „dálnici“, po které projde beze ztráty.
Definice — reziduální blok
Nechť d ≥ 1 a F : ℝd → ℝd je diferencovatelná funkce, typicky složení několika obyčejných vrstev, jejichž výstup má stejný rozměr jako vstup. Reziduální blok (He a kol., 2015) je funkce R : ℝd → ℝd,
x ↦ y = R(x) = x + F(x).
Jeho Jacobiho matice (matice parciálních derivací ∂yi/∂xj, i, j = 1, …, d) je
∂y/∂x = I + ∂F/∂x,
kde I ∈ ℝd×d je jednotková matice. Zpětný signál se v bloku nenásobí jen derivací F, ale dostane i nezměněnou kopii přes jednotkovou matici I. I když jsou derivace uvnitř F skoro nulové, jako u nasycené sigmoidy výše, signál projde celý a součin přes desítky bloků nespadne k nule.
9. Shrnutí
- Derivace aktivace určuje, kolik chybového signálu projde: sigmoida nejvýš 0,25, tanh a ReLU až 1.
- V hluboké síti se činitele násobí: gradient mizí, nebo exploduje (u tanh s N(0, 1) poměr 127 000).
- Inicializace podle počtu vstupů udrží signál: Xavier pro tanh (poměr gradientů 1,00), He pro ReLU.
- Stejné počáteční váhy se nikdy nerozdělí: čtyři skryté neurony zůstaly totožné a XOR se nenaučil.
- Normalizace vstupů snížila počet kroků z 14 822 na 1, normalizace vrstev udrží aktivace i při špatné inicializaci.
- Na hluboké síti rozhodla volba o rychlosti: po 200 epochách ReLU s He 0,001, sigmoida 0,218, ReLU s malými vahami se nepohnula.
Chcete si to osahat? Nechte AI agenta postavit síť s dvaceti vrstvami v PyTorchi a vypsat velikost gradientu v každé vrstvě po jednom kroku — jednou se sigmoidou, jednou s ReLU a Heovou inicializací.
Máte na to jiný názor? Napište na support@coden-app.com.