jancll.com

Lekce 04 · 16 min čtení

Neuronka (forward pass)

Co se děje, když vektor projde jednou vrstvou. Lineární vrstva, softmax, předpověď dalšího tokenu.

Úvod

Máme slova jako vektory. Teď s nimi konečně něco spočítáme. Cíl je pořád stejný jako od první lekce: vzít kontext a odhadnout, jaký token přijde dál. Jen už to nebudeme dělat tabulkou, ale neuronovou sítí.

To slovo zní jako něco z mozku nebo ze sci-fi. Ve skutečnosti je „neuronová síť" jen hromada násobení a sčítání, plus jedna funkce navrch. V téhle lekci si projdeme forward pass: cestu od vstupního vektoru k pravděpodobnosti dalšího tokenu. Žádné učení zatím, jen průchod dat sítí. Učení necháme na příště.

Švejk s dýmkou předává vstupní kartičky důstojníkovi, který je přepočítává na pravděpodobnosti

Vstup dovnitř, pár vah a součtů, pravděpodobnosti ven. Poslušně hlásím: forward pass.

Jeden neuron

Začneme tím nejmenším kouskem. Neuron dostane na vstupu pár čísel, každé vynásobí svojí váhou, sečte to a přičte jedno číslo navíc zvané bias. To je celé.

Řekněme, že vstup popisuje kontext třemi čísly: kolik je v něm „pití", „vojny" a „postav". Neuron, který hlídá token pivo, bude mít velkou váhu u „pití" a skoro nulovou u „vojny". Když pak dostane kontext plný piva, jeho výstup vyletí nahoru.

vyˊstup=w1x1+w2x2+w3x3+b\text{výstup} = w_1 x_1 + w_2 x_2 + w_3 x_3 + b

Tomu výslednému číslu se říká logit. Je to zatím syrové skóre, ne pravděpodobnost. Může být klidně záporné nebo větší než jedna. Pravděpodobnost z něj uděláme až za chvíli.

Vrstva je jen matice

Jeden neuron předpovídá jeden token. My ale chceme skóre pro všechny kandidáty naráz: pivo, hospoda, regiment, Švejk. Takže neuronů postavíme vedle sebe víc, každý se svojí řádkou vah. A z řádek vah se stane matice.

Spočítat všechny logity najednou pak není nic jiného než maticové násobení: matice vah WW krát vstupní vektor xx, plus vektor biasů bb.

logity=Wx+b\text{logity} = W x + b

Nelekej se toho zápisu. Maticové násobení tady znamená přesně tohle: vezmi každou řádku matice, vynásob ji po složkách se vstupem, sečti. Jeden řádek, jeden logit. Čtyři řádky, čtyři logity. To je všechno, co se v „lineární vrstvě" děje.

Zkus si to. Posouvej vstupní signály a sleduj, jak řádky vah převedou kontext na logity a jak se z nich pak stanou pravděpodobnosti:

NeuronVisualizer · lineární vrstva + softmax

Posouvej vstupní signály a koukej, jak se mění logity a pravděpodobnosti dalšího tokenu.

Vstup (kontext)

Výstup (další token)

  • pivologit +1.70 · 37%
  • hospodalogit +1.48 · 29%
  • regimentlogit +0.22 · 8%
  • Švejklogit +1.34 · 26%

Model by teď vsadil na pivo.

Když přidáš „pití", vyletí pivo a hospoda. Když přidáš „vojnu", začne vyhrávat regiment. Ty váhy jsem nastavil ručně, aby to dávalo smysl, ale v reálném modelu přesně tahle čísla model najde sám trénováním. O tom je příští lekce.

Softmax: z logitů pravděpodobnosti

Logity jsou syrová skóre. Můžou být záporná, různě velká, nedají se sečíst na jedničku. Potřebujeme z nich udělat pravděpodobnosti: samá kladná čísla, co dohromady dají 1. Od toho je tu softmax.

softmax(z)i=ezijezj\text{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}}

Slovy: každý logit pošli přes exe^x (čímž se stane kladným a větší rozdíly se ještě zvýrazní), a pak vyděl součtem všech, aby to dohromady dalo jedničku. Logit, který byl největší, dostane největší kus pravděpodobnosti.

Teplota

V playgroundu výš je posuvník „teplota". Když logity před softmaxem vydělíš nějakým číslem, ovládáš, jak ostré výsledné rozdělení bude. Nízká teplota dělá model rozhodný (skoro vždy vsadí na favorita), vysoká teplota ho zklidní a rozprostře pravděpodobnost mezi víc možností. K tomu se vrátíme, až budeme generovat text.

V kódu

Pojďme celý forward pass napsat ručně, bez numpy, ať je vidět, že na maticovém násobení není nic magického. Vstup, váhy, logity, softmax, předpověď. Klikni Run.

python · pyodide

Zkus změnit vstup x. Dej „vojnu" nahoru (x = [0.1, 0.9, 0.3]) a pusť to znovu. Uvidíš, že favorit přeskočí na regiment. Přesně to dělá síť pořád dokola: vezme kontext, prožene ho vrstvou, vyplivne rozdělení nad tokeny.

Cvičení

Cvičení · lekce4-cv1

Neuron má váhy w = [3, 2] a bias 1. Na vstup dostane x = [1, 0]. Jaký bude jeho logit?

Cvičení · lekce4-cv2

Do softmaxu přijdou dva logity, oba se rovnají 2. Jaká bude pravděpodobnost toho prvního? (Zadej jako desetinné číslo.)

Cvičení · lekce4-cv3

Na kolik se vždycky sečtou všechny pravděpodobnosti, které vyleze ze softmaxu?

Cvičení · lekce4-cv4

V playgroundu výš najdi takové nastavení vstupů, při kterém vyhraje Švejk. Které signály jsi musel zvednout? Napiš sem, co ti zabralo.

Shrnutí

  • Neuron = vynásob vstupy vahami, sečti, přičti bias. Výsledek je logit, syrové skóre.
  • Vrstva je jen víc neuronů vedle sebe, takže celý výpočet je maticové násobení Wx+bWx + b. Jeden řádek vah, jeden logit.
  • Softmax převede logity na pravděpodobnosti: samá kladná čísla se součtem 1. softmax(z)i=ezijezj\text{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}}.
  • Celé dohromady je forward pass: kontext jde dovnitř, rozdělení nad tokeny jde ven.
  • Váhy jsme tu nastavili ručně. V reálu si je model najde sám.

Co bude příště

Pořád jsme jen prohnali čísla sítí. Funguje to jen proto, že jsem váhy ručně nastavil, aby to dávalo smysl. To je ale podvod. V reálu nikdo neví, jaké váhy napsat, a u milionů čísel by to ani nešlo.

V Lekci 5 (Učení) přijde to nejdůležitější: jak síť ty správné váhy najde sama. Začne s náhodnými čísly, podívá se, jak moc se spletla, a kousek po kousku se posune správným směrem. Říká se tomu gradient descent a je to motor, který roztáčí celou dnešní AI.