jancll.com

Lekce 05 · 16 min čtení

Učení (gradient descent)

Jak si síť najde svoje váhy sama. Loss, gradient, learning rate a sjíždění z kopce.

Úvod

V minulé lekci jsme prohnali kontext sítí a vypadla z toho předpověď. Fungovalo to ale jen proto, že jsem váhy nastavil ručně, aby dávaly smysl. To je podvod. V reálu má model miliony vah a nikdo netuší, jaká čísla tam napsat.

Tahle lekce je o tom, jak si síť ta čísla najde sama. Princip je překvapivě lidský: zkus to, koukni, jak moc ses spletl, a posuň se kousek tím správným směrem. A pak znovu. A znovu. Tomu postupu se říká gradient descent a roztáčí prakticky celou dnešní AI.

Švejk s dýmkou sleduje kuličku, která sjíždí po svahu lossu do údolí

Gradient ukazuje nahoru. Švejk jde opačně, dolů k menší chybě.

Loss: jak moc se model plete

Aby se model mohl zlepšovat, musí nejdřív vědět, jak moc je špatný. Od toho je loss (česky chyba): jedno číslo, které říká, jak daleko jsou předpovědi modelu od pravdy. Velký loss = velký omyl. Loss nula = trefa.

Typicky se počítá jako průměr čtverců odchylek: vezmi rozdíl mezi tím, co model řekl, a tím, co mělo být, umocni na druhou (ať jsou kladné i záporné chyby stejně zlé) a zprůměruj.

loss=1N(prˇedpoveˇdˇpravda)2\text{loss} = \frac{1}{N} \sum (\text{předpověď} - \text{pravda})^2

Celé učení je teď jen jeden cíl: udělej loss co nejmenší. Otázka je jak.

Gradient: kudy z kopce

Představ si loss jako kopec. Na vodorovné ose je váha, na svislé chyba. Ty stojíš někde na svahu a chceš dolů, do údolí, kde je chyba nejmenší. Jenže je mlha a vidíš jen kousek pod nohy.

Co uděláš? Nahmatáš, kterým směrem to jde nejprudčeji dolů, a uděláš krok tam. A přesně tohle ti řekne gradient: je to sklon kopce v místě, kde stojíš. Říká, kterým směrem chyba nejrychleji roste. Takže když chceš dolů, jdeš přesně opačným směrem, než ukazuje gradient.

To je celý trik. Gradient ukazuje do kopce, ty jdeš z kopce.

Jeden krok dolů

Krok se dělá takhle: vezmi váhu, spočítej v tom místě gradient a posuň se proti němu o kousek. Ten kousek řídí learning rate (rychlost učení), označuje se η\eta:

wnovaˊ=wηgradientw_{\text{nová}} = w - \eta \cdot \text{gradient}

A pak znovu, ze nové pozice. Krok za krokem se kutálíš do údolí, gradient se cestou zmenšuje (svah je u dna mírnější) a kroky se přirozeně zkracují, až se zastavíš skoro na dně.

Zkus si to. Měň learning rate a sleduj, co kulička dělá:

GradientDescent · sjíždíme z kopce chyby

Kulička je hodnota váhy. Každý krok ji posuneme dolů z kopce. Pohraj si s learning rate.

dnováha wchyba (loss)
krok0
w5.60
loss7.48
gradient+3.60

Klikni „krok" jednou, nebo „spustit" pro animaci. Sleduj, jak velikost kroku závisí na strmosti kopce.

Pohraj si hlavně s learning rate, protože je to nejošemetnější číslo v celém učení:

  • Moc malý a kulička se plíží jako hlemýžď, trénink trvá věčnost.
  • Tak akorát a hezky sklouzne do dna za pár kroků.
  • Moc velký a kulička přeskočí dno, vyletí na druhou stranu výš, než byla, a začne se rozhoupávat až úplně uteče. Toho se reálně bojí každý, kdo trénuje sítě.

V kódu

Pojďme model opravdu něco naučit. Máme pár bodů, u kterých zhruba platí y = 2·x, jenže model to neví. Začne s vahou 0 a sám si má číslo 2 najít, jen z dat a gradient descentu. Update váhy si napíšeme ručně. Klikni Run.

python · pyodide

Koukni, jak loss klesá a w se plíží k dvojce. Nikdo modelu neřekl, že odpověď je 2. Jen se opakovaně díval, jak moc se plete, a posouval vahu z kopce. Tohle je celé učení v kostce. Pravá síť dělá přesně totéž, jen pro miliony vah naráz.

Zkus to rozbít

Změň lr na 0.2 a pusť to znovu. Loss místo klesání vystřelí do astronomických čísel a w utíká pryč od správné dvojky. To je ten „moc velký krok" z playgroundu, jen v kódu. Pak zkus 0.001 a uvidíš opak: krok je tak malý, že za 20 kol model sotva odlepí.

Cvičení

Cvičení · lekce5-cv1

Váha je w = 5, gradient v tom místě je 4, learning rate je 0.5. Jaká bude váha po jednom kroku gradient descentu?

Cvičení · lekce5-cv2

Když je kulička přesně na dně (v minimu chyby), čemu se rovná gradient?

Cvičení · lekce5-cv3

Stejná situace (w = 5, gradient 4), ale learning rate je teď 2. Kam se váha posune? (Výsledek ti napoví, proč je velký learning rate nebezpečný.)

Cvičení · lekce5-cv4

V playgroundu nebo v kódu si pohraj s learning rate. Najdi hodnotu, při které se to ještě učí, a hodnotu, při které už to utíká pryč. Napiš sem zhruba, kde je ta hranice.

Shrnutí

  • Loss je jedno číslo, jak moc se model plete. Cíl učení je udělat ho co nejmenší.
  • Gradient je sklon loss: ukazuje směr, kterým chyba nejrychleji roste. Učení jde proti němu, tedy z kopce dolů.
  • Krok: wnovaˊ=wηgradientw_{\text{nová}} = w - \eta \cdot \text{gradient}. Learning rate η\eta řídí, jak velký ten krok je.
  • Moc malý learning rate = pomalu. Moc velký = řešení uteče. Tak akorát = pěkná konvergence do dna.
  • Opakuj dokola pro všechny váhy a model se naučí sám. Tohle je motor celé dnešní AI.

Co bude příště

Máme všechny dílky: tokeny, embeddingy, forward pass i učení. Čas je slepit dohromady.

V Lekci 6 (Bigram neural model) postavíme první opravdu trénovaný model. Žádné ručně nastavené váhy. Dáme mu Švejka, necháme ho hádat další token, počítat loss a sjíždět z kopce, dokud se sám nenaučí, že po slově pan často přijde Švejk. Asi 30 řádků a poprvé uvidíš trénovací smyčku v plné kráse.