Z kopce dolů: Gradient Descent a dva kroky, které všichni přeskakují
Spočítejte přesný strop rychlosti učení a sledujte, jak hrubé hledání ve 3 600 směrech znovu objeví gradient.
Na této stránce
Předchozí kapitola skončila údolím.
Ne metaforickým: skutečnou křivkou, ztrátou vykreslenou vůči jedinému parametru, která klesla dolů a zase se zvedla. A ztráta pod ní nebyla zvolená proto, že je úhledná — byla odvozena z tvrzení o šumu v měřeních a kvadratická chyba z toho vyšla jako důsledek, ne jako konvence.
Máme tedy krajinu se dnem a důvod věřit, že dno je správné místo. Co nemáme, je způsob, jak se tam dostat.
Tato kapitola jeden postaví. A je to algoritmus, který trénuje každý model ve zbytku tohoto kurzu — každý bez výjimky, až po ty se stovkami miliard parametrů. Vejde se zhruba do dvaceti řádků. Dvě těžké části v těch dvaceti řádcích nejsou a jsou to dvě věci, které skoro každé vysvětlení přeskakuje:
- Proč znaménko minus. Aktualizace odečítá gradient. Každý tutoriál to napíše; jen málokterý řekne, proč je gradient směr, který vede nahoru, což je jediný fakt, díky němuž je znaménko minus něčím jiným než aktem víry.
- Jak velký krok. „Příliš velký diverguje, příliš malý je pomalý“ je pravda a zároveň k ničemu. Existuje přesné číslo, dá se spočítat ze ztráty a tato kapitola ho spočítá dvakrát — jednou pro hračkovou parabolu a jednou pro skutečná data.
Nastavení a proč nemůžete prostě hledat
Odkaz na sekci: Nastavení a proč nemůžete prostě hledatAby tato kapitola stála sama o sobě: osm dílů z dopravního pásu z Kapitoly 1, ale s jinou otázkou. Ne přijmout, nebo odmítnout — k tomu se vrátíme později — ale předpovědět hmotnost dílu z jeho šířky.
import numpy as np
WIDTH = np.array([18.0, 19.5, 20.2, 21.0, 24.0, 25.5, 23.0, 26.0])
WEIGHT = np.array([47.0, 52.0, 49.0, 55.0, 61.0, 66.0, 70.0, 58.0])
x = WIDTH - WIDTH.mean() # 22.15 mm
y = WEIGHT - WEIGHT.mean() # 57.25 gMěření jsou centrovaná, přesně jako v Kapitole 1 a z důvodu, který se před koncem této kapitoly vrátí i s úroky. Model je přímka, , a ztráta je střední kvadratická chyba, kterou předchozí kapitola odvodila:
Dva parametry. Proč prostě nezkusit spoustu hodnot? Udělejme to opravdu — mřížku od do a od do , v krocích po :
grid 501 x 1001 = 501,501 evaluations in 3.67 s
best found: a = 2.1000, b = -0.0000, L = 24.592450Půl milionu vyhodnocení, abychom dvě čísla určili na dvě desetinná místa — a ta sekunda je nástěnný čas na jednom stroji, takže opakované spuštění vyjde kdekoli mezi třemi a šesti; počet vyhodnocení a minimum jsou ta část, která se reprodukuje. Gradient descent na konci této kapitoly dostane čtyři desetinná místa v osmi krocích a plnou odpověď float64 ve třiceti šesti.
Rychlost ale není argument, a právě tento bod rozhoduje o celém kurzu. Hledání v mřížce stojí vyhodnocení pro parametrů při hodnotách na každý. S tisíci hodnotami na osu:
| model | parametry | vyhodnocení mřížky |
|---|---|---|
| tato přímka | 2 | |
| síť XOR z Kapitoly 5 | 9 | |
| malá vícevrstvá síť | 20,000 |
Třetí řádek není velké číslo, je to nesmyslné číslo — v pozorovatelném vesmíru je zhruba atomů. Hledání s růstem modelů nezpomaluje; přestává existovat. Všechno, co následuje, existuje kvůli této tabulce.
Derivace je měření, které můžete provést
Odkaz na sekci: Derivace je měření, které můžete provéstNa chvíli zafixujte , takže zbude jeden parametr a jedna křivka, tedy obrázek, u kterého vás nechala minulá kapitola. Vezměte na ní bod, , a zeptejte se: když posunu o malou hodnotu , o kolik se ztráta pohne na jednotku posunu?
Tento poměr je stoupání ku běhu — sklon přímky procházející dvěma body na křivce. Jak se zmenšuje, oba body k sobě kloužou a přímka se stává tečnou. Její sklon je derivace : rychlost, s jakou se ztráta mění na jednotku změny v . Není to aproximace čehokoli ani nekonečně malá veličina. Je to limita obyčejných poměrů.
Stojí za to ji spustit, protože čísla říkají něco, co definice neříká:
def loss1(a):
return np.mean((a * x - y) ** 2)
for h in [1.0, 1e-2, 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14]:
q = (loss1(1.0 + h) - loss1(1.0)) / h
print(f"h = {h:<8.0e} slope estimate = {q:.10f} error = {abs(q + 16.385):.3e}")h = 1e+00 slope estimate = -8.9400000000 error = 7.445e+00
h = 1e-02 slope estimate = -16.3105500000 error = 7.445e-02
h = 1e-04 slope estimate = -16.3842555001 error = 7.445e-04
h = 1e-06 slope estimate = -16.3849925556 error = 7.444e-06
h = 1e-08 slope estimate = -16.3850003787 error = 3.787e-07
h = 1e-10 slope estimate = -16.3850444324 error = 4.443e-05
h = 1e-12 slope estimate = -16.3851154866 error = 1.155e-04
h = 1e-14 slope estimate = -17.0530256582 error = 6.680e-01Dějí se tu dvě věci a obě jsou nosné.
Chyba není neurčitě úměrná — je přesně . Vydělte stem a chyba se vydělí stem, pokaždé na čtyři platné číslice. Tato konstanta není ozdoba: je to polovina druhé derivace ztráty a je to první výskyt myšlenky za dvě sekce — že křivka poblíž bodu vypadá jako přímka plus korekce úměrná .
A pak se vzor zlomí. Pod se odhad zhoršuje a při je špatně už ve druhé číslici. Matematicky se nestalo nic; udělala to krabička s plovoucí desetinnou čárkou z minulé kapitoly. a se shodují v prvních deseti číslicích, jejich odečtení tyto číslice zničí a dělení trosek maličkým číslem zesílí to, co zbylo. Existuje nejlepší — tady kolem , zhruba odmocnina ze strojového epsilon — a jít níž není opatrnější, ale méně opatrné. Zapamatujte si to; závisí na tom funkce na konci této kapitoly.
Přesný sklon z kalkulu, nikoli z měření, je . Můžeme tedy přestat měřit a začít odvozovat.
Kompozice a řetězové pravidlo
Odkaz na sekci: Kompozice a řetězové pravidloTady je myšlenka, na které stojí zbytek kurzu, jednou a prostě řečeno.
Složit dvě funkce znamená poslat jednu do druhé: . Nic víc.
Hluboká síť není jako kompozice. Ona jí je. Vrstva je funkce; skládat vrstvy znamená skládat funkce; „hloubka“ je počet funkcí v řetězci. Když Kapitola 5 staví síť, staví a nic jiného. Což znamená, že pro naše účely je nejdůležitější pravidlo kalkulu to, které derivuje kompozici:
Rychlosti se násobí. Pokud se mění třikrát rychleji než a se mění dvakrát rychleji než , pak se mění šestkrát rychleji než . To je celý obsah a proto se signál procházející zpět deseti vrstvami násobí deseti čísly — a proto Kapitola 6 věnuje sekci tomu, co se stane, když jsou všechna tato čísla o něco menší než jedna.
Použijte to na naši ztrátu. Zapište reziduum , takže . Každé závisí na přes vnitřní funkci , jejíž derivace je . Řetězové pravidlo, člen po členu:
Ty kudrnaté symboly označují parciální derivaci: derivujte podle jedné proměnné a všechny ostatní berte jako konstanty. Neděje se nic nového — je to stejná limita jako předtím, jen vedená podél jedné osy. Posbírejte parciální derivace do vektoru a máte gradient:
V bodě je tento vektor . Dvě čísla. Otázka je, co znamenají, a to je první krok, který všichni přeskakují.
Proč gradient ukazuje do kopce
Odkaz na sekci: Proč gradient ukazuje do kopceGradient je vektor sklonů podél os. To je vše, co jsme dokázali. Není zřejmé — a nemělo by být zřejmé — že když je složíte do vektoru, vznikne něco, co ukazuje nějakým konkrétním směrem.
Definujme tedy věc, kterou skutečně chceme. Vyberte jednotkový vektor , směr. Směrová derivace je rychlost, s jakou se ztráta mění, když jdete tímto směrem:
Řetězové pravidlo z toho udělá něco vypočitatelného. Chůze podél mění rychlostí a rychlostí a příspěvky se sčítají:
Rychlost změny v libovolném směru je skalární součin gradientu s tímto směrem. A teď pointa, jeden řádek geometrie. Když skalární součin zapíšeme pomocí úhlu mezi vektory,
protože má délku 1. Jediné, co ovládáte, je , které je největší při a nejmenší při půlotáčce, stupních. Takže:
- Nejstrmější vzestup je podél samotného a sklon je tam přesně .
- Nejstrmější sestup je podél a sklon je tam .
- Kolmo na gradient se ztráta vůbec nemění. Proto vrstevnice na mapě protínají gradient v pravých úhlech.
To je znaménko minus. Ne konvence, ne obrácení znaménka, které si někdo vybral: směr nejrychlejšího poklesu je záporný gradient, protože je minimalizováno při půlotáčce, a z žádného jiného důvodu.
Protože je to tvrzení o všech směrech, otestujte ho proti všem směrům. Vzorkujte jich 3 600, jeden na každou desetinu stupně, a každý změřte malým posunem:
theta = np.array([1.0, 4.0])
g = grad(theta)
print("gradient ", g)
print("its length ", np.linalg.norm(g))
print("its angle ", np.degrees(np.arctan2(g[1], g[0])) % 360, "degrees")
best = max(
((loss(theta + 1e-6 * u) - loss(theta - 1e-6 * u)) / 2e-6, np.degrees(ang))
for ang, u in (
(a, np.array([np.cos(a), np.sin(a)])) for a in np.arange(3600) * 2 * np.pi / 3600
)
)
print("steepest slope", best[0], "at", best[1], "degrees")gradient [-16.385 8. ]
its length 18.23371122399386
its angle 153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degreesHledání, které o gradientech nic neví, najde mezi 3 600 směry nejstrmější stoupání na 154,0 stupních — ve vlastním směru gradientu, v rámci rozlišení hledání 0,1 stupně. A sklon, který tam najde, 18,2337, je délka gradientu na šest platných číslic. Věta není příběh o tom, co gradienty znamenají; je to měřitelný fakt, a toto je měření.
Proč malý krok z kopce opravdu pomůže
Odkaz na sekci: Proč malý krok z kopce opravdu pomůžeTeď druhý přeskakovaný krok. Víme, kterým směrem je dolů. Z toho neplyne, že krok tím směrem ztrátu sníží, protože „dolů“ je tvrzení o infinitezimálním posunu a krok infinitezimální není.
Mostem je linearizace. Poblíž bodu je hladká funkce její tečna plus korekce:
To je Taylorův rozvoj prvního řádu. Vyhozený člen je zakřivení — tentýž člen, kvůli kterému byl odhad v tabulce sklonů špatně přesně o . Dosaďte krok, který chceme udělat, :
Ztráta klesne o . Každá část je nezáporná, takže slib je skutečný — pro dostatečně malé , protože zanedbaný člen roste jako a nakonec ho sežere. To je celá teorie. Tady je slib splněný a pak porušený:
eta = 0.2 promised 66.49364500 delivered -16.01619240 ratio -0.240868
eta = 0.1 promised 33.24682250 delivered 12.61936315 ratio 0.379566
eta = 0.01 promised 3.32468225 delivered 3.11840766 ratio 0.937957
eta = 0.001 promised 0.33246822 delivered 0.33040548 ratio 0.993796
eta = 0.0001 promised 0.03324682 delivered 0.03322620 ratio 0.999380
eta = 1e-05 promised 0.00332468 delivered 0.00332448 ratio 0.999938Čtěte odspodu. Jak se zmenšuje, dodaný pokles konverguje ke slíbenému — poměr 0,99938, pak 0,99994 — což je Taylorova věta, která má pravdu. Čtěte shora a při je dodaný „pokles“ minus šestnáct. Krok šel z kopce a ztráta vzrostla.
Aktualizační pravidlo tedy je
a nese s sebou podmínku, kterou nikdo neříká: musí být dostatečně malé. Dostatečně malé vůči čemu přesně, to je další sekce.
Rychlost učení má strop a dá se spočítat
Odkaz na sekci: Rychlost učení má strop a dá se spočítatZačněte nejjednodušším údolím, jaké existuje, , kde . Jeden krok gradient descent je
Poloha se v každém kroku násobí . To je geometrická posloupnost a geometrické posloupnosti mají přesně jedno pravidlo: zmenšují se, když je násobitel v absolutní hodnotě menší než 1, a jinak rostou. Tedy , což je .
Hranice je přesně při . Ne „kolem 1“, ne „1 je obvykle moc velká“. Při je násobitel a bod navždy poskakuje mezi a , aniž by se přibližoval nebo utíkal. Pod ní konverguje; nad ní diverguje. Interval se znovu dělí při , kde násobitel mění znaménko: pod touto hodnotou je přibližování monotónní, nad ní bod přestřeluje a střídá strany, a přesně při je násobitel 0 a jediný krok dopadne do minima.
Čtyři režimy ze čtyř řádků algebry. Překročte hranice sami:
A teď ta zajímavá:
Teď obecné pravidlo, které plyne ze stejného argumentu. Násobitel byl ve skutečnosti a poblíž minima má víceproměnná ztráta jedno takové číslo pro každý směr — vlastní čísla matice druhých derivací. Každý směr musí být stabilní zároveň, takže strop určuje největší z nich:
Pro , , strop 1, což je přesně to, co jsme právě odvodili. Pro náš pás je matice druhých derivací , kde je dvousloupcová matice vstupů, a její vlastní čísla jsou 2 a 14,89, takže strop je . To je předpověď s pěti platnými číslicemi. Otestujte ji:
lr=0.1343 -> L = 24.5924
lr=0.13431 -> L = 24.5924
lr=0.13432 -> L = 4707.8 BLEW UP
lr=0.13433 -> L = 4.00452e+16 BLEW UP
lr=0.1344 -> L = 1.18229e+107 BLEW UPPět desetinných míst shody mezi jedním řádkem lineární algebry a stem tisíc iterací smyčky for.
A tady se vrací Kapitola 1. Všechno výše používalo centrovaná měření. Spusťte identický kód na surových milimetrech a gramech a vlastní čísla jsou 0,0298 a 998,1 místo 2 a 14,89. Strop se zhroutí z 0,134 na 0,002004 — stejně přesně, konverguje při lr=0.002003 a vybuchuje při lr=0.002004.
Horší než strop je poměr mezi vlastními čísly. Číslo podmíněnosti měří, jak daleko je údolí od kulatého tvaru: dlouhá úzká strouha vynutí rychlost dost malou pro strmé stěny a pak se po dně strouhy jde stejným plazením. U nás jde ze 7,44 při centrování na 33 452 u surových dat. S nejlepší rychlostí, kterou každá verze snese:
| příznaky | číslo podmíněnosti | nejlepší rychlost | kroky do 1 % od optima |
|---|---|---|---|
| centrované | 7,44 | 0,1184 | 10 |
| surové milimetry a gramy | 33 452 | 0,0020037 | 79 513 |
Stejná data, stejný kód, stejná odpověď na konci — a osm tisíckrát víc práce, protože nikdo neodečetl průměr. V Kapitole 1 stálo stejné opomenutí perceptron faktor šesti tisíc v epochách a diagnóza tam byla geometrická: data plula daleko od počátku. Tady je to stejná geometrie v optimalizačním kostýmu a proto normalizace vstupů není hygienická rada, ale aritmetika.1
Dvacet řádků
Odkaz na sekci: Dvacet řádkůNic z výše uvedeného nepotřebovalo knihovnu. Tady je celý optimalizér.
def loss(theta):
a, b = theta
return np.mean((a * x + b - y) ** 2)
def grad(theta):
a, b = theta
residual = a * x + b - y
return np.array([np.mean(2 * residual * x), np.mean(2 * residual)])
def descend(theta, lr, steps):
theta = np.array(theta, dtype=float)
for _ in range(steps):
theta = theta - lr * grad(theta)
return theta
theta = descend([0.0, 0.0], lr=0.05, steps=60)
print(theta, loss(theta))[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984Uzavřené řešení nejmenších čtverců pro těchto osm bodů je , , se ztrátou . Smyčka ho našla na osm platných číslic, aniž věděla, že uzavřený tvar existuje — což je důležité, protože od Kapitoly 5 dál žádný nebude.
Trajektorie, protože dívat se na ni je podstata:
0 a=0.000000 b=0.000000 L=57.437500
1 a=1.563750 b=0.000000 L=26.736582
2 a=1.963288 b=-0.000000 L=24.732418
5 a=2.098116 b=-0.000000 L=24.592488
10 a=2.100400 b=-0.000000 L=24.592449
60 a=2.100403 b=-0.000000 L=24.592449Většina vzdálenosti se urazí v prvních dvou krocích, protože gradient je největší, když jste nejdál od dna, a zmenšuje se, jak se přibližujete. Gradient descent u minima automaticky zpomaluje. Je to vlastnost a v Kapitole 6 je to také problém.
Kde jinde je sklon nulový
Odkaz na sekci: Kde jinde je sklon nulovýDosavadní argument má díru. Krok se zastaví, když , a my tomu říkáme „minimum“. Bod s nulovým gradientem je kritický bod a minimum je jen jeden ze způsobů, jak jím být:
- lokální minimum: do kopce ve všech směrech, ale nemusí to být nejnižší takový bod kdekoli;
- lokální maximum: z kopce ve všech směrech;
- sedlový bod: do kopce v některých směrech a z kopce v jiných. Plocha má , což je nula v počátku, kde je funkce zároveň minimum podél osy a maximum podél osy .
Gradient descent je nedokáže rozlišit, protože se vždy dívá jen na gradient a gradient je nulový u všech tří.
Naše přímka má jeden kritický bod a ten je odpovědí — ztráta kvadratické chyby nad lineárním modelem je konvexní, jediná mísa, a sestup po ní nemůže selhat při hledání globálního minima. Tato vlastnost kontakt s tímto kurzem nepřežije. Ztráta neuronové sítě není konvexní a od Kapitoly 5 dál „minimum“ není věc, která existuje: je jich mnoho, různě hlubokých, a které dostanete, závisí na tom, kde jste začali. Je to jedna věta a jednou větou zůstane, protože teorie je velká a praktický důsledek malý.
Celý důsledek uvidíte na jedné křivce. Vezměte , která má dvě údolí různé hloubky:
x = -1.046681 f(x) = -0.352386 minimum
x = 0.101031 f(x) = 0.005026 maximum
x = 0.945649 f(x) = -0.152639 minimumDopadnout do mělkého údolí je ve ztrátě o 56,7 % horší a algoritmus to nemá jak vědět, protože zevnitř údolí je každý směr do kopce. V gradient descent pro to neexistuje oprava a žádná nepřijde. V praxi ale existuje zjištění, že na tom záleží mnohem méně, než obrázek naznačuje — ve velmi vysokých dimenzích skutečné sítě se ukazuje, že většina kritických bodů jsou spíš sedla než pasti,2 a Kapitola 5 měří, jak často se malá síť opravdu zasekne.
Levnější kroky: stochastický, minibatch, momentum
Odkaz na sekci: Levnější kroky: stochastický, minibatch, momentumJedna věc na grad výše by vás měla trápit: pro každý krok sčítá přes celý dataset. Osm dílů není nic. Milion je milion výpočtů gradientu, aby se parametry pohnuly jednou.
Únik je v tom, že gradient je průměr a průměr lze odhadnout ze vzorku. Spočítejte ho na náhodné hrstce — minibatch — a udělejte podle něj krok. Odhad je šumový; je také nevychýlený a stovky levných šumových kroků porazí jeden drahý přesný. Na sto tisících syntetických dílů, počítáno podle gradientů na příklad, ne podle kroků:
| metoda | kroky do 0,1 % od optima | gradienty na příklad |
|---|---|---|
| full batch | 7 | 700 000 |
| minibatch o 32 | 100 | 3 200 |
| jeden příklad po druhém | 17 580 | 17 580 |
Dvě stě devatenáctkrát méně aritmetiky ke stejnému místu. A extrém — jeden příklad po druhém, původní stochastická aproximace Robbinse a Monra3 — není vítěz: je pětkrát horší než batche po 32, protože 32 příkladů nestojí skoro nic navíc oproti jednomu na hardwaru, který násobí matice, zatímco šum klesá s odmocninou velikosti batch. Právě kvůli tomuto kompromisu má každý trénovací skript, který kdy budete číst, v sobě batch_size.
Momentum je druhá levná oprava a míří přímo na strouhu. Ve špatně podmíněném údolí kroky kličkují přes úzký směr a zároveň se plazí podél dlouhého. Momentum udržuje běžící průměr minulých gradientů, takže oscilující složky se vyruší a konzistentní se hromadí:4
Dva řádky navíc. Na surovém necentrovaném pásu — číslo podmíněnosti 33 452, nejhorší případ, který máme — při nejlepší rychlosti, kterou prostý sestup snese:
momentum beta=0.0 -> 79,513 steps to 1%
momentum beta=0.9 -> 1,609 steps to 1%
momentum beta=0.99 -> 461 steps to 1%Faktor 172 za dva řádky kódu. Kapitola 6 z toho udělá Adam; mechanismus je už tady.
Kontrola, kterou budete potřebovat v Kapitole 5
Odkaz na sekci: Kontrola, kterou budete potřebovat v Kapitole 5Každý gradient v této kapitole byl odvozen ručně, a proto mohl být špatně. Opravou je tabulka sklonů ze začátku: změřte derivaci numericky a porovnejte. Použijte centrální diferenci, , která ruší vedoucí chybový člen a je při stejném mnohem přesnější.
def numeric_grad(f, theta, h=1e-5):
theta = np.asarray(theta, dtype=float)
out = np.zeros_like(theta)
for i in range(theta.size):
bump = np.zeros_like(theta)
bump[i] = h
out[i] = (f(theta + bump) - f(theta - bump)) / (2 * h)
return out
def gradcheck(f, df, theta, h=1e-5):
analytic = np.asarray(df(theta), dtype=float)
numeric = numeric_grad(f, theta, h)
return np.max(np.abs(analytic - numeric) / np.maximum(1e-8, np.abs(analytic) + np.abs(numeric)))Relativní forma porovnání je důležitá: absolutní rozdíl je katastrofa na gradientu velikosti a irelevantní na gradientu velikosti .
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744První řádek je ručně odvozený gradient výše. Druhý je stejná funkce s vynechaným faktorem 2 v jedné složce — překlep o jediný znak — a kontrola ho okamžitě zachytí. Cokoli pod zhruba je shoda; cokoli nad je bug. Tuto funkci si nechte: Kapitola 5 ji používá k ladění enginu automatické diferenciace a je to jediný důvod, proč je vůbec možné špatný gradient najít.
Kam to pokračuje dál
Odkaz na sekci: Kam to pokračuje dálVšechno v této kapitole stálo na jednom předpokladu, který nebyl nikdy vysloven: že umíte zapsat .
U přímky se dvěma parametry to byl řádek algebry. Téměř okamžitě to řádkem být přestane. Požádejte symbolický algebraický systém o derivaci ztráty sítě podle jediné váhy první vrstvy, pro jediný příklad, a spočítejte aritmetiku v odpovědi:
| síť | operace v jedné parciální derivaci |
|---|---|
| čtyři skryté jednotky, jedna vrstva | 40 |
| čtyři skryté jednotky, dvě vrstvy | 301 |
| čtyři skryté jednotky, tři vrstvy | 1 717 |
Třetí řádek je síť s 57 parametry — síť tak malá, že by v Kapitole 6 byla poznámkou pod čarou — a ruční vypsání jejího gradientu znamená asi 97 869 operací pro jeden trénovací příklad. Neexistuje notace, která by to zachránila. Zachrání to pozorování, že řetězové pravidlo aplikované na kompozici má obrovskou strukturu, že stejné mezivýsledky se objevují znovu a znovu a že jejich výpočet ve správném pořadí dá všechny derivace zhruba za cenu jednoho dopředného průchodu. To je Kapitola 5.
Nejdřív je tu ale menší problém a čeká hned teď.
Máme teď stroj, který se bude kutálet z kopce po libovolné diferencovatelné ztrátě. Namiřte ho na původní otázku pásu — přijmout, nebo odmítnout, cíl je 1 nebo 0 — dejte na výstup sigmoid, aby předpovídal pravděpodobnost, a minimalizujte kvadratickou chybu. Poběží. Také se sotva pohne, když se mýlí nejvíc, a gradient říká proč:
| výstup | predikce | pravda | gradient s kvadratickou chybou | gradient s cross-entropy |
|---|---|---|---|---|
| 0.5000 | 1 | |||
| 0.1192 | 1 | |||
| 0.0025 | 1 | |||
| 1 |
Model, který se mýlí se sebejistou katastrofálností — předpovídá 0,0000454, když odpověď je 1 — vyprodukuje gradient kvadratické chyby . Nemá tušení, že je v průšvihu. Druhý sloupec, ze ztráty, kterou jsme ještě neodvodili, hlásí 1,0: maximální naléhavost přesně tam, kde je zasloužená.
Což vyvolává otázku, kterou otevírá další kapitola. Minulá kapitola řekla, že ztráta je předpoklad o šumu a kvadratická chyba předpokládá Gaussův šum. Jaký model šumu má odpověď ano-ne — a jaká ztráta vyjde, když na něj použijete stejné odvození?
Zdroje a metoda
Odkaz na sekci: Zdroje a metodaMetoda je starší než všechny tyto práce: Cauchy ji popsal v poznámce pro Académie des Sciences v roce 1847 jako způsob řešení soustav rovnic chůzí z kopce po součtu jejich kvadratických reziduí. Vedle této kapitoly se vyplatí číst také An overview of gradient descent optimization algorithms od Sebastiana Rudera (arXiv:1609.04747), který pokrývá momentum až po Adam ve čtrnácti čtivých stranách; kapitolu 3 z Numerical Optimization od Nocedala a Wrighta (2. vyd., Springer, 2006), jejíž věta 3.3 dává rychlost konvergence nejstrmějšího sestupu na kvadratice pomocí čísla podmíněnosti — je to teorie za tím, proč podmíněnost rozhoduje o počtu kroků, i když řeší line search místo pevného stropu měřeného výše; nebo §5.8 a §7.1 z Mathematics for Machine Learning od Deisenrotha, Faisala a Onga pro stejnou látku s menší aparaturou; §6.1 z Princeovy Understanding Deep Learning a §4.3 z Deep Learning od Goodfellowa, Bengia a Courvilla; Dive into Deep Learning §12.1–12.3, kde je analýza minibatch s více měřeními, než se sem vejde; a kapitolu 4 z Géronovy Hands-On Machine Learning (3. vyd.), nejpraktičtější zpracování rychlosti učení jako věci, kterou ladíte, ne odvozujete. Poznámky MIT 6.390 dávají gradient descent před klasifikaci, stejně jako tento kurz a ze stejného důvodu.
Reference
Odkaz na sekci: Reference-
LeCun, Y., Bottou, L., Orr, G. B. and Müller, K.-R. Efficient BackProp, in Neural Networks: Tricks of the Trade (Springer, 1998), pp. 9–50. Sekce 4.3 uvádí doporučení a sekce 5.1 argument použitý v detailním boxu výše: centrování a škálování vstupů mění vlastní čísla matice druhých derivací, a tedy počet kroků, nejen numerické pohodlí. ↩
-
Dauphin, Y. N., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S. and Bengio, Y. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization, arXiv:1406.2572 (2014). Argument, že ve vysokých dimenzích jsou kritické body drtivě spíše sedla než lokální minima, protože minimum vyžaduje, aby se každý z tisíců směrů zakřivoval nahoru zároveň. ↩
-
Robbins, H. and Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics 22(3), pp. 400–407 (1951). Článek, který ukázal, že šumový odhad gradientu stačí, pokud se velikost kroku zmenšuje správným způsobem. ↩
-
Polyak, B. T. Some methods of speeding up the convergence of iteration methods. USSR Computational Mathematics and Mathematical Physics 4(5), pp. 1–17 (1964). Metoda heavy-ball, což je výše uvedená aktualizace momentum, dvacet dva let předtím, než backpropagation dorazila do tohoto oboru. ↩