Jak síť přimět trénovat a generalizovat
Šestivrstvá síť, jejíž loss se nehne z ln 2, opravená měření po měření. Pak double descent: 5 000 parametrů na 40 bodech.
Na této stránce
Síť z kapitoly 5 funguje. Má devět parametrů, naučí se XOR a její gradienty souhlasí s PyTorch na šestnáct desetinných míst.
Udělejte ji šest vrstev hlubokou a přestane se učit úplně. Ne pomalu — úplně. Tady je šestivrstvá síť na klasifikační úloze se dvěma spirálami, trénovaná 5000 kroků:
step 1: loss 0.693147
step 5000: loss 0.693147
accuracy: 50.0 %To číslo není náhodné. je binární křížová entropie modelu, který pro všechno vrací pravděpodobnost , a 50 % je hod mincí na vyváženém datasetu. Po pěti tisících krocích se síť nepohnula ani o jedinou číslici. Nic nespadlo, nic nevarovalo a gradienty jsou pořád přesně správně.
Tato kapitola je o mezeře mezi sítí, která běží, a sítí, která funguje. Má dvě poloviny, které vypadají jako různá témata, ale jsou stejná práce: dostat loss dolů a dostat ho dolů i na datech, která model nikdy neviděl.
Proč je šestivrstvá síť mrtvá
Odkaz na sekci: Proč je šestivrstvá síť mrtváZačněte tím, že se podíváte, místo abyste hádali. Prožeňte batch vstupů sítí a vypište směrodatnou odchylku aktivací v každé vrstvě a potom směrodatnou odchylku gradientů vah:
def profile(model, x):
h = x
for layer in model:
h = layer(h)
if isinstance(layer, (nn.Tanh, nn.ReLU)):
print(f"activation std: {h.std().item():.4f}")
model(x).sum().backward()
for p in model.parameters():
if p.dim() == 2:
print(f"gradient std: {p.grad.std().item():.2e}")Tři inicializace, stejná architektura, šest vrstev :
| inicializace | směrodatná odchylka aktivací, vrstvy 1→6 |
|---|---|
| normální, std | 0.0145 · 0.0016 · 0.0002 · 0.0000 · 0.0000 · 0.0000 |
| normální, std | 0.6573 · 0.9296 · 0.9585 · 0.9634 · 0.9637 · 0.9625 |
| Xavier | 0.1579 · 0.1493 · 0.1353 · 0.1333 · 0.1325 · 0.1403 |
| inicializace | směrodatná odchylka gradientu, první vrstva → poslední |
|---|---|
| normální, std | 3.20e-06 · 4.97e-07 · … · 6.40e-06 |
| normální, std | 1.94e+03 · 2.28e+02 · 1.22e+02 · 4.43e+01 · 1.85e+01 · 7.30e+00 |
| Xavier | 2.31e+00 · 4.50e-01 · 4.26e-01 · 3.89e-01 · 4.39e-01 · 4.73e-01 |
První řádek je síť výše a neučí se pomalu — už jí nezbyl žádný signál. Ve čtvrté vrstvě směrodatná odchylka aktivací podteče na nulu při zobrazení na čtyři desetinná místa. Každý vstup produkuje stejný výstup, výstup je konstanta a gradient konstanty je nic. Váhy byly inicializovány malé, aby to bylo „bezpečné“, a malé bylo fatální.
Druhý řádek je opačné selhání a stojí za pochopení, protože je proti intuici. Aktivace vypadají zdravě — kolem 0,96 — ale to je saturovaný, přitisknutý blízko své meze, přesně režim, u kterého kapitola 5 naměřila ztrátu faktoru téměř deset tisíc v gradientu. A přesto jsou gradienty obrovské: 1940 v první vrstvě. Obojí platí současně. Každý krok zpět násobí a se 128 vstupy s jednotkovou variancí má tento faktor zesílení asi , které přebije zmenšení ze saturovaného . Gradienty na cestě zpět rostou geometricky. To je exploding gradient a v každém skutečném trénovacím běhu během několika kroků vyrobí hodnoty loss nan.
Třetí řádek je to, co chcete: aktivace mají napříč hloubkou zhruba konstantní škálu, gradienty mají napříč hloubkou zhruba konstantní škálu. Nic neumírá, nic neexploduje.
Normalizace a která přežila
Odkaz na sekci: Normalizace a která přežilaDobrá inicializace opraví škálu v kroku nula. Neudrží ji pevně: váhy se hýbou a v kroku pět tisíc už pečlivý argument s variancí neplatí.
Normalizační vrstvy vynucují škálu průběžně. Vezměte vektor aktivací, odečtěte průměr, vydělte směrodatnou odchylkou a potom aplikujte naučenou škálu a posun , aby vrstva mohla normalizaci zrušit, pokud zjistí, že právě to chce:
Jediná skutečná otázka je přes co průměrujete. Batch normalizace3 bere a přes dimenzi batche, jednu statistiku na feature. Layer normalizace4 je bere přes features, jednu statistiku na příklad.
Ta volba vypadá drobně a rozhoduje téměř o všem dál:
BatchNorm způsobí, že výstup každého příkladu závisí na ostatních příkladech, které se náhodou ocitly v jeho batchi. Při trénování je to mírný regularizér. Při inferenci žádný batch není, takže musí udržovat průběžný průměr statistik nasbíraných během trénování — což znamená, že se vrstva chová jinak v trénovacím a evaluačním režimu, a zapomenout přepnout režim je jedna z nejčastějších chyb v oboru. Také degraduje s malými batchi a je nešikovná u sekvencí proměnné délky, protože „průměr přes batch na pozici 40“ se počítá z tolika sekvencí, kolik jich je náhodou tak dlouhých.
LayerNorm normalizuje každý příklad samostatně. Žádná závislost na batchi, žádné průběžné statistiky, stejné chování při trénování i inferenci, lhostejnost k velikosti batche, lhostejnost k délce sekvence. Každá z těchto vlastností je spíš požadavek než příjemnost ve chvíli, kdy generujete jeden token po druhém pro jednoho uživatele, což je místo, kam dospěje kapitola 13.
Proto je LayerNorm ta, se kterou se v kapitole 9 setkáte znovu beze změny: používá ji transformer blok a používá ji z důvodů v pravém sloupci, ne proto, že by abstraktně fungovala lépe.
Opravovat jednu věc po druhé, což je skutečná skill
Odkaz na sekci: Opravovat jednu věc po druhé, což je skutečná skillČtyři kandidátní opravy mrtvé sítě: Xavier inicializace, LayerNorm, reziduální spojení a Adam místo SGD. Pokušení je aplikovat všechny čtyři a jít dál. Udělejte to a nikdy nebudete vědět, která z nich rozhodla, a příště, až se to stane, nebudete mít metodu — jen rituál.
Tak je aplikujte po jedné. Stejný seed, stejná data, stejná architektura, 800 kroků:
| co bylo přidáno | konečný loss | přesnost |
|---|---|---|
| nic | 0.6931 | 50.0 % |
| Xavier inicializace | 0.5692 | 60.4 % |
| LayerNorm | 0.6230 | 61.5 % |
| reziduální spojení | 0.6651 | 56.6 % |
| Adam | 0.6787 | 58.7 % |
| všechny čtyři | 0.0000 | 100.0 % |
Čtěte tu tabulku tak, jak byste ji četli ve dvě ráno, a závěr zní: nic nefunguje samo, všechno funguje dohromady, takže deep learning je alchymie. Ten závěr je špatně a zjistit proč je nejužitečnější věc v této kapitole.
Dejte každému běhu šestkrát větší rozpočet — 5000 kroků místo 800 — a všechno se úplně změní:
| co bylo přidáno | konečný loss @ 5000 | přesnost |
|---|---|---|
| nic | 0.6931 | 50.0 % |
| Xavier inicializace | 0.0007 | 100.0 % |
| LayerNorm | 0.0002 | 100.0 % |
| reziduální spojení | 0.6653 | 56.7 % |
| Adam | 0.6908 | 53.4 % |
| Xavier + Adam | 0.0000 | 100.0 % |
| Xavier + LayerNorm | 0.0001 | 100.0 % |
Teď je obraz ostrý a je to diagnóza, ne rituál.
Inicializace sama to opraví. Normalizace sama to opraví. Každá řeší skutečnou nemoc — zhroucení dopředného signálu na nulu — a kterákoli z nich stačí. Při 800 krocích jen vypadaly jako částečný úspěch, protože problém už vyřešily a síť se teprve škrábala ven.
Reziduální spojení a Adam to neopraví při žádném rozpočtu. Ne proto, že by byly špatné, ale protože léčí jinou nemoc. Reziduální spojení dá gradientu cestu kolem blokující vrstvy; to má velkou hodnotu, když je problémem gradient, a žádnou hodnotu, když už je dopředný signál nula, protože zkratka kolem mrtvé vrstvy pořád nese mrtvou hodnotu. Adam přeškáluje krok každého parametru podle jeho vlastní historie gradientů; to pomáhá, když mají gradienty divoce odlišné velikosti, a neumí to vzkřísit síť, jejíž výstup nezávisí na vstupu.
A „nic“ je po pěti tisících krocích pořád přesně 0.6931. Ne 0.6929. Není to pomalé; je to mrtvé, a tento rozdíl je teď vidět způsobem, který předtím vidět nebyl, protože máte řádek s fungující opravou pro srovnání.
Zasloužit si PyTorch
Odkaz na sekci: Zasloužit si PyTorchOdteď tento kurz používá PyTorch. To by mělo být zasloužené, ne jen oznámené, takže tady je přesně to, co dělá a co už umíte udělat.
Optimalizér je pravidlo pro převod gradientů na aktualizace parametrů. Prostý gradient descent používá gradient. Momentum používá jeho průběžný průměr, což vyhlazuje šum a nabírá rychlost ve směrech, které zůstávají konzistentní:
v = beta * v + p.grad
p -= lr * v Adam5 udržuje dva průběžné průměry — gradientu a gradientu na druhou — a jeden dělí odmocninou druhého, takže každý parametr dostane krok škálovaný podle vlastní nedávné velikosti gradientu:
m = b1 * m + (1 - b1) * g # mean of the gradient
v = b2 * v + (1 - b2) * g * g # mean of the squared gradient
m_hat = m / (1 - b1 ** t) # bias correction: both averages start at zero
v_hat = v / (1 - b2 ** t)
p -= lr * m_hat / (v_hat.sqrt() + eps) Deset řádků. Spusťte oba proti torch.optim na stejném problému na 50 kroků:
SGD+momentum by hand [2.7781870365142822, -1.0304985046386719]
torch [2.7781870365142822, -1.0304983854293823] max |diff| = 1.19e-07
Adam by hand [0.4893140196800232, -0.46317872405052185]
torch [0.48931416869163513, -0.46317875385284424] max |diff| = 1.49e-07Shodné na přesnost float32. torch.optim.Adam je těchto pět řádků plus desítky let péče o okrajové případy a C++ kernel. To je obchod, který odteď děláte: ne magie výměnou za porozumění, ale rychlost výměnou za řádky, které už jste napsali.
Proč Adam existuje: zakřivení
Odkaz na sekci: Proč Adam existuje: zakřiveníObvyklé vysvětlení Adamu je „adaptivní learning rate pro každý parametr“, což je popis, ne důvod. Důvodem je geometrie a dá se měřit.
Vezměte loss, jehož zakřivení se mezi směry liší: strmý v jednom, mělký v druhém. SGD má jeden globální learning rate, takže musí zvolit hodnotu dost malou na to, aby byla stabilní v nejstrmějším směru — a tato hodnota je pak příliš malá pro mělký směr, kde postup leze. To způsobuje klasický obrázek gradient descent, který cikcak sestupuje úzkým údolím.
Dva poměry zakřivení, tři optimalizéry, 300 kroků a každý optimalizér dostane nejlepší learning rate ze sweepu, aby nikdo nebyl znevýhodněn:
| poměr zakřivení | SGD | SGD + momentum | Adam |
|---|---|---|---|
| 10 : 1 | chyba 0.000002 | chyba 0.000000 | chyba 0.000000 |
| 1000 : 1 | chyba 1.925485 | chyba 0.001432 | chyba 0.000000 |
| divergovalo při (1000:1) | 4 z 8 hodnot | 4 z 8 hodnot | 0 ze 6 hodnot |
Při poměru deset funguje všechno a není o čem mluvit. Při tisíci prosté SGD nedosáhne odpovědi při žádném vyzkoušeném learning rate — jeho nejlepší výsledek má stále chybu 1,93 — a při polovině hodnot rovnou diverguje. Adam dopadne přesně na target a nediverguje u žádné.
Ten poslední sloupec je praktický důvod, proč je Adam výchozí volba. Není to tak, že by Adam nacházel lepší řešení; na dobře podmíněných problémech se vyladěné SGD často vyrovná nebo ho překoná. Jde o to, že Adam je mnohem méně citlivý na learning rate, který jste zvolili, a skutečné sítě mají napříč svými miliony parametrů poměry zakřivení mnohem horší než tisíc.
Patří sem ještě dva díly a oba jsou jeden řádek. Gradient clipping přeškáluje vektor gradientu pokaždé, když jeho norma překročí práh, což z řádku „loss náhle vyskočí na obrovskou hodnotu“ v diagnostické tabulce udělá neudálost. A learning rate schedules: krátký warmup od téměř nuly během prvních několika set kroků, protože Adamovy odhady variance jsou odpad, dokud neviděly nějaké gradienty, a plnohodnotný krok provedený na odpadu může zničit inicializaci; potom cosine decay směrem k nule, protože končit běh se stejnou velikostí kroku, s jakou jste začali, znamená chvět se kolem minima místo toho, abyste se do něj usadili.
Druhá polovina: model, který dokonale fituje a nepředpovídá nic
Odkaz na sekci: Druhá polovina: model, který dokonale fituje a nepředpovídá nicVšechno dosud bylo o tom dostat loss dolů. Teď ta těžší polovina, protože klesající loss není cíl — je to zástupná veličina pro cíl a ta zástupná veličina selhává konkrétním a slavným způsobem.
Dvanáct bodů z hladké funkce s trochou šumu. Fitujte polynomy rostoucího stupně:
| stupeň | trénovací RMSE | testovací RMSE |
|---|---|---|
| 1 | 0.764499 | 0.6985 |
| 3 | 0.252605 | 0.3031 |
| 5 | 0.164437 | 0.1568 |
| 9 | 0.088960 | 0.2347 |
| 11 | 0.000000 | 1.2094 |
Stupeň 11 skrz 12 bodů projde každým jednotlivým přesně — trénovací chyba nula na šest desetinných míst — a na datech, která neviděl, je osmkrát horší než stupeň 5. Požádejte stupeň 3 a stupeň 11 o predikci v , těsně mimo trénovací rozsah:
degree 3: predicts -1.053 (truth -0.012)
degree 11: predicts +61.224 (truth -0.012)Šedesát jedna, kde je odpověď přibližně nula. Model se nenaučil funkci; naučil se dvanáct bodů a mezi nimi dělá to, co si aritmetika vynutí.
To je overfitting a jeho opak — stupeň 1, který křivku vůbec neumí reprezentovat a je špatný všude — je underfitting. Klasický výklad dělí očekávanou chybu modelu na tři části: bias, chyba z toho, že je model příliš tuhý na reprezentaci pravdy; variance, chyba z toho, že je model tak flexibilní, že honí šum v tomto konkrétním vzorku; a neredukovatelný šum, který neopraví nic. Jednoduché modely mají bias, flexibilní modely vysokou variance a klasický předpis je najít sladké místo uprostřed — stupeň 5 v tabulce výše.
Standardní nástroje všechny útočí na člen variance:
- L2 regularizace (weight decay) přidá k loss, táhne váhy k nule a činí funkci hladší. V tabulce výše dělá škodu největší koeficient stupně 11; penalizace velikosti ho zneškodní.
- L1 místo toho přidá . Rozdíl není kosmetický: gradient L2 je úměrný váze, a tedy se s váhou zmenšuje, blíží se nule, aniž by do ní došel, zatímco gradient L1 je konstanta , která tlačí celou cestu. L1 proto vytváří váhy, které jsou přesně nulové — vybírá features. L2 vytváří malé váhy. Použijte L2, když chcete hladkost, L1, když chcete řídkost.
- Dropout7 v každém trénovacím kroku vynuluje náhodnou podmnožinu aktivací, takže se žádná jednotka nemůže spoléhat na přítomnost žádné konkrétní jiné jednotky.
- Early stopping sleduje validační loss a zastaví, když se otočí nahoru.
- Data augmentation vyrábí další trénovací příklady z těch, které máte, čímž útočí na problém u zdroje: overfitting je nedostatek dat stejně jako přebytek parametrů.
- Cross-validation rozdělí data způsoby a trénuje krát, což koupí spolehlivý odhad testovací chyby, když máte příliš málo dat na samostatnou odloženou sadu.
Double descent aneb proč předchozí sekce není celý příběh
Odkaz na sekci: Double descent aneb proč předchozí sekce není celý příběhTeď fakt, který ten obrázek rozbije.
Příběh bias-variance říká, že za sladkým místem více parametrů znamená horší generalizaci. Moderní jazykové modely mají mnohem více parametrů, než klasická pravidla pro data, která vidí, dovolují, a generalizují skvěle. Obě tvrzení jsou pravdivá a sladit je je nejužitečnější věc v této kapitole.
Čtyřicet trénovacích bodů, dvacetirozměrné vstupy, náhodné ReLU features a počet features projetý od 2 do 5000 — s vybraným řešením s minimální normou pokaždé, když existuje mnoho řešení, která fitují:
| trénovací RMSE | testovací RMSE | |||
|---|---|---|---|---|
| 10 | 0.25 | 0.8822 | 1.2520 | 1.89 |
| 20 | 0.50 | 0.5962 | 1.1634 | 2.59 |
| 30 | 0.75 | 0.3896 | 1.5323 | 4.15 |
| 38 | 0.95 | 0.1769 | 3.7163 | 10.25 |
| 40 | 1.00 | 0.0000 | 5.8140 | 14.83 |
| 42 | 1.05 | 0.0000 | 3.1623 | 9.35 |
| 60 | 1.50 | 0.0000 | 1.1058 | 2.78 |
| 200 | 5.00 | 0.0000 | 0.6638 | 0.98 |
| 1500 | 37.50 | 0.0000 | 0.5859 | 0.33 |
| 5000 | 125.00 | 0.0000 | 0.5664 | 0.18 |
Čtěte to ve třech částech. Až do klasický příběh platí přesně: chyba klesá, potom začne růst. V — na interpolačním prahu, kde má model přesně dost parametrů na to, aby prošel každým trénovacím bodem — testovací chyba vrcholí, na 5,81, pětkrát hůř než malý model. Ten vrchol je klasické varování a je skutečný.
Pak znovu klesá. A klesá dál, za , za , až po , kde je testovací chyba 0,5664 lepší než nejlepší výsledek, kterého kdy dosáhl podparametrizovaný model. Model s 5000 parametry fitovaný na 40 bodů je nejlepší model v tabulce.
To je double descent,89 a mechanismus je vidět v posledním sloupci. Jakmile , existuje nekonečně mnoho nastavení parametrů, která přesně fitují trénovací data, a které získáte, závisí na tom, jak vybíráte. Řešení s minimální normou vybere to nejmenší a ukazuje, co to znamená: vrcholí na 14,83 přesně na prahu — kde existuje právě jedno interpolující řešení a jste s ním zaseknutí, jakkoli extrémní je — a potom monotónně klesá, jak roste, protože více parametrů znamená více interpolujících řešení na výběr, což znamená, že nejmenší dostupné řešení se zmenšuje. Při je norma 0,18, osmdesátkrát menší než na prahu.
Dodatečné parametry tedy nepřidávají složitost. Přidávají volbu a výběrové pravidlo tuto volbu utratí za jednoduchost. Regularizace není v loss funkci; je v algoritmu. Gradient descent z malé inicializace má zdokumentovaný sklon k řešením s malou normou, což je důvod, proč se toto chování objevuje ve skutečných sítích trénovaných běžným způsobem, a nejen v lineární algebře výše.
Praktický důsledek, na kterém závisí kapitola 10: „model má více parametrů než dat, takže bude overfitovat“ není platný argument. Bylo to dobré pravidlo, když modely žily vlevo od prahu. Všechno zajímavé teď žije daleko vpravo od něj, kde se pravidlo obrací.
Kam to pokračuje dál
Odkaz na sekci: Kam to pokračuje dálNástroje v této kapitole stačí k natrénování sítě, která funguje na datech, jež můžete dát do tabulky: řádky čísel, sloupec labelů.
Jazyk takový není. Než může model predikovat další slovo, musí něco rozhodnout, co vlastně „slovo“ je — a odpovědí nejsou ani písmena, ani slova, ale slovník, který se model naučí ze surových bytů trénovacích dat. Toto rozhodnutí, učiněné jednou před začátkem trénování, určuje, kolik věcí může model říct, kolik stojí požadavek a proč modely, které dokážou složit zkoušku z práva, neumí spolehlivě spočítat písmena ve slově strawberry.
Kapitola 7 staví tokenizer.
Zdroje a metoda
Odkaz na sekci: Zdroje a metodaPro reziduální spojení použitá výše viz He et al., Deep Residual Learning for Image Recognition (arXiv:1512.03385). Andrej Karpathy a jeho Building makemore Part 3: Activations & Gradients, BatchNorm prochází diagnostiku histogramů aktivací na skutečném modelu a je nejlepším praktickým zpracováním první poloviny této kapitoly. Přednášky 8 a 11–13 Yasera Abu-Mostafy Learning From Data podávají klasickou teorii generalizace pořádně, včetně částí, které tato kapitola zkomprimovala do odstavce.
Reference
Odkaz na sekci: Reference-
Glorot, X. a Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). Argument se zachováním variance reprodukovaný v rámečku výše. ↩
-
He, K., Zhang, X., Ren, S. a Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852 (2015). ↩
-
Ioffe, S. a Szegedy, C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167 (2015). Všimněte si, že vysvětlení „internal covariate shift“ v názvu bylo od té doby výrazně zpochybněno; vrstva funguje, původní výklad proč je sporný. ↩
-
Ba, J. L., Kiros, J. R. a Hinton, G. E. Layer Normalization. arXiv:1607.06450 (2016). ↩
-
Kingma, D. P. a Ba, J. Adam: A Method for Stochastic Optimization. arXiv:1412.6980 (2014). ↩
-
Loshchilov, I. a Hutter, F. Decoupled Weight Decay Regularization. arXiv:1711.05101 (2017). ↩
-
Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I. a Salakhutdinov, R. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR 15, s. 1929–1958 (2014). ↩
-
Belkin, M., Hsu, D., Ma, S. a Mandal, S. Reconciling modern machine-learning practice and the classical bias–variance trade-off. PNAS 116(32), s. 15849–15854 (2019). Článek, který tento jev pojmenoval. ↩
-
Nakkiran, P., Kaplun, G., Bansal, Y., Yang, T., Barak, B. a Sutskever, I. Deep Double Descent: Where Bigger Models and More Data Hurt. arXiv:1912.02292 (2019). Ukazuje efekt ve skutečných hlubokých sítích a také podél osy doby trénování, nejen osy velikosti modelu. ↩