Přeskočit na obsah
3/30Kapitola 3 z 30

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ě hledat

Aby 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.

belt.pyPYTHON
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 g

Měř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, y^=ax+b\hat{y} = a x + b, a ztráta je střední kvadratická chyba, kterou předchozí kapitola odvodila:

L(a,b)=1ni=1n(axi+byi)2L(a, b) = \frac{1}{n} \sum_{i=1}^{n} \left(a x_i + b - y_i\right)^2

Dva parametry. Proč prostě nezkusit spoustu hodnot? Udělejme to opravdu — mřížku od a=0a = 0 do 55 a od b=5b = -5 do 55, v krocích po 0.010.01:

TEXT
grid 501 x 1001 = 501,501 evaluations in 3.67 s
  best found: a = 2.1000, b = -0.0000, L = 24.592450

Pů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í kPk^P vyhodnocení pro PP parametrů při kk hodnotách na každý. S tisíci hodnotami na osu:

modelparametryvyhodnocení mřížky
tato přímka210610^{6}
síť XOR z Kapitoly 59102710^{27}
malá vícevrstvá síť20,0001060,00010^{60{,}000}

Třetí řádek není velké číslo, je to nesmyslné číslo — v pozorovatelném vesmíru je zhruba 108010^{80} 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ést

Na chvíli zafixujte b=0b = 0, 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=1a = 1, a zeptejte se: když posunu aa o malou hodnotu hh, o kolik se ztráta pohne na jednotku posunu?

L(a+h)L(a)h\frac{L(a + h) - L(a)}{h}

Tento poměr je stoupání ku běhu — sklon přímky procházející dvěma body na křivce. Jak se hh zmenšuje, oba body k sobě kloužou a přímka se stává tečnou. Její sklon je derivace L(a)L'(a): rychlost, s jakou se ztráta mění na jednotku změny v aa. 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á:

slope.pyPYTHON
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}")
TEXT
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-01

Dějí se tu dvě věci a obě jsou nosné.

Chyba není neurčitě úměrná hh — je přesně 7.445h7.445\,h. Vydělte hh 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á h2h^2.

A pak se vzor zlomí. Pod h=108h = 10^{-8} se odhad zhoršuje a při 101410^{-14} je špatně už ve druhé číslici. Matematicky se nestalo nic; udělala to krabička s plovoucí desetinnou čárkou z minulé kapitoly. L(a+h)L(a+h) a L(a)L(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ší hh — tady kolem 10810^{-8}, 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 16.385-16.385. Můžeme tedy přestat měřit a začít odvozovat.

Tady je myšlenka, na které stojí zbytek kurzu, jednou a prostě řečeno.

Složit dvě funkce znamená poslat jednu do druhé: (fg)(x)=f(g(x))(f \circ g)(x) = f(g(x)). 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í f4f3f2f1f_4 \circ f_3 \circ f_2 \circ f_1 a nic jiného. Což znamená, že pro naše účely je nejdůležitější pravidlo kalkulu to, které derivuje kompozici:

ddxf(g(x))=f(g(x))g(x)\frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x)

Rychlosti se násobí. Pokud se gg mění třikrát rychleji než xx a ff se mění dvakrát rychleji než gg, pak se ff mění šestkrát rychleji než xx. 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 ri=axi+byir_i = a x_i + b - y_i, takže L=1nri2L = \frac{1}{n}\sum r_i^2. Každé rir_i závisí na aa přes vnitřní funkci axia x_i, jejíž derivace je xix_i. Řetězové pravidlo, člen po členu:

La=1ni2rixi,Lb=1ni2ri1\frac{\partial L}{\partial a} = \frac{1}{n}\sum_i 2 r_i \cdot x_i, \qquad \frac{\partial L}{\partial b} = \frac{1}{n}\sum_i 2 r_i \cdot 1

Ty kudrnaté symboly \partial 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:

L=(La, Lb)\nabla L = \left( \frac{\partial L}{\partial a},\ \frac{\partial L}{\partial b} \right)

V bodě (a,b)=(1,4)(a, b) = (1, 4) je tento vektor (16.385, 8.0)(-16.385,\ 8.0). Dvě čísla. Otázka je, co znamenají, a to je první krok, který všichni přeskakují.

Gradient 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 u\mathbf{u}, směr. Směrová derivace je rychlost, s jakou se ztráta mění, když jdete tímto směrem:

DuL=limh0L(θ+hu)L(θ)hD_{\mathbf{u}} L = \lim_{h \to 0} \frac{L(\boldsymbol{\theta} + h\mathbf{u}) - L(\boldsymbol{\theta})}{h}

Řetězové pravidlo z toho udělá něco vypočitatelného. Chůze podél u\mathbf{u} mění aa rychlostí u1u_1 a bb rychlostí u2u_2 a příspěvky se sčítají:

DuL=Lau1+Lbu2=LuD_{\mathbf{u}} L = \frac{\partial L}{\partial a} u_1 + \frac{\partial L}{\partial b} u_2 = \nabla L \cdot \mathbf{u}

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 ϕ\phi mezi vektory,

Lu=Lucosϕ=Lcosϕ\nabla L \cdot \mathbf{u} = \lVert \nabla L \rVert \, \lVert \mathbf{u} \rVert \cos\phi = \lVert \nabla L \rVert \cos\phi

protože u\mathbf{u} má délku 1. Jediné, co ovládáte, je cosϕ\cos\phi, které je největší při ϕ=0\phi = 0 a nejmenší při půlotáčce, ϕ=180\phi = 180 stupních. Takže:

  • Nejstrmější vzestup je podél samotného L\nabla L a sklon je tam přesně L\lVert \nabla L \rVert.
  • Nejstrmější sestup je podél L-\nabla L a sklon je tam L-\lVert \nabla L \rVert.
  • 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 cosϕ\cos\phi 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:

directions.pyPYTHON
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")
TEXT
gradient       [-16.385   8.   ]
its length     18.23371122399386
its angle      153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degrees

Hledá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ůže

Teď 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:

L(θ+δ)=L(θ)+Lδ+O(δ2)L(\boldsymbol{\theta} + \boldsymbol{\delta}) = L(\boldsymbol{\theta}) + \nabla L \cdot \boldsymbol{\delta} + O(\lVert\boldsymbol{\delta}\rVert^2)

To je Taylorův rozvoj prvního řádu. Vyhozený člen O(δ2)O(\lVert\boldsymbol{\delta}\rVert^2) je zakřivení — tentýž člen, kvůli kterému byl odhad v tabulce sklonů špatně přesně o 7.445h7.445\,h. Dosaďte krok, který chceme udělat, δ=ηL\boldsymbol{\delta} = -\eta \nabla L:

L(θηL)L(θ)ηL2L(\boldsymbol{\theta} - \eta \nabla L) \approx L(\boldsymbol{\theta}) - \eta \lVert \nabla L \rVert^2

Ztráta klesne o ηL2\eta \lVert \nabla L \rVert^2. Každá část je nezáporná, takže slib je skutečný — pro dostatečně malé η\eta, protože zanedbaný člen roste jako η2\eta^2 a nakonec ho sežere. To je celá teorie. Tady je slib splněný a pak porušený:

TEXT
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 η\eta 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 η=0.2\eta = 0.2 je dodaný „pokles“ minus šestnáct. Krok šel z kopce a ztráta vzrostla.

Aktualizační pravidlo tedy je

θθηL(θ)\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta \nabla L(\boldsymbol{\theta})

a nese s sebou podmínku, kterou nikdo neříká: η\eta 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čítat

Začněte nejjednodušším údolím, jaké existuje, f(x)=x2f(x) = x^2, kde f(x)=2xf'(x) = 2x. Jeden krok gradient descent je

xxη2x=x(12η)x \leftarrow x - \eta \cdot 2x = x\,(1 - 2\eta)

Poloha se v každém kroku násobí (12η)(1 - 2\eta). 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 12η<1\lvert 1 - 2\eta \rvert < 1, což je 0<η<10 < \eta < 1.

Hranice je přesně při η=1\eta = 1. Ne „kolem 1“, ne „1 je obvykle moc velká“. Při η=1\eta = 1 je násobitel 1-1 a bod navždy poskakuje mezi xx a x-x, aniž by se přibližoval nebo utíkal. Pod ní konverguje; nad ní diverguje. Interval se znovu dělí při η=0.5\eta = 0.5, 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 0.50.5 je násobitel 0 a jediný krok dopadne do minima.

Čtyři režimy ze čtyř řádků algebry. Překročte hranice sami:

Počet kroků: 14, konec v x = -0.0836.

Zobrazit data v tabulce
Krokxf(x)
0⁨-1.9000⁩⁨3.6100⁩
1⁨-1.5200⁩⁨2.3104⁩
2⁨-1.2160⁩⁨1.4787⁩
3⁨-0.9728⁩⁨0.9463⁩
4⁨-0.7782⁩⁨0.6057⁩
5⁨-0.6226⁩⁨0.3876⁩
6⁨-0.4981⁩⁨0.2481⁩
7⁨-0.3985⁩⁨0.1588⁩
8⁨-0.3188⁩⁨0.1016⁩
9⁨-0.2550⁩⁨0.0650⁩
10⁨-0.2040⁩⁨0.0416⁩
11⁨-0.1632⁩⁨0.0266⁩
12⁨-0.1306⁩⁨0.0170⁩
13⁨-0.1045⁩⁨0.0109⁩
14⁨-0.0836⁩⁨0.0070⁩
Interaktivní gradientní sestup

Čtrnáct kroků s rychlostí 0,1, od x=1.9x = -1.9, končící na 0.0836-0.0836. Zvedněte rychlost na 0,5 a hned první krok dopadne na dno. Zvedněte ji na 0,9 a skončí na stejném 0.0836-0.0836 jako 0,1 — stejná vzdálenost, opačný styl, protože 12η\lvert 1 - 2\eta \rvert je 0,8 pro obě — ale dostane se tam cikcak přes údolí místo chůze po jedné straně.

A teď ta zajímavá:

Počet kroků: 14, konec v x = -1.9000.

Zobrazit data v tabulce
Krokxf(x)
0⁨-1.9000⁩⁨3.6100⁩
1⁨1.9000⁩⁨3.6100⁩
2⁨-1.9000⁩⁨3.6100⁩
3⁨1.9000⁩⁨3.6100⁩
4⁨-1.9000⁩⁨3.6100⁩
5⁨1.9000⁩⁨3.6100⁩
6⁨-1.9000⁩⁨3.6100⁩
7⁨1.9000⁩⁨3.6100⁩
8⁨-1.9000⁩⁨3.6100⁩
9⁨1.9000⁩⁨3.6100⁩
10⁨-1.9000⁩⁨3.6100⁩
11⁨1.9000⁩⁨3.6100⁩
12⁨-1.9000⁩⁨3.6100⁩
13⁨1.9000⁩⁨3.6100⁩
14⁨-1.9000⁩⁨3.6100⁩
Interaktivní gradientní sestup

Přesně na hranici. Čtrnáct kroků s rychlostí 1 a skončí na 1.9-1.9: přesně tam, kde začal, protože nedělal nic než odrážení. O jediný posun výš a odskoky rostou místo toho, aby držely; při 1,2 je za čtyři kroky mimo graf. Příliš velká rychlost nekonverguje pomalu. Nekonverguje vůbec.

Teď obecné pravidlo, které plyne ze stejného argumentu. Násobitel 12η1 - 2\eta byl ve skutečnosti 1ηf1 - \eta f'' 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:

η<2λmax\eta < \frac{2}{\lambda_{\max}}

Pro f(x)=x2f(x) = x^2, f=2f'' = 2, strop 1, což je přesně to, co jsme právě odvodili. Pro náš pás je matice druhých derivací 2nAA\frac{2}{n} A^{\top} A, kde AA je dvousloupcová matice vstupů, a její vlastní čísla jsou 2 a 14,89, takže strop je 2/14.89=0.134322 / 14.89 = 0.13432. To je předpověď s pěti platnými číslicemi. Otestujte ji:

TEXT
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 UP

Pě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ěnostinejlepší rychlostkroky do 1 % od optima
centrované7,440,118410
surové milimetry a gramy33 4520,002003779 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

Nic z výše uvedeného nepotřebovalo knihovnu. Tady je celý optimalizér.

descent.pyPYTHON
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))
TEXT
[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984

Uzavřené řešení nejmenších čtverců pro těchto osm bodů je a=2.100403a = 2.100403, b=0b = 0, se ztrátou 24.59244924.592449. 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:

TEXT
   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.592449

Vě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.

Dosavadní argument má díru. Krok se zastaví, když L=0\nabla L = \mathbf{0}, 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 f(x,y)=x2y2f(x,y) = x^2 - y^2f=(2x,2y)\nabla f = (2x, -2y), což je nula v počátku, kde je funkce zároveň minimum podél osy xx a maximum podél osy yy.

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 f(x)=x44x22+x10f(x) = \tfrac{x^4}{4} - \tfrac{x^2}{2} + \tfrac{x}{10}, která má dvě údolí různé hloubky:

TEXT
   x =  -1.046681   f(x) =  -0.352386   minimum
   x =   0.101031   f(x) =   0.005026   maximum
   x =   0.945649   f(x) =  -0.152639   minimum

Počet kroků: 40, konec v x = 0.9456.

Zobrazit data v tabulce
Krokxf(x)
0⁨0.1100⁩⁨0.0050⁩
1⁨0.1122⁩⁨0.0050⁩
2⁨0.1149⁩⁨0.0049⁩
3⁨0.1182⁩⁨0.0049⁩
4⁨0.1223⁩⁨0.0048⁩
5⁨0.1275⁩⁨0.0047⁩
6⁨0.1338⁩⁨0.0045⁩
7⁨0.1416⁩⁨0.0042⁩
8⁨0.1513⁩⁨0.0038⁩
9⁨0.1633⁩⁨0.0032⁩
10⁨0.1781⁩⁨0.0022⁩
11⁨0.1962⁩⁨0.0007⁩
12⁨0.2183⁩⁨-0.0014⁩
13⁨0.2453⁩⁨-0.0046⁩
14⁨0.2779⁩⁨-0.0093⁩
15⁨0.3170⁩⁨-0.0160⁩
16⁨0.3633⁩⁨-0.0253⁩
17⁨0.4172⁩⁨-0.0377⁩
18⁨0.4783⁩⁨-0.0535⁩
19⁨0.5455⁩⁨-0.0721⁩
20⁨0.6163⁩⁨-0.0922⁩
21⁨0.6869⁩⁨-0.1116⁩
22⁨0.7526⁩⁨-0.1277⁩
23⁨0.8092⁩⁨-0.1393⁩
24⁨0.8540⁩⁨-0.1463⁩
25⁨0.8868⁩⁨-0.1499⁩
26⁨0.9091⁩⁨-0.1516⁩
27⁨0.9236⁩⁨-0.1522⁩
28⁨0.9325⁩⁨-0.1525⁩
29⁨0.9379⁩⁨-0.1526⁩
30⁨0.9411⁩⁨-0.1526⁩
31⁨0.9430⁩⁨-0.1526⁩
32⁨0.9441⁩⁨-0.1526⁩
33⁨0.9448⁩⁨-0.1526⁩
34⁨0.9451⁩⁨-0.1526⁩
35⁨0.9454⁩⁨-0.1526⁩
36⁨0.9455⁩⁨-0.1526⁩
37⁨0.9455⁩⁨-0.1526⁩
38⁨0.9456⁩⁨-0.1526⁩
39⁨0.9456⁩⁨-0.1526⁩
40⁨0.9456⁩⁨-0.1526⁩
Interaktivní gradientní sestup

Čtyřicet kroků od x=0.11x = 0.11, ustálení na 0.94560.9456 — mělčí ze dvou údolí. Teď posuňte počáteční bod o jeden zářez doleva, na 0.100.10. Stejná rychlost, stejných čtyřicet kroků a místo toho se ustálí na 1.0461-1.0461, kde je ztráta o 0,199747 nižší. Rozvodí je hrb v 0.1010310.101031 a celý rozdíl mezi oběma odpověďmi je v tom, na které jeho straně jste náhodou začali.

Dopadnout 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, momentum

Jedna 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ů:

metodakroky do 0,1 % od optimagradienty na příklad
full batch7700 000
minibatch o 321003 200
jeden příklad po druhém17 58017 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 Monra3není 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

vβv+L(θ),θθηv\mathbf{v} \leftarrow \beta \mathbf{v} + \nabla L(\boldsymbol{\theta}), \qquad \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \eta \mathbf{v}

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:

TEXT
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 5

Kaž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, L(θ+h)L(θh)2h\frac{L(\theta+h) - L(\theta-h)}{2h}, která ruší vedoucí chybový člen a je při stejném hh mnohem přesnější.

gradcheck.pyPYTHON
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 10410^{-4} je katastrofa na gradientu velikosti 10310^{-3} a irelevantní na gradientu velikosti 10610^{6}.

TEXT
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744

První řá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 10710^{-7} je shoda; cokoli nad 10410^{-4} 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.

Všechno v této kapitole stálo na jednom předpokladu, který nebyl nikdy vysloven: že umíte zapsat L/θ\partial L / \partial \theta.

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 vrstva40
čtyři skryté jednotky, dvě vrstvy301
čtyři skryté jednotky, tři vrstvy1 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 zzpredikcepravdagradient s kvadratickou chybougradient s cross-entropy
000.500012.5×1012.5 \times 10^{-1}5.0×1015.0 \times 10^{-1}
2-20.119211.850×1011.850 \times 10^{-1}8.808×1018.808 \times 10^{-1}
6-60.002514.921×1034.921 \times 10^{-3}9.975×1019.975 \times 10^{-1}
10-104.54×1054.54 \times 10^{-5}19.079×1059.079 \times 10^{-5}1.0001.000

Model, který se mýlí se sebejistou katastrofálností — předpovídá 0,0000454, když odpověď je 1 — vyprodukuje gradient kvadratické chyby 9×1059 \times 10^{-5}. 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í?


Metoda 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 2/λmax2/\lambda_{\max} 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.

  1. 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í.

  2. 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ň.

  3. 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.

  4. 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.

Necháte výběr modelu na LIA?

Tvořte se všemi modely AI na jednom místě – začněte ještě dnes zdarma.