Napište do ChatGPT dotaz a zmáčknete Enter. Asi za dvě vteřiny se začnou objevovat první písmena odpovědi. Co se odehrává v té mezeře?
Ne v datovém centru na druhém konci světa, ale uvnitř modelu. Jak přesně vzniká text, který pak čtete?
Tohle je ta otázka, na kterou odpovídá tenhle článek. Ne na úrovni vzorců a matematiky, ale na úrovni principu. Protože ten princip je překvapivě jednoduchý a překvapivě chytrý zároveň.
Než model cokoliv přečte, musí text rozsekat
Model nečte text tak, jak ho čtete vy. Vy vidíte slova. Model vidí tokeny.
Token je kus textu, typicky část slova, celé slovo nebo interpunkce. Slovo „chatbot” je jeden token. Slovo „přirozenosti” jsou možná tři tokeny: „přiro”, „zeno”, „sti”. Závisí to na konkrétním slovníku daného modelu.
Proč tokeny a ne rovnou slova? Protože jazyky jsou nepředvídatelné. Slovník by musel obsahovat všechny tvary všech slov, všechna vlastní jména, všechny cizí výrazy, překlepy a složeniny. Tokeny tento problém obchází. Model si vytvoří slovník v řádu desítek až stovek tisíc tokenů a pokryje jím prakticky vše.
U angličtiny platí orientační pravidlo, že jeden token odpovídá přibližně čtyřem znakům, tedy zhruba třem čtvrtinám slova. Sto tokenů je asi pětasedmdesát anglických slov. Čeština, která je bohatší na tvary a používá diakritiku, potřebuje na stejný obsah tokenů víc. To je důvod, proč textové limity v API rozhraních modelů nejsou v slovech, ale právě v tokenech. Ve stejné jednotce se udává i kontextové okno modelu.
Tenhle krok, rozsekat vstupní text na tokeny, se odborně nazývá tokenizace. Je to první věc, která se stane poté, co stisknete Enter.
Číselný kód pro každý token
Tokenizace ale nestačí. Model pracuje s čísly, ne se slovy ani tokeny.
Každý token dostane své číslo, říká se mu ID. Token „chatbot” může mít ID 15832, token „přirozenosti” může být tři různá ID za sebou. Celý vstupní text se tak přemění na posloupnost čísel.
Pak přichází embedding (česky aproximace nebo vnoření do prostoru). Každé ID se převede na vektor, což je seznam čísel, typicky o délce několika tisíc hodnot. Tento vektor zachycuje, co token „znamená” ve vztahu k jiným tokenům. Tokeny s podobným významem mají podobné vektory. „Pes” a „kočka” budou ve vektorovém prostoru blíž sobě než „pes” a „automobil”.
Tenhle krok je podstatný: model tímto způsobem „chápe” vztahy mezi slovy, aniž by kdokoli ručně zadával, co které slovo znamená. Naučil se to ze vzorů v textu.
Transformer: mozek modelu
Samotné zpracování textu probíhá v architektuře zvané transformer. Google ji publikoval v roce 2017 v článku s názvem „Attention Is All You Need” a od té doby se stala základem téměř všech velkých jazykových modelů.
Klíčový mechanismus transformeru je self-attention, česky vlastní pozornost nebo sebepozornost. Je to způsob, jak model při zpracování každého tokenu zohledňuje vztahy k ostatním tokenům ve vstupu.
Příklad. Věta: „Tomáš šel do obchodu, ale zapomněl peněženku, takže se pro ni vrátil.” Zájmeno „ni” odkazuje na peněženku, ne na obchod. Lidský mozek to vyřeší automaticky. Transformer to vyřeší mechanismem attention: při zpracování tokenu „ni” přidělí vysokou „váhu” tokenu „peněženku” a nízkou váhu tokenu „obchodu”. Výsledek je stejný, cesta jiná.
Self-attention se opakuje ve vrstvách. Moderní modely mají desítky až stovky takových vrstev. Každá vrstva zachytí trochu jiné vztahy, jiný kontext. Hluboké vrstvy zpracovávají abstraktnější vztahy, mělčí vrstvy spíš lokální gramatické vzory.
Výsledkem celého průchodu transformerem je výstupní vektor pro každý token. Tento vektor v sobě nese informaci o tom, co přijde dál.
Jak model vybírá příští slovo
Tohle je jádro celého principu.
Model na základě výstupního vektoru spočítá pravděpodobnost pro každý token ze svého slovníku. Co bude nejpravděpodobnější pokračování? Například po větě „Pití kávy ráno pomáhá s” bude token „koncentrací” pravděpodobně výš než token „plaváním”.
Model nevybírá vždy ten token s nejvyšší pravděpodobností. Existuje parametr zvaný temperature (teplota). Při nízké teplotě model vybírá konzervativně, skoro vždy to nejpravděpodobnější. Při vyšší teplotě bere v úvahu i méně pravděpodobné tokeny, výsledek je variabilnější a kreativnější, ale taky méně předvídatelný.
Vybraný token se přidá k textu a celý proces začne znovu: tokenizace, embedding, transformer, pravděpodobnostní výběr. Jeden token za druhým, dokud model nevygeneruje token označující konec odpovědi.
Tohle je inference, neboli odvozování. Průchod vstupním textem modelem a generování výstupu token po tokenu.
Trénink a inference: dva různé procesy
Inference je rychlá. Proběhne za vteřiny a stojí relativně málo výpočetního výkonu.
Trénink je jiná kategorie.
Při tréninku model zpracovává obrovské množství textu, predikuje tokeny a dostává zpětnou vazbu, jak moc se mýlil. Na základě té zpětné vazby upravuje svých miliard parametrů (to jsou ta čísla, z nichž se model skládá), aby příště predikoval lépe. Tahle smyčka, predikce plus korekce, se opakuje pro stovky miliard tokenů.
Trénink GPT-3 v roce 2020 probíhal na přibližně 300 miliardách tokenů a trval týdny. Novější modely se trénují na větších datech a déle. Jeden tréninkový běh velkého modelu spotřebuje výpočetní výkon ekvivalentní tisícům moderních GPU pracujících paralelně po měsíce.
Po skončení tréninku se parametry zmrazí. Model se přestane učit. Inference pak probíhá na těchto zmrazených parametrech. Vy vidíte výsledek tréninku, ale samotný trénink v reálném čase neprobíhá. Každý váš dotaz tedy nezlepšuje model, aspoň ne přímo.
Poznámka k tomu, co se s vašimi konverzacemi děje: firmy jako OpenAI nebo Anthropic mají různé podmínky o tom, zda se data z konverzací používají pro další trénink. Podmínky se liší podle verze a tarifu, mění se v čase a stojí za to je občas projít.
Proč model občas „lže”
Principem predikce tokenů lze vysvětlit jednu z nejznámějších vlastností LLM: halucinace.
Model negeneruje text tím, že vyhledá fakta v databázi a pak je zapíše. Generuje text tím, že vybírá statisticky pravděpodobná pokračování. Pokud se v trénovacích datech soudní precedent jménem „Smith v. Jones” vyskytoval v podobném kontextu jako jiné precedenty, model ho může vygenerovat, i když nikdy neexistoval.
Hallucinate (halucinovat) je pojmenování pro situaci, kdy výstup modelu vypadá věrohodně, ale neodpovídá realitě. Model neví, že lže. Nemá přístup k pravdě v tom smyslu, v jakém člověk ví, že neco vidí nebo zažil. Generuje text, který je statisticky konzistentní s tím, co viděl v tréninku.
Tenhle limit je strukturální. Nejde ho odstranit lepším tréninkem, protože predikovací mechanismus halucinace nevylučuje. Lze ho zmírnit, například napojením modelu na věrohodné zdroje nebo tréninkem na odmítání odpovědí při nízké jistotě, ale ne eliminovat.
Co jste teď věděli
Takže co se stane, když napíšete dotaz do ChatGPT a zmáčknete Enter?
Váš text se rozseká na tokeny, každý token se převede na číselný vektor, transformerová architektura zpracuje celou sekvenci přes mnoho vrstev self-attention a nakonec model token po tokenu vybírá statisticky nejpravděpodobnější pokračování.
A to je LLM.
Žádná databáze faktů. Žádné vyhledávání na internetu (pokud není přidané jako extra modul). Žádná paměť předchozích konverzací (pokud není explicitně implementovaná). Čistá predikce tokenů, vrstvená na sobě stovky miliardkrát za milisekundy.
Rád přirovnám tento princip k mistrovskému kuchaři, který nikdy neviděl recept na konkrétní pokrm, ale po vaření tisíce receptů odhadne, které ingredience spolu fungují. Výsledek někdy překoná originál. Jindy přidá sůl tam, kde má být cukr.
Vědět tohle neznamená méně důvěřovat výstupu modelu. Znamená to vědět, kdy si ho ověřit.