Lekce 01 · 12 min čtení
Co je jazykový model?
Bigramy nad Švejkem, pravděpodobnost dalšího slova, první intuice.
Úvod
Jazykový model je program, který si tipuje, jaké slovo přijde v textu jako další. To je celé. Není v tom (zatím) žádná magie, žádné porozumění, žádné vědomí — jen statistika tipovaná velmi dobře.
Moderní LLM — ten, co ti dopisuje maily, kód i výmluvy — je v jádru přesně to samé, co budeme stavět dnes. Jen má kontext mnohem delší než jedno slovo a tabulku pravděpodobností mnohem větší. Princip zůstává — kouknout na dosavadní text, spočítat, co je nejpravděpodobnější příští token, vybrat. Opakovat.
V téhle lekci si na tom postavíme intuici nad Osudy dobrého vojáka Švejka. Když nám náš model vygeneruje:
„Pan Švejk se vrátil do hospody U Kalicha."
…tak je to triumf. Když vygeneruje:
„Pan se Švejk hospody U vrátil."
…tak je to taky zajímavé, jen to chce ještě trochu práce.
Hlavní koncept: bigram
Začneme s nejjednodušším možným modelem: bigram. To slovo znamená dvojici — „bi" jako dvě, „gram" jako jednotka. Bigramový model si pamatuje, jaká dvojice slov se v textu vyskytuje a jak často.
Když mu dáš slovo pan, koukne se do svojí tabulky, najde řádek pan a vidí:
„po pan přijde nejčastěji Švejk, pak Lukáš, pak rytmistr..." Vybere si
podle pravděpodobnosti a pokračuje dál.
NgramExplorer · Švejk (CZ, ukázková data)
Po slově pan přijde…
- Švejk32%
- Lukáš18%
- rytmistr11%
- doktor9%
- farář6%
- (jiné)24%
Pozn.: pravděpodobnosti jsou ilustrativní, ne spočtené nad celým korpusem.
Klikni si na různá slova nahoře a koukni, jak vypadají přechody. Všimni si dvou věcí:
poslušněmá v podstatě jen jednoho následovníka. Pokud jsi někdy četl Švejka, víš proč. Pokud ne — užiješ si to.panje velmi predikovatelné: pět nejčastějších slov pokrývá 76 % všech výskytů. Naproti tomutoje rozházenější — i pět top slov pokryje jen dvě třetiny.
To je důležitý insight: některá slova jsou prediktivnější než jiná. „poslušně" má entropii skoro nulovou. „to" je entropický chaos. Dobrý model si toho všímá. (O entropii víc později, zatím to ber jako „míru překvapení".)
Matika (krátká, slibujeme)
Bigramový model je vlastně jen tabulka podmíněných pravděpodobností. Chceme spočítat:
Čteme to jako „pravděpodobnost dalšího slova za podmínky, že předchozí slovo bylo nějaké konkrétní". Spočítáme to z dat takhle:
Slovy: spočítej, kolikrát se v korpusu objevila dvojice (w_1, w_2), a vyděl
tím, kolikrát se objevilo samotné w_1. Hotovo.
Příklad. Řekněme, že v korpusu se pan objevilo 1000×, a z toho po pan
následovalo Švejk 320×. Pak:
Tedy 32% šance, že po pan přijde Švejk. (Což zhruba sedí s tím, co vidíš
v exploreru nahoře.)
Drobná lež na úvod
Tady trochu lžu — ve skutečnosti většina prakticky používaných „pravděpodobností" se vyhlazuje (smoothing), aby model dával nenulovou šanci i dvojicím, které v trénovacích datech vůbec neviděl. Jinak se ti totiž první neznámé slovo zachytí ve smyčce „pravděpodobnost 0 → konec světa". Smoothing si necháme na později. Zatím to ber takhle.
V kódu
Pojďme to napsat. Klikni Run — Pyodide se načítá ~10 sekund první spuštění, pak je rychlý.
Tři věci, co se tu staly:
- Tokenizace přes regex —
\w+posbírá všechno, co vypadá jako slovo (písmena + čísla, žádná interpunkce). Hrubě, ale stačí. V příští lekci uvidíš, proč je tokenizace celá samostatná věda. Counter(zip(tokens, tokens[1:]))—zipposunutý o jedna vytvoří dvojice sousedních slov.Counterje spočítá. Tři řádky, kompletní bigramový statistický základ.p_nextdělí: počet dvojic / počet prvních slov. Přesně ten vzorec z předchozí sekce.
Generování
Když máme pravděpodobnosti, můžeme i generovat text — vezmi startovní slovo, zvol další podle pravděpodobnosti, opakuj.
Spusť to víckrát s jinými seedy (změň 42 na 0, 1, 7...) a koukni, co
ti to vygeneruje. Bude to znít jako Švejk, jen s rapidně klesající
soudržností po prvních pár slovech. Což dává smysl — model si pamatuje jen
jedno slovo nazpátek. „Pan Švejk řekl poslušně hlásím" je super, ale jakmile
začne odbočovat, ztratil thread.
Cvičení
Cvičení · lekce1-cv1
Z explore nahoře vidíš, že po slově pan přijde Švejk ve 32 % případů.
Jaká je tedy P(Švejk | pan)? (Zadej jako desetinné číslo.)
Cvičení · lekce1-cv2
Spočti P(hlásím | poslušně). (Zase jako desetinné číslo.)
Cvičení · lekce1-cv3
Jaká je pravděpodobnost, že po poslušně přijde cokoliv jiného než
hlásím?
Shrnutí
- Jazykový model = předpovídá další slovo. Žádné porozumění, jen pravděpodobnost.
- Bigram je nejjednodušší varianta — kouká na předchozí slovo a vybírá podle tabulky.
- Tu tabulku spočteš z dat: .
- Generování je sampling z té tabulky, opakovaně.
- Po pár slovech to ztratí soudržnost — protože model si pamatuje jen jedno slovo zpátky. To není bug, to je fundamentální limit bigramu.
Co bude příště
Jak vidíš, regex tokenizace funguje, ale je hloupá. „Švejk", „Švejka", „Švejkovi" pro ni jsou tři úplně různá slova, mezi kterými nemá žádnou souvislost. A nepokrývá ani interpunkci.
V Lekci 2 — Tokenizace si ukážeme BPE (byte-pair encoding) — chytrý
algoritmus, který dokáže rozdělit Švejkovi na Švejk + ovi a propojit tak
různé formy stejného slova. Je to ten samý algoritmus, co používá většina
moderních LLM.