Přeučení a regularizace: proč model, který zná data nazpaměť, selže
Polynomiální regrese na dvanácti bodech ze sinusovky, trénovací a testovací chyba, rozklad na vychýlení a rozptyl, hřebenová a lasso regularizace, vliv počtu dat, validace a dvojitý sestup moderních sítí.
Série Základy AI Díl 43 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č trénovací chyba s rostoucí složitostí klesá a testovací nakonec roste.
- Co je vychýlení a rozptyl a proč je správná složitost modelu jejich rovnováha.
- Jak přeučení krotí regularizace, víc dat a validační sada.
Co se hodí znát předem: Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další, Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
Student, který se na zkoušku naučí nazpaměť odpovědi na otázky z loňského testu, dostane na loňský test jedničku — a na letošní propadne. Totéž se děje modelům strojového učení. Model, který si zapamatuje trénovací data i s jejich náhodným šumem, na nich vypadá skvěle, ale na nových datech selže. Tomu se říká přeučení a je to asi nejčastější past strojového učení. V tomhle dílu ji uvidíme na nejjednodušším možném příkladu — a ukážeme si, jak se jí bránit.
Navazuje na díly Druhy strojového učení a Statistika a odhady parametrů.
1. Úloha: dvanáct bodů ze sinusovky
Příklad z učebnice Christophera Bishopa: skutečná souvislost je y = sin(2πx) na intervalu [0, 1], ale vidíme jen 12 bodů, ke kterým je přičtený šum se směrodatnou odchylkou 0,25. Model se má z těch dvanácti bodů naučit předpovídat y pro libovolné x. Úspěch měříme na 201 bodech, které model nikdy neviděl.
Definice — polynomiální regrese
Nechť n ∈ ℕ, n ≥ 1, a (x1, y1), …, (xn, yn) ∈ ℝ × ℝ jsou trénovací body a d ∈ ℕ ∪ {0} je stupeň. Polynomiální model stupně d s parametry w = (w0, …, wd) ∈ ℝd+1 je funkce
fw : ℝ → ℝ, fw(x) = w0 + w1x + … + wdxd = ∑k=0d wkxk.
Polynomiální regrese volí parametry metodou nejmenších čtverců, tj. jako
ŵ ∈ argminw ∈ ℝd+1 ∑i=1n (yi − fw(xi))2,
a naučený model je fŵ.
Hledáme křivku, která body proloží co nejtěsněji. Stupeň d určuje, jak moc se křivka smí ohýbat: stupeň 1 je přímka, stupeň 3 má dva ohyby, stupeň 11 jich má deset. Čím vyšší stupeň, tím víc parametrů a tím víc volnosti.
ŵ = argminw ∑i=1n ( yi − fw(xi) )2
- ŵ = argminw
- nehledáme nejmenší hodnotu součtu, ale koeficienty, při kterých nastane — ty pak tvoří naučený model
- ∑i=1n
- chyby všech dvanácti bodů se sčítají, takže se křivka nemůže „zavděčit“ jen některým — každý bod za ni tahá
- yi
- naměřená hodnota i se šumem (jantarové body v grafu); model nic jiného než tyhle body nevidí, skutečnou sinusovku nezná
- fw(xi)
- co v tomtéž xi předpovídá křivka (zelená v grafu); rozdíl s yi je svislá vzdálenost bodu od křivky
- 2
- čtverec udělá z chyby nahoru i dolů kladné číslo (jinak by se odečetly), velké odchylky trestá víc než malé a dává hladkou funkci, jejíž minimum se dá spočítat přesně (normální rovnice níže)
Věta — normální rovnice
Nechť (x1, y1), …, (xn, yn) ∈ ℝ × ℝ, d ∈ ℕ ∪ {0}, y = (y1, …, yn)T ∈ ℝn a Φ ∈ ℝn×(d+1) je matice s prvky Φik = xik pro i = 1, …, n a k = 0, …, d (řádek = bod, sloupec = mocnina; x0 = 1). Pak fw(xi) je i-tá složka vektoru Φw, součet čtverců je ‖y − Φw‖2 (‖·‖ je eukleidovská norma) a platí: w ∈ ℝd+1 je minimem součtu čtverců, právě když splňuje normální rovnice
ΦTΦ w = ΦTy.
Má-li navíc Φ lineárně nezávislé sloupce, je minimum jediné: ŵ = (ΦTΦ)−1ΦTy.
Důkaz: ‖y − Φw‖2 = yTy − 2wTΦTy + wTΦTΦw; gradient podle w je −2ΦT(y − Φw) a v minimu musí být nulový. Funkce je konvexní (Hessova matice 2ΦTΦ je pozitivně semidefinitní), takže každý bod s nulovým gradientem je minimum. Má-li Φ lineárně nezávislé sloupce — stačí aspoň d + 1 různých xi —, je ΦTΦ regulární a minimum jediné. ∎
Příklad — přímka přes našich 12 bodů ručně
Pro stupeň 1 má Φ dva sloupce: samé jedničky a hodnoty xi. Normální rovnice jsou pak jen dvě: nw0 + (∑x)w1 = ∑y a (∑x)w0 + (∑x2)w1 = ∑xy. Z našich bodů vyjde ∑x = 6,029, ∑x2 = 4,004, ∑y = −1,049 a ∑xy = −2,390:
12 w0 + 6,029 w1 = −1,049
6,029 w0 + 4,004 w1 = −2,390
Determinant soustavy je D = 12 · 4,004 − 6,0292 = 11,693. Podle Cramerova pravidla
w0 = 4,004 · (−1,049) − 6,029 · (−2,390)/11,693 = 0,873,
w1 = 12 · (−2,390) − 6,029 · (−1,049)/11,693 = −1,912.
Nejlepší přímka je y = 0,873 − 1,912x: klesá, protože první půlka bodů leží nad nulou a druhá pod ní. Vlna sinusovky jí uniká celá.
Přímka (stupeň 1) je moc tuhá — vlnu sinusovky vůbec nezachytí. Tomu se říká nedoučení. Stupeň 3 vystihne tvar dobře. A stupeň 11 má dvanáct parametrů na dvanáct bodů, takže projde všemi body přesně — a mezi nimi divoce kmitá, u okrajů daleko mimo graf.
Věta — interpolace polynomem
Nechť n ∈ ℕ, n ≥ 1, a (x1, y1), …, (xn, yn) ∈ ℝ × ℝ jsou body, jejichž první souřadnice jsou navzájem různé (xi ≠ xj pro i ≠ j). Pak existuje právě jeden polynom f stupně nejvýš n − 1, pro který platí f(xi) = yi pro všechna i = 1, …, n.
Důkaz: podmínka „projde všemi body“ je soustava Φw = y s n rovnicemi a n neznámými w0, …, wn−1. Její matice je Vandermondova a má determinant ∏i < j (xj − xi), který je pro různá xi nenulový. Soustava má tedy jediné řešení. ∎
Pro nás: 12 bodů, stupeň 11, tedy 12 koeficientů. Polynom bodům vyhoví vždycky — ať v nich je sinusovka, šum, nebo cokoli jiného. Nulová trénovací chyba proto o modelu neříká vůbec nic.
2. Trénovací a testovací chyba
Definice — trénovací chyba, chyba zobecnění, přeučení
Nechť P je rozdělení dvojic (X, Y) na 𝒳 × ℝ, L : ℝ × ℝ → [0, ∞) ztrátová funkce (u nás L(ŷ, y) = (ŷ − y)2), D = ((xi, yi))i=1n trénovací sada vybraná z P a ℋ množina modelů h : 𝒳 → ℝ, ze kterých učení vybírá (např. všechny polynomy stupně nejvýš d). Pro h ∈ ℋ definujeme:
- trénovací chybu — průměrnou ztrátu na datech, ze kterých se model učil: errD(h) = 1/n ∑i=1n L(h(xi), yi);
- chybu zobecnění — očekávanou ztrátu na nové dvojici ze stejného rozdělení: errP(h) = E(X, Y) ∼ P[L(h(X), Y)]. P neznáme, proto errP odhadujeme průměrnou ztrátou na testovací sadě — dvojicích z P, které model při učení neviděl.
Model h ∈ ℋ je přeučený (T. Mitchell), právě když existuje jiný model h′ ∈ ℋ, pro který
errD(h) < errD(h′) a zároveň errP(h) > errP(h′).
Přeučený model je tedy lepší na trénovacích datech, ale horší na nových datech než nějaký jiný model, který měl učení k dispozici — typicky jednodušší. Poznávací znak: trénovací chyba je výrazně menší než chyba zobecnění.
Trénovací chyba je, jak dobře model zná učebnici. Testovací chyba je, jak dobře obstojí u zkoušky s novými otázkami. Zajímá nás jen ta druhá. Proto se testovací data musí schovat a nesmí se na ně podívat — ani při ladění modelu.
Definice — odmocnina střední kvadratické chyby (RMSE)
Nechť f̂ : ℝ → ℝ je model, n ∈ ℕ, n ≥ 1, a (x1, y1), …, (xn, yn) ∈ ℝ × ℝ je sada bodů. Odmocnina střední kvadratické chyby modelu f̂ na této sadě je číslo
RMSE = √1/n ∑i=1n (f̂(xi) − yi)2 ≥ 0.
Trénovací chyba je RMSE na 12 trénovacích bodech, testovací chyba RMSE na 201 testovacích bodech x = 0; 0,005; …; 1, kde y = sin(2πx) bez šumu.
RMSE = √1/n ∑i=1n ( f̂(xi) − yi )2
- f̂(xi) − yi
- o kolik se model v jednom bodě spletl; kladné i záporné podle toho, jestli střelil nad, nebo pod
- 2
- aby se chyby nahoru a dolů navzájem nevyrušily — a stejný čtverec, jaký model minimalizoval při učení
- 1/n ∑
- průměr místo součtu: chyby na 12 a na 201 bodech jsou pak srovnatelné, nezáleží na velikosti sady
- √
- vrací výsledek do jednotek y; „RMSE 0,2“ znamená, že se model typicky mýlí zhruba o 0,2
Přímka z příkladu výše má na trénovacích bodech RMSE 0,429 a na testovacích 0,454 — obojí zhruba stejně špatně, jak se na nedoučený model sluší.
Trénovací chyba s rostoucím stupněm jen klesá: ze 0,69 u konstanty na 0,19 u stupně 3 a na nulu u stupně 11. Testovací chyba nejdřív také klesá — u stupně 3 je nejmenší, 0,135 —, pak ale roste: u stupně 9 je 2,55 a u stupně 11 neuvěřitelných 19,3. Polynom stupně 11 je ze všech nejhorší, přestože trénovací data vystihuje dokonale. Typický obraz: trénovací chyba klesá pořád, testovací má tvar písmene U.
3. Vychýlení a rozptyl
Proč je jednoduchý model špatný jinak než složitý? Představme si, že bychom stejný pokus opakovali s mnoha různými sadami dvanácti bodů.
Věta — rozklad chyby na vychýlení a rozptyl
Nechť f : 𝒳 → ℝ je skutečná (neznámá) funkce a x ∈ 𝒳 pevný bod. Nechť
- nová hodnota v bodě x je y = f(x) + ε, kde ε je náhodná veličina s E[ε] = 0 a Var(ε) = σ2;
- D je náhodná trénovací sada a f̂ = f̂D model, který se z ní naučí, přičemž E[f̂(x)2] < ∞;
- ε je nezávislé na D.
Pak platí (střední hodnota se bere přes trénovací sady D i přes šum ε)
E[(y − f̂(x))2] = (E[f̂(x)] − f(x))2 + Var(f̂(x)) + σ2,
tedy vychýlení2 + rozptyl + neodstranitelný šum.
Důkaz: označme f̄ = E[f̂(x)] a rozepišme y − f̂ = (f − f̄) + (f̄ − f̂) + ε. Po umocnění a střední hodnotě zbudou jen tři čtverce: první člen je konstanta, E[f̄ − f̂] = 0 z definice f̄ a šum ε má nulovou střední hodnotu a je na trénovací sadě nezávislý, takže všechny smíšené součiny mají nulovou střední hodnotu. ∎
Vychýlení je systematická chyba: i kdybychom měli nekonečně mnoho trénovacích sad a modely zprůměrovali, přímka sinusovku nevystihne. Rozptyl je nestálost: složitý model se na každé sadě naučí něco úplně jiného, protože honí náhodný šum. Šum v datech neodstraní žádný model.
E[(y − f̂(x))2] = (E[f̂(x)] − f(x))2 + Var(f̂(x)) + σ2
- E[(y − f̂(x))2]
- čtverec chyby na novém bodě, zprůměrovaný přes všechny trénovací sady, které nám náhoda mohla dát — hodnotíme postup učení, ne jeden šťastný či nešťastný výsledek
- (E[f̂] − f)2
- vychýlení²: i průměr nekonečně mnoha modelů mine pravdu, když je tvar modelu špatný; přímka sinusovku neohne, ať jí dáme jakákoli data
- Var(f̂)
- rozptyl: jak moc se modely z různých sad liší mezi sebou; je tu proto, že model si odnese i náhodný šum své konkrétní sady
- σ2
- šum v samotném y (u nás 0,252 = 0,0625); je tam, protože i dokonalý model f̂ = f nový bod se šumem netrefí
Ze 200 opakování pokusu: přímky jsou si podobné (rozptyl 0,013), ale všechny špatně (vychýlení2 0,200). Polynomy stupně 9 jsou v průměru skoro správně (vychýlení2 0,024), jenže každý vypadá jinak (rozptyl 3,91). Stupeň 3 má obojí malé — 0,005 a 0,023. Hledat správnou složitost modelu znamená hledat rovnováhu mezi vychýlením a rozptylem.
Ta čísla jsme odhadli simulací — vzorec z věty se nedá spočítat přímo, protože střední hodnota je přes všechny možné trénovací sady. Nahradíme ji průměrem přes 200 vylosovaných sad a pak ještě zprůměrujeme přes 201 testovacích bodů x:
def vychyleni_rozptyl(d, pocet=200, n=12):
modely = [proloz(nova_sada(n), d) for _ in range(pocet)]
b2 = v = 0
for x in testovaci_x: # 201 bodů z [0, 1]
p = [f(x) for f in modely] # 200 předpovědí v jednom bodě
m = prumer(p) # odhad E[f̂(x)]
b2 += (m - sin(2*pi*x)) ** 2 # vychýlení² v bodě x
v += prumer([(q - m) ** 2 for q in p]) # rozptyl v bodě x
return b2 / len(testovaci_x), v / len(testovaci_x)
Příklad — složíme očekávanou chybu
Sečtěme tři členy rozkladu (na čtyři desetinná místa, šum σ2 = 0,0625):
- stupeň 1: 0,1996 + 0,0130 + 0,0625 = 0,2751 — přes dvě třetiny dělá vychýlení,
- stupeň 3: 0,0052 + 0,0233 + 0,0625 = 0,0910 — největší člen je šum, se kterým nic nenaděláme,
- stupeň 9: 0,0242 + 3,9103 + 0,0625 = 3,9970 — skoro všechno je rozptyl.
(Barvy podle rozkladu výše: vychýlení², rozptyl, šum a jejich součet, očekávaná chyba.)
Bez šumu (proti čisté sinusovce, jak měříme testovací chybu) zbudou jen první dva členy. Pro stupeň 3 je to 0,0285 a odmocnina √0,0285 ≈ 0,169: zhruba takovou testovací RMSE čekáme od „průměrné“ sady dvanácti bodů. Naše jedna sada s 0,135 vyšla o něco lépe než průměr.
4. Regularizace: trest za složitost
Ubrat stupeň polynomu je hrubý zásah. Jemnější je nechat modelu volnost, ale trestat ho za to, když ji využívá. Přeučený polynom stupně 11 má obrovské koeficienty (velikost vektoru w je asi 6 000), které se navzájem vyvažují — právě proto kmitá.
Definice — hřebenová (L2) a lasso (L1) regularizace
Nechť (x1, y1), …, (xn, yn) ∈ ℝ × ℝ jsou trénovací body, fw polynomiální model s parametry w = (w0, …, wd) ∈ ℝd+1 a λ ≥ 0 parametr, který řídí sílu trestu. Pro w ∈ ℝd+1 označme ‖w‖22 = ∑j=0d wj2 a ‖w‖1 = ∑j=0d |wj|.
- Hřebenová regrese (L2) volí ŵ ∈ argminw ∈ ℝd+1 [∑i=1n (yi − fw(xi))2 + λ ‖w‖22].
- Lasso (L1) volí ŵ ∈ argminw ∈ ℝd+1 [∑i=1n (yi − fw(xi))2 + λ ‖w‖1].
Pro λ = 0 jsou obě obyčejné nejmenší čtverce. Hřebenová regrese má pro λ > 0 řešení v uzavřeném tvaru ŵ = (ΦTΦ + λI)−1 ΦTy s maticí Φ z normálních rovnic a jednotkovou maticí I řádu d + 1 (věta níže); lasso v uzavřeném tvaru obecně řešit nejde.
Absolutní člen w0 se obvykle netrestá — posunout celou křivku nahoru nebo dolů není žádná složitost. Tak to počítáme i my (v matici I je pak na místě w0 nula). Kvůli numerické stabilitě navíc mocníme t = 2x − 1 ∈ [−1, 1] místo x: je to tentýž model, jen jinak zapsaný, a i velikost ‖w‖ v textu je v tomhle zápisu.
Model může používat všech dvanáct parametrů, ale každý velký koeficient ho stojí body. Vyplatí se mu tedy jen ty, které chybu opravdu sníží. Křivka se uklidní, aniž bychom museli zvolit „správný“ stupeň. Lasso jde dál: nepotřebné koeficienty srazí přesně na nulu, a tak samo vybírá, které příznaky použít.
∑i (yi − fw(xi))2 + λ ‖w‖22
- ∑ (yi − fw(xi))2
- stará známá chyba na datech; bez ní by model nemusel data vůbec poslouchat a nejlepší by bylo w = 0
- λ
- kurz, kterým směňujeme složitost za přesnost; jediný knoflík, který volíme my (na validační sadě), ne učení — při λ = 0 jsme zpátky u přeučení, při obrovském λ u rovné čáry
- ‖w‖22
- součet čtverců koeficientů: kmitající polynom potřebuje obří, navzájem se rušící koeficienty, takže právě je trest zasáhne nejvíc; čtverec (ne absolutní hodnota) dělá z celé úlohy zase kvadratickou funkci s řešením v uzavřeném tvaru
Věta — řešení hřebenové regrese
Nechť Φ ∈ ℝn×p je libovolná matice, y ∈ ℝn, λ > 0 a I jednotková matice řádu p. Pak funkce w ↦ ‖y − Φw‖2 + λ‖w‖2 na ℝp má jediné minimum w = (ΦTΦ + λI)−1ΦTy — i když bodů je méně než parametrů.
Důkaz: gradient je −2ΦT(y − Φw) + 2λw; položíme ho roven nule a dostaneme (ΦTΦ + λI)w = ΦTy. Pro každé v ≠ 0 je vT(ΦTΦ + λI)v = ‖Φv‖2 + λ‖v‖2 > 0, matice je tedy pozitivně definitní, regulární a funkce ryze konvexní. ∎
Proti normálním rovnicím přibyl jen člen λI na diagonále.
Celý výpočet je pak krátký — sestavit ΦTΦ a ΦTy bod po bodu, přičíst λ na diagonálu a vyřešit soustavu lineárních rovnic Gaussovou eliminací:
def proloz(body, d, lam=0):
A = nuly(d + 1, d + 1) # bude ΦᵀΦ + λI
b = nuly(d + 1) # bude Φᵀy
for x, y in body:
phi = [(2*x - 1) ** k for k in range(d + 1)] # řádek Φ (mocniny t)
for i in range(d + 1):
b[i] += phi[i] * y
for j in range(d + 1):
A[i][j] += phi[i] * phi[j]
for i in range(1, d + 1): # w₀ se netrestá
A[i][i] += lam
return gauss(A, b) # vyřeš A·w = b
| λ | 0 | 0,0001 | 0,001 | 0,01 | 0,1 | 1 | 10 |
|---|---|---|---|---|---|---|---|
| chyba na tréninku | 0,000 | 0,096 | 0,115 | 0,170 | 0,236 | 0,400 | 0,573 |
| chyba na testu | 19,284 | 0,614 | 0,444 | 0,115 | 0,245 | 0,426 | 0,597 |
| velikost ‖w‖ | 6 037 | 15,1 | 8,8 | 4,0 | 2,2 | 0,91 | 0,28 |
I nepatrný trest λ = 0,0001 sníží chybu na testu z 19 na 0,61. S λ = 0,01 je 0,115 — dokonce o něco lépe než nejlepší polynom bez regularizace. Příliš silný trest ale model zase srazí k nedoučení: s λ = 10 je skoro rovná čára. Regularizace tedy jen posouvá otázku jinam — místo stupně hledáme λ. V rozkladu chyby je to vidět krásně: polynom stupně 9 s λ = 0,001 má vychýlení2 0,001 a rozptyl 0,09 místo 3,91.
Příklad — proč lasso nuluje a hřeben ne
Nejjednodušší případ: nechť a ∈ ℝ a λ > 0, jediný koeficient w a data, která by bez trestu chtěla w = a. Minimalizujeme (w − a)2 plus trest.
- Hřeben, (w − a)2 + λw2: derivace 2(w − a) + 2λw = 0 dává w = a/1 + λ. Koeficient se zmenší v poměru, ale nulový nebude nikdy (pro a ≠ 0).
- Lasso, (w − a)2 + λ|w|: pro w > 0 dává derivace 2(w − a) + λ = 0, tedy w = a − λ/2, a symetricky pro w < 0. Celkem w = sign(a) · max(|a| − λ/2, 0): od koeficientu se odečte pevná částka, a co je menší než λ/2, skončí přesně na nule.
S λ = 1: velký koeficient a = 2 hřeben stáhne na 2/2 = 1, lasso na 2 − 0,5 = 1,5. Malý a = 0,3 hřeben stáhne na 0,15, lasso na max(0,3 − 0,5, 0) = 0. Lasso tedy velké, užitečné koeficienty šetří a malé škrtá úplně.
5. Nejlepší lék: víc dat
Rozptyl modelu klesá s počtem trénovacích dat. Stejný polynom stupně 9, ale s větší trénovací sadou:
| Počet trénovacích bodů | 12 | 25 | 50 | 100 | 200 |
|---|---|---|---|---|---|
| chyba na testu (stupeň 9) | 0,640 | 0,134 | 0,091 | 0,089 | 0,050 |
S dvanácti body je stupeň 9 nepoužitelný, se dvěma sty je výborný. Složitý model není špatný sám o sobě — je špatný pro málo dat. Proto dnešní obří modely potřebují obří množství dat.
Věta — rozptyl a trénovací chyba metody nejmenších čtverců
Nechť
- model je lineární v p parametrech, fw(x) = ∑k=1p wkφk(x) pro pevné funkce φ1, …, φp (polynom stupně d má p = d + 1 a φk(x) = xk−1);
- body x1, …, xn jsou pevné (nenáhodné), n ≥ p, a matice Φ ∈ ℝn×p, Φik = φk(xi), má lineárně nezávislé sloupce;
- yi = f(xi) + εi, kde ε1, …, εn jsou nezávislé, E[εi] = 0 a Var(εi) = σ2;
- f̂ = fŵ je model naučený metodou nejmenších čtverců.
Pak
1/n ∑i=1n Var(f̂(xi)) = σ2 p/n.
Je-li navíc skutečná funkce v modelu (existuje w ∈ ℝp s f(xi) = fw(xi) pro všechna i), platí také
E[1/n ∑i=1n (yi − f̂(xi))2] = σ2 (1 − p/n)
(levá strana je očekávaná trénovací MSE). Jinak k pravé straně přibude nezáporný člen vychýlení 1/n ‖(I − H)f‖2 se značením z důkazu.
Náznak důkazu: předpovědi v trénovacích bodech jsou ŷ = Hy s H = Φ(ΦTΦ)−1ΦT. Matice H je projekce na prostor dimenze p, takže její stopa je p; součet rozptylů předpovědí je σ2 · stopa(H) = σ2p. Rezidua jsou (I − H)y, projekce na zbylých n − p rozměrů, a nesou šum σ2(n − p); leží-li f v prostoru sloupců Φ, je (I − H)f = 0 a jiný příspěvek rezidua nemají. ∎
rozptyl = σ2 · p/n
- rozptyl
- průměrný rozptyl předpovědi v trénovacích bodech — ta část chyby, kterou model přidá tím, že se učí z náhodné sady
- σ2
- šum v datech; čím je větší, tím víc nesmyslu si model z dat může odnést
- p
- počet parametrů: každý parametr je další „stupeň volnosti“, kterým se model může přizpůsobit šumu — rozptyl s ním roste lineárně
- n
- počet bodů: šum se mezi víc bodů rozpustí (průměruje), proto ve jmenovateli — dvakrát víc dat, poloviční rozptyl
Pro stupeň 9 (p = 10) a σ2 = 0,0625: při 12 bodech je to rozptyl = 0,0625 · 10/12 ≈ 0,052, při 200 bodech 0,0625 · 10/200 ≈ 0,003. Pozor, věta mluví jen o trénovacích bodech. Mezi nimi a hlavně u okrajů intervalu je rozptyl polynomu vysokého stupně mnohem větší — proto jsme na celém intervalu naměřili 3,91, ne 0,052 (a pomohlo k tomu i to, že každá z 200 sad měla body x jinde). Druhý vzorec vysvětluje, proč trénovací chyba lže: při 12 bodech a stupni 9 je v průměru jen 0,0625 · (1 − 10/12) ≈ 0,010, šestkrát míň než samotný šum, a u stupně 11 (p = n) přesně nula.
6. Jak zvolit správnou složitost
- Validační sada. Testovací data nesmíme použít k volbě stupně ani λ — tím bychom se na ně přeučili taky. Z trénovacích dat se proto oddělí ještě validační část a na ní se nastavení porovnává. Testovací sada se otevře až úplně na konci.
- Křížová validace rozdělí data na k částí a každou z nich postupně použije jako validační. Je spolehlivější při malém počtu dat; podrobně ji probere díl o vyhodnocení modelu.
- Brzké zastavení. Při učení gradientním sestupem se sleduje validační chyba a učení se zastaví, když začne růst — model nemá čas se šum naučit.
- Další regularizace v neuronových sítích: dropout (náhodné vypínání neuronů při učení), rozšiřování dat (pootočené, ořezané obrázky), útlum vah (weight decay — to je hřebenová regularizace pod jiným jménem).
Volba λ na validační sadě je obyčejné vyzkoušení kandidátů. Testovací data se v ní nevyskytují vůbec:
def zvol_lambda(trenink, validace, d, kandidati=[1e-4, 1e-3, 1e-2, 1e-1, 1, 10]):
nejlepsi = None
for lam in kandidati:
f = proloz(trenink, d, lam) # učí se jen z trénovacích dat
chyba = rmse(f, validace) # hodnotí se jen na validačních
if nejlepsi is None or chyba < nejlepsi[1]:
nejlepsi = (lam, chyba)
lam = nejlepsi[0]
return proloz(trenink + validace, d, lam) # nakonec se učí ze všeho, co smí
Brzké zastavení je totéž, jen kandidáty jsou kroky učení — a místo všech kroků předem se zastaví, když se validační chyba dlouho nezlepšuje:
def uc_s_brzkym_zastavenim(model, trenink, validace, trpelivost=10):
nejlepsi, vahy, bez_zlepseni = inf, model.vahy(), 0
while bez_zlepseni < trpelivost:
model.krok_gradientniho_sestupu(trenink)
chyba = model.chyba(validace)
if chyba < nejlepsi:
nejlepsi, vahy, bez_zlepseni = chyba, model.vahy(), 0
else:
bez_zlepseni += 1
model.nastav_vahy(vahy) # vrať se k nejlepšímu kroku
return model
7. Překvapení moderních sítí
Podle klasické teorie by neuronová síť s miliony parametrů naučená na desítkách tisíc obrázků měla být beznadějně přeučená. Často není. Kolem roku 2019 popsali Mikhail Belkin a kolegové dvojitý sestup: když počet parametrů roste dál za hranici, kde model dokáže trénovací data přesně zapamatovat, testovací chyba po vrcholu znovu klesá. Vysvětlením je mimo jiné implicitní regularizace — gradientní sestup mezi mnoha řešeními, která trénovací data přesně vystihují, najde to „nejjednodušší“. Náš polynom stupně 11 stál přesně na vrcholu: parametrů právě tolik jako bodů. Jedno ale platí pořád: o kvalitě modelu rozhodují data, která neviděl.
Věta — gradientní sestup najde řešení s nejmenší normou
Jednoduchá dnešní formalizace „implicitní regularizace“, zatím jen pro lineární model. Nechť n < p (parametrů je víc než bodů), Φ ∈ ℝn×p má lineárně nezávislé řádky a y ∈ ℝn; pak rovnici Φw = y splňuje nekonečně mnoho w ∈ ℝp. Nechť λmax je největší vlastní číslo matice ΦTΦ, 0 < η < 1/λmax, w0 = 0 a
wt+1 = wt − η ∇‖y − Φwt‖2 = wt + 2ηΦT(y − Φwt), t = 0, 1, 2, …
(gradientní sestup). Pak posloupnost wt konverguje k tomu řešení Φw = y, které má nejmenší ‖w‖:
w* = ΦT(ΦΦT)−1y.
Náznak důkazu: každý gradient −2ΦT(y − Φw) je tvaru ΦTu, takže w se z nuly nikdy nedostane mimo prostor řádků matice Φ. V tom prostoru je řešení Φw = y jediné, w*. Každé jiné řešení je w* + v s Φv = 0; takové v je kolmé na řádky, tedy na w*, a ‖w* + v‖2 = ‖w*‖2 + ‖v‖2. ∎
Nikdo tedy trest λ‖w‖2 nepřidal, a výsledek je přesto ten „nejklidnější“ možný — totéž, kam míří hřebenová regrese při λ → 0. U hlubokých sítí je situace složitější a je to dodnes předmět výzkumu.
8. Shrnutí
- Přeučený model zná trénovací data i s šumem a na nových datech selže; nedoučený je moc jednoduchý, aby zachytil i to podstatné.
- Trénovací chyba s rostoucí složitostí klesá, testovací má tvar U: na 12 bodech ze sinusovky je nejlepší stupeň 3 (0,135), stupeň 11 má na testu chybu 19,3.
- Chyba se rozkládá na vychýlení², rozptyl a šum; jednoduché modely mají velké vychýlení, složité velký rozptyl.
- Regularizace trestá velké parametry: stupeň 11 s λ = 0,01 dosáhl testovací chyby 0,115.
- Víc dat snižuje rozptyl; složitost a regularizaci volíme na validační sadě, nikdy na testovací.
Chcete si to osahat? Nechte AI agenta zopakovat tenhle pokus a přidat lasso — a podívejte se, které koeficienty polynomu srazí na nulu.
Máte na to jiný názor? Napište na support@coden-app.com.