Lekce 06 · 15 min čtení
Bigram neural model
První opravdu trénovaný model. Forward pass, cross-entropy a gradient descent slepené v trénovací smyčce.
Úvod
Tohle je lekce, kde se to všechno spojí. Máme tokeny, embeddingy, forward pass i gradient descent. Teď je slepíme do první sítě, kterou opravdu natrénujeme. Žádné ručně nastavené váhy. Dáme jí Švejka a necháme ji, ať si pravidla najde sama.
Postavíme bigramový model, úplně stejný úkol jako v lekci 1: z jednoho slova hádej další. Tam jsme si přechody počítali do tabulky. Teď je necháme síť naučit se. A na konci uvidíš hezkou věc: vyjde jí skoro to samé, jen ne sčítáním, ale učením.

Tentokrát se tabulka nepíše ručně. Necháme ji vylézt z dat.
Co stavíme
Model je nejmenší možný. Na vstupu jeden token, na výstupu rozdělení nad tím,
co přijde dál. Uvnitř je jen váhová matice W: pro každý token jeden řádek se
skóre všech možných pokračování.
Forward pass znáš z lekce 4. Vezmi řádek matice pro aktuální token, to jsou logity, a prožeň je softmaxem na pravděpodobnosti:
To je celý model. Žádná skrytá vrstva, žádné kouzlo. Veškerá inteligence je
schovaná v těch číslech v W. A ta čísla na začátku nastavíme na nuly a necháme
gradient descent, ať je dotlačí, kam mají.
Nová chyba: cross-entropy
V lekci 5 jsme měřili chybu čtvercem odchylky. To je fajn na čísla, ale my teď předpovídáme pravděpodobnosti. Potřebujeme chybu, která říká „jak moc model věřil tomu, co se opravdu stalo". Od toho je cross-entropy:
Slovy: podívej se, jakou pravděpodobnost model přiřkl tokenu, který opravdu přišel, a vezmi záporný logaritmus. Když model dal správné odpovědi vysokou pravděpodobnost, logaritmus je skoro nula a chyba malá. Když ji málem vyloučil, logaritmus vystřelí a chyba je velká. Trefa do černého má loss nula.
To je přesně ten signál, který chceme minimalizovat. Zbytek je gradient descent z minulé lekce, jen ho teď pustíme na celý korpus.
Trénink běží
Tady je ten model naživo. Trénuje se přímo v prohlížeči gradient descentem.
Klikni trénuj a sleduj dvě věci najednou: jak loss klesá a jak se předpověď
po slově pan postupně zaostřuje z nudné placky na špičku u švejk:
BigramTrainer · trénink běží v prohlížeči
Spusť trénink a sleduj, jak loss klesá a jak se předpověď dalšího tokenu zaostřuje.
- lukáš11%
- pan11%
- pije11%
- pivo11%
- se11%
- vrátil11%
- čekal11%
- řekl11%
- švejk11%
Na začátku (epocha 0) jsou váhy nulové, takže model hádá úplně náhodně a všem tokenům dává stejnou pravděpodobnost. Loss startuje vysoko. Jak se učí, váhy se tvarují podle dat a rozdělení se zaostřují. Klikej i na jiné tokeny nahoře a koukni, co se model naučil po nich.
V kódu
Teď to napíšeme pořádně, s numpy. Je to celá trénovací smyčka, jakou používá úplně každá síť na světě: forward pass, loss, gradient, krok. Pořád dokola. První spuštění chvilku potrvá, protože se stahuje numpy.
Aha moment
Koukni na výstup. Po pan dal model švejk zhruba 0,6 a lukáš zhruba 0,4.
A teď to nejlepší: v korpusu je pan švejk třikrát a pan lukáš dvakrát. Tři
ku dvěma. To je přesně 0,6 ku 0,4.
Model se sám naučil ty frekvence z dat, aniž bychom mu jednu jedinou spočítali ručně. Vyšla mu stejná tabulka jako v lekci 1, jen k ní došel gradient descentem místo počítáním. To je hezké potvrzení, že to celé funguje, jak má.
A je to taky důvod, proč nás bigram dlouho neudrží. Když se nejlíp natrénovaný model jen vrátí k počítací tabulce, nic nového se nenaučil. Pořád kouká jen jedno slovo dozadu. Skutečná síla přijde, až se model naučí koukat na celý kontext.
Cvičení
Cvičení · lekce6-cv1
Model dal správnému dalšímu tokenu pravděpodobnost 1.0 (úplná jistota a
trefa). Jaký je cross-entropy loss na tomhle příkladu?
Cvičení · lekce6-cv2
V korpusu po slově pan přijde švejk třikrát a lukáš dvakrát. Jakou
pravděpodobnost dá dobře natrénovaný model tokenu švejk po pan?
Cvičení · lekce6-cv3
Bigramový model se slovníkem 1000 tokenů má váhovou matici W. Kolik čísel
(vah) je v ní celkem?
Cvičení · lekce6-cv4
V kódu výš si uprav text na vlastní pár vět (klidně něco svého) a pusť to.
Co se model naučil předpovídat po nějakém slově? Napiš sem jednu dvojici.
Shrnutí
- Spojili jsme všechno dohromady: token jde dovnitř, vybere řádek vah
W, softmax udělá pravděpodobnosti, cross-entropy změří chybu, gradient descent posune váhy. To je trénovací smyčka. - Cross-entropy je správná chyba pro pravděpodobnosti: . Trefa s jistotou = loss nula.
- Model jsme nenastavili ručně. Naučil se sám, jen z dat a sjíždění z kopce.
- Natrénovaný bigram dá skoro stejné pravděpodobnosti jako počítací tabulka z lekce 1. Učení a počítání tady vedou ke stejnému cíli.
- Bigram pořád kouká jen jedno slovo dozadu. To je jeho strop.
Co bude příště
Náš model má pořád tu samou slabinu jako v lekci 1: vidí jedno slovo a nic víc. „Pan Švejk řekl poslušně" zvládne, ale o větu dál ztratí nit.
V Lekci 7 (Self-attention) přijde nápad, který tohle rozbil a nastartoval celou éru velkých modelů: nechat každý token, ať se sám podívá na ostatní tokeny v kontextu a rozhodne se, které z nich jsou teď důležité. Je to srdce transformeru a budeme si ho rozebírat pomaleji než cokoliv dosud.