Transformery a velké jazykové modely: architektura krok za krokem
Jazykový model a perplexita, blok transformeru s kauzální pozorností, MLP a rezidui, malý znakový transformer napsaný od nuly, srovnání s bigramem, naučená shoda podle rodu, generování s teplotou a cesta k modelům se stovkami miliard parametrů.
Série Základy AI Díl 70 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Co dělá jazykový model a jak vypadá blok transformeru.
- Co přinese pozornost oproti modelu, který vidí jen předchozí znak.
- Jak model generuje text a čím se liší od velkých jazykových modelů.
Co se hodí znát předem: Mechanismus pozornosti: jak se model naučí, kam se dívat, Embeddingy a word2vec: jak se slovo stane vektorem, Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
ChatGPT, Claude, Gemini i Llama mají uvnitř tutéž architekturu: transformer. Popsal ji tým z Googlu v roce 2017 v článku s nenápadným názvem „Attention Is All You Need“ a do pár let vytlačila z jazyka skoro všechno ostatní. Velký jazykový model je v jádru transformer, který se naučil jedinou věc — předpovídat další kousek textu — na obrovském množství textu. V tomhle dílu postavíme transformer od nuly, v malém: model, který píše po znacích a má 11 tisíc parametrů místo stovek miliard. Principy jsou ale přesně stejné.
Navazuje na díly Mechanismus pozornosti, Embeddingy a Aktivace, inicializace a normalizace.
1. Jazykový model: předpověz další znak
Definice — jazykový model a perplexita
Nechť 𝒱 je konečná neprázdná množina tokenů (slovník; u nás 36 znaků). Jazykový model je předpis, který každé posloupnosti x1, …, xt−1 ∈ 𝒱 (t ≥ 1; pro t = 1 je posloupnost prázdná) přiřadí rozdělení pravděpodobnosti dalšího tokenu, tj. čísla P(v | x1, …, xt−1) pro v ∈ 𝒱 taková, že
P(v | x1, …, xt−1) ≥ 0 pro každé v ∈ 𝒱 a ∑v ∈ 𝒱 P(v | x1, …, xt−1) = 1.
Nechť x1, …, xT ∈ 𝒱, T ≥ 1, je text. Ztráta modelu na tomto textu (průměrná křížová entropie dalšího tokenu, v natech na token) a perplexita jsou
L = 1/T ∑t=1T −ln P(xt | x1, …, xt−1), PP = eL.
Model se učí tak, že se jeho parametry hledají, aby L na trénovacím textu byla co nejmenší. Platí
PP = 1/T√∏t=1T P(xt | x1, …, xt−1),
tedy perplexita je převrácená hodnota geometrického průměru pravděpodobností skutečných tokenů. Model, který v každém kroku volí rovnoměrně mezi k tokeny, má PP = k — proto se perplexita čte jako počet rovnocenných možností, mezi kterými model v průměru váhá.
Našeptávač v telefonu, jen mnohem lepší. Kdo umí dobře odhadnout další slovo, musí rozumět gramatice, souvislostem i tomu, o čem se mluví — jinak by se trefoval špatně. Celá „inteligence“ velkých jazykových modelů vznikla jako vedlejší produkt téhle jednoduché úlohy.
L = 1/T ∑t=1T −ln P( xt | x1, …, xt−1 ), perplexita = eL
- x1, …, xt−1
- kontext — všechno, co model zatím viděl (u nás nejvýš posledních 24 znaků); jen z toho smí hádat
- xt
- znak, který v textu skutečně následuje — správná odpověď je zadarmo přímo v textu, proto stačí obyčejný text bez ručního značkování
- P
- pravděpodobnost, kterou model tomuto znaku dal (softmax z jeho výstupu přes všech 36 znaků)
- −ln
- trest za překvapení: za jistou správnou odpověď (P = 1) nula, za P = 0,5 trest ln 2 ≈ 0,693, a když dal model skutečnému znaku skoro nulu, trest roste nade všechny meze; logaritmus navíc z násobení pravděpodobností celé věty udělá součet
- L
- průměrná ztráta v natech na znak (průměr přes všech T pozic, aby nezávisela na délce textu); eL ji převede zpět na „počet rovnocenných možností“
Příklad — ztráta a perplexita na třech znacích
Model dal třem skutečným znakům pravděpodobnosti 0,5, 0,25 a 0,8:
L = −ln 0,5 − ln 0,25 − ln 0,8/3 = 0,693 + 1,386 + 0,223/3 = 2,303/3 = 0,768
perplexita = e0,768 = 2,15 (= ∛2 · 4 · 1,25, geometrický průměr čísel 1/P)
Barvy odpovídají členům vzorce výše.
Perplexita 2,15 znamená, že model byl v průměru stejně nejistý, jako kdyby rovnoměrně hádal mezi zhruba dvěma znaky.
Učíme na větách z dílu o embeddinzích (král vládl v paláci, dcera si hrála na hřišti…), tentokrát po znacích: 85 997 znaků k učení, 13 815 jiných k vyhodnocení, abeceda o 36 znacích. Model vidí posledních 24 znaků.
2. Blok transformeru
Definice — blok transformeru (dekodér)
Nechť 𝒱 je slovník o V tokenech, d ∈ ℕ dimenze modelu, Tmax ∈ ℕ největší délka kontextu, dff ∈ ℕ vnitřní šířka MLP a c1, …, cT ∈ 𝒱 vstupní tokeny, 1 ≤ T ≤ Tmax. Vektory tokenů píšeme jako řádky. Parametry modelu jsou matice embeddingů E ∈ ℝV×d (řádek E[c] patří tokenu c), matice pozičních embeddingů P ∈ ℝTmax×d, parametry pozornosti, W1 ∈ ℝd×dff, c1 ∈ ℝdff, W2 ∈ ℝdff×d, c2 ∈ ℝd, Wout ∈ ℝd×V, bout ∈ ℝV a parametry tří normalizací vrstvy. Transformer (dekodér s jedním blokem) spočte pro t = 1, …, T:
- vstupní vektory xt = E[ct] + P[t] ∈ ℝd;
- (h1, …, hT) = (x1, …, xT) + Attn(LN(x1), …, LN(xT)), kde Attn je kauzální vícehlavá sebepozornost (vícehlavá pozornost z dílu Mechanismus pozornosti s kauzální maskou níže — token t vidí jen tokeny 1, …, t) a LN je normalizace vrstvy (níže);
- yt = ht + MLP(LN(ht)), kde MLP(u) = ReLU(uW1 + c1)W2 + c2 a ReLU(r) = max(0, r) po složkách — MLP se použije na každou pozici zvlášť;
- logity zt = LN(yt)Wout + bout ∈ ℝV;
- rozdělení dalšího tokenu P(ct+1 = v | c1, …, ct) = softmax(zt)v pro v ∈ 𝒱.
Kroky 2 a 3 tvoří blok transformeru; hlubší model opakuje bloky s vlastními parametry a výstup y jednoho bloku je vstupem x dalšího. Náš model má jeden blok, V = 36, d = 32, Tmax = 24, dff = 64 a 2 hlavy.
Pozornost je porada: každý znak se podívá na předchozí a posbírá od nich, co potřebuje. MLP je přemýšlení o samotě: každý znak si posbírané zpracuje. Reziduální spojení („+“) znamená, že se původní informace nikdy neztratí, jen se k ní přidává — dálnice pro gradient z dílu o aktivacích. Kauzální maska zakazuje dívat se dopředu: při učení by jinak model „opisoval“ znak, který má předpovědět.
xt = E[ct] + P[t]
- E[ct]
- řádek matice embeddingů (36 × 32) pro znak ct — naučený vektor, který říká, co to je za znak
- P[t]
- poziční embedding (24 × 32) — říká, kde znak stojí. Je nutný, protože pozornost je jen vážený součet a pořadí sčítanců nevidí: bez něj by poslední „l“ ve slově „sel“ i v nesmyslu „esl“ vidělo stejnou trojici znaků a model by obě slova nerozlišil
- xt
- vstupní vektor tokenu t (modře ve schématu); sečtení místo spojení vedle sebe šetří dimenzi a síť si obě informace umí oddělit
h = x + Attn(LN(x)), y = h + MLP(LN(h)), z = LN(y) Wout + bout
- x
- vstup bloku; přičítá se k výstupu pozornosti beze změny (reziduální spojení), takže blok se učí jen opravu a gradient má přímou cestu dolů
- LN
- normalizace vrstvy před každou částí — drží vektory v rozumném rozsahu, ať se učení nerozjede; dává se na vstup části, ne na reziduální cestu, aby ta zůstala čistá
- Attn
- kauzální vícehlavá pozornost (zeleně ve schématu) — jediné místo, kde si tokeny vyměňují informace
- MLP
- MLP(u) = ReLU(uW1 + c1)W2 + c2 s vnitřní šířkou 64 (jantarově ve schématu) — zpracuje každý token zvlášť; pozornost jen průměruje, nelinearitu a „přemýšlení“ dodává tahle část
- z
- logity: pro každou pozici 36 čísel, softmax z nich dá P(další znak) (fialově ve schématu)
Definice — normalizace vrstvy (LayerNorm)
Nechť d ∈ ℕ, d ≥ 1, γ, β ∈ ℝd jsou naučené parametry (na začátku γ = (1, …, 1), β = (0, …, 0)) a ε > 0 je malá konstanta (u nás ε = 10−5; brání dělení nulou). Pro vektor u = (u1, …, ud) ∈ ℝd označme jeho průměr a rozptyl složek
μ(u) = 1/d ∑j=1d uj, σ2(u) = 1/d ∑j=1d (uj − μ(u))2.
Normalizace vrstvy je funkce LN : ℝd → ℝd se složkami
LN(u)j = γj · uj − μ(u)/√σ2(u) + ε + βj, j = 1, …, d.
Na matici tokenů (řádek = token) se LN použije na každý řádek zvlášť. Před násobením γ a přičtením β mají tedy složky každého tokenu průměr 0 a rozptyl (téměř) 1. Na rozdíl od batch normalizace se průměr a rozptyl počítají přes složky jednoho tokenu, takže výsledek nezávisí na tom, co je v dávce.
Příklad (γ = 1, β = 0): u = (1; 2; 3; 6), μ = 3, σ2 = 4 + 1 + 0 + 9/4 = 3,5, √3,5 = 1,871 (ε je proti 3,5 zanedbatelné) → LN(u) = (−2/1,871; −1/1,871; 0; 3/1,871) = (−1,069; −0,535; 0; 1,604).
Definice — kauzální maska
Nechť T ≥ 1 je počet tokenů a sij ∈ ℝ (i, j = 1, …, T) skóre pozornosti tokenu i vůči tokenu j, už vydělená √dk. Kauzální maska nahradí skóre nad úhlopříčkou hodnotou −∞:
ŝij = sij pro j ≤ i, ŝij = −∞ pro j > i,
a kauzální pozornost spočte váhy softmaxem po řádcích z ŝ s konvencí e−∞ = 0, tj. pro i = 1, …, T:
aij = esij/∑m=1i esim pro j ≤ i, aij = 0 pro j > i.
Token i tedy váží jen sebe a tokeny před sebou a jeho váhy dávají součet ∑j=1i aij = 1.
Příklad: třetí token z pěti má skóre (už vydělená √dk) (1; 0,5; 2; 3; 1). Poslední dvě patří budoucím tokenům a vypadnou: e1 = 2,718, e0,5 = 1,649, e2 = 7,389, součet 11,756 → váhy (2,718/11,756; 1,649/11,756; 7,389/11,756; 0; 0) = (0,231; 0,140; 0,629; 0; 0). Bez masky by nejvíc váhy dostal čtvrtý token, tedy znak, který má model teprve předpovědět.
Díky masce se z jednoho úseku T znaků učí T předpovědí najednou: pozice t vidí přesně kontext x1, …, xt a hádá xt+1. U nás d = 32 a 2 hlavy, takže každá hlava má dk = 16 a skóre se dělí √16 = 4.
Model má 11 588 parametrů. Pod kapotou je malá automatická derivace: každá operace (násobení matic, softmax s maskou, LayerNorm…) si pamatuje, jak spočítat svůj gradient, a zpětné šíření projde výpočet odzadu — přesně jako PyTorch. Test kontroluje, že se gradienty shodují s numerickou derivací.
Příklad — odkud je 11 588 parametrů
embeddingy: E 36 × 32 + P 24 × 32 = 1 152 + 768 = 1 920
pozornost: WQ, WK, WV, WO po 32 × 32 + LN (γ, β) = 4 · 1 024 + 2 · 32 = 4 160
MLP: W1 32 × 64 + c1 + W2 64 × 32 + c2 + LN = 2 048 + 64 + 2 048 + 32 + 64 = 4 256
výstup: LN + Wout 32 × 36 + bout = 64 + 1 152 + 36 = 1 252
celkem 11 588; síť bez pozornosti nemá druhý řádek: 11 588 − 4 160 = 7 428
def transformer(znaky, M): # znaky: indexy posledních ≤ 24 znaků
T = len(znaky)
x = M.E[znaky] + M.P[:T] # T × d: co je to za znak + kde stojí
a = layer_norm(x, M.g1, M.b1)
Q, K, V = a @ M.Wq, a @ M.Wk, a @ M.Wv
hlavy = []
for r in range(M.hlav): # každá hlava má svých d_k = d / hlav sloupců
q, k, v = Q[:, r], K[:, r], V[:, r]
S = q @ k.T / sqrt(d_k)
S[j > i] = -inf # kauzální maska: nedívat se dopředu
hlavy.append(softmax(S, po_radcich=True) @ v)
h = x + spoj_vedle_sebe(hlavy) @ M.Wo # reziduum kolem pozornosti
b = layer_norm(h, M.g2, M.b2)
y = h + relu(b @ M.W1 + M.c1) @ M.W2 + M.c2 # reziduum kolem MLP
return layer_norm(y, M.g3, M.b3) @ M.Wout + M.bout # T × 36 logitů
3. Učení a co přinese pozornost
| Model | ztráta na nových větách | perplexita |
|---|---|---|
| rovnoměrné hádání ze 36 znaků | 3,584 | 36 |
| četnost znaků (unigram) | 3,068 | 21,5 |
| předchozí znak (bigram) | 1,947 | 7,0 |
| síť bez pozornosti (7 428 parametrů) | 1,994 | 7,3 |
| transformer | 0,532 | 1,7 |
Síť bez pozornosti vidí jen aktuální znak (a jeho pozici), takže je to v podstatě bigram — a taky ho jen dorovná. S pozorností model vidí celé slovo a začátek věty a perplexita klesne ze 7,0 na 1,7: v průměru váhá jen mezi necelými dvěma možnostmi.
Definice — srovnávací modely: unigram a bigram
Nechť 𝒱 je abeceda o V znacích, x1, …, xN ∈ 𝒱 trénovací text a α > 0 vyhlazovací konstanta (u nás α = 0,1). Pro a, b ∈ 𝒱 označme
C(b) = |{t ∈ {1, …, N} : xt = b}|, C(a, b) = |{t ∈ {2, …, N} : xt−1 = a ∧ xt = b}|
počet výskytů znaku b a počet výskytů dvojice „a a hned za ním b“. Pro kontext x1, …, xt−1 a znak b ∈ 𝒱 jsou
- unigram — jazykový model, který kontext ignoruje: P(b | x1, …, xt−1) = C(b) + α/N + α · V;
- bigram — jazykový model, který z kontextu použije jen poslední znak a = xt−1 (pro t ≥ 2): P(b | x1, …, xt−1) = P(b | a) = C(a, b) + α/∑c ∈ 𝒱 C(a, c) + α · V.
V obou případech je součet přes b ∈ 𝒱 roven 1 a díky α > 0 nemá žádný znak pravděpodobnost 0 (ztráta −ln 0 by byla nekonečná). Vzorec bigramu je rozebraný hned pod definicí.
P(b | a) = C(a, b) + α/∑c C(a, c) + α · V
- C(a, b)
- kolikrát v trénovacím textu po znaku a následovalo b — čím častěji, tím pravděpodobnější
- ∑c C(a, c)
- kolikrát se a objevilo vůbec (s nějakým následníkem) — dělením z počtů vzniknou podíly
- α
- vyhlazení, u nás α = 0,1: každá dvojice dostane „desetinu výskytu“ navíc, takže i v tréninku nevídaná dvojice má malou kladnou pravděpodobnost
- V
- počet znaků abecedy (36); α se přičetlo V-krát v čitatelích, proto musí být V-krát i ve jmenovateli, aby součet přes b zůstal 1
Příklad — co bigram ví po znaku „š“
V trénovacím textu je za „š“ 952 znaků, z toho „l“ 278krát a „e“ 299krát:
P(l | š) = 278 + 0,1/952 + 0,1 · 36 = 278,1/955,6 = 0,291
P(e | š) = 299 + 0,1/955,6 = 0,313
Barvy odpovídají členům vzorce výše.
Tytéž dvě čísla dá bigram po „princezna š“ i po „princ š“ — o rodu nemá jak vědět. Perplexitu z tabulky dostaneme jako eztráta: bigram e1,947 = 7,00, transformer e0,532 = 1,70.
4. Co se model naučil: shoda podle rodu
Konkrétní zkouška: dáme modelu text „osoba š“ a podíváme se, s jakou pravděpodobností doplní „l“ (tedy „šla“) místo „e“ („šel“). Aby se rozhodl správně, musí se podívat o několik znaků zpátky, na podmět.
| Dvojice | P(„šla“) po mužském tvaru | P(„šla“) po ženském tvaru |
|---|---|---|
| muž / žena | 3 % | 95 % |
| král / královna | 1 % | 86 % |
| otec / matka | 5 % | 74 % |
| syn / dcera | 6 % | 93 % |
| chlapec / dívka | 49 % | 63 % |
| princ / princezna | 1 % | 68 % |
V průměru čeká transformer „šla“ po ženských osobách s pravděpodobností 80 % a po mužských jen 11 %. Síť bez pozornosti rod nerozliší vůbec (26 % a 29 %): vidí jen „š“. Model ale není dokonalý — u dvojice chlapec/dívka váhá (49 % proti 63 %).
Příklad — rozdělení dalšího znaku po „princezna š“
Číslo v tabulce je jedna složka softmaxu z posledního řádku logitů: P(„l“) = ezl/∑c ezc přes všech 36 znaků. Po „princezna š“ dává transformer
P(l) = 0,679, P(e) = 0,314, součet 0,993
síť bez pozornosti: P(l) = 0,281, P(e) = 0,259
Transformer skoro všechnu pravděpodobnost rozdělí mezi „šla“ a „šel“ — pozná, že za podmětem začíná sloveso. A které z nich, rozhoduje rod podmětu o několik znaků zpátky. Síť bez pozornosti zná jen „š“, a tak se chová podobně jako bigram (P(l | š) = 0,291, P(e | š) = 0,313).
Váhy ukazují, že se hlavy většinou dívají jeden až tři znaky zpátky — sestavují si z nich slabiky a slova. Matice je trojúhelníková: nad úhlopříčkou nic není, to je kauzální maska.
5. Generování textu a teplota
Text se generuje znak po znaku: model spočte pravděpodobnosti dalšího znaku, jeden se vylosuje (s teplotou z dílu o softmaxu), přidá se na konec a opakuje se to. Začátek „královna “:
| Teplota | vygenerovaný text |
|---|---|
| 0 | královna vládla v paláci a a seděla na trůnu. král vládla v paláci a a seděla n |
| 0,5 | královna vládla v paláci a a seděla na trůna ři. k obědu byl jablko a na talíři |
| 1 | královna vládla v paláci a ahrušel po ulice a lidi. král na hřišti jako a malý. |
| 1,5 | královna v paláci a achráce. muž šela po u aví česka má hranicekla ahoj. chlavn |
S teplotou 0 (vždy nejpravděpodobnější znak) model opakuje své nejčastější věty — a i tak dělá chyby („a a“, „král vládla“): rod u slovesa, které je od podmětu daleko, se nenaučil vždycky. Kolem teploty 0,5–1 vznikají nové kombinace známých kousků. S teplotou 1,5 se text rozpadá na skoro-slova. Stejný knoflík mají i velké jazykové modely.
pk = exp(zk/τ)/∑j exp(zj/τ)
- zk
- logit znaku k na poslední pozici — co model „navrhuje“; učil se s τ = 1
- τ
- teplota (v tabulce „Teplota“, ve vzorci τ, aby se nepletla s délkou textu T) — dělí rozdíly logitů: τ < 1 je zvětší a rozdělení zostří, τ > 1 je zmenší a rozdělení zploští; pro τ → 0 zbude jen nejpravděpodobnější znak
- pk
- pravděpodobnost, s jakou se znak k vylosuje; součet přes všechny znaky je 1 pro každou teplotu
Příklad — „princezna š“ při různých teplotách
Při teplotě 1 je P(l) = 0,679 a P(e) = 0,314, poměr 0,679/0,314 = 2,16. Protože pk ∝ ezk (∝ znamená „rovná se až na kladný násobek, společný pro všechna k“), je exp(zk/τ) = (ezk)1/τ ∝ pk1/τ a stačí umocnit a znovu normalizovat:
τ = 0,5: poměr 2,162,00 = 4,68, pl = 0,824, pe = 0,176
τ = 1: poměr 2,161,00 = 2,16, pl = 0,679, pe = 0,314
τ = 1,5: poměr 2,160,67 = 1,67, pl = 0,595, pe = 0,355
Barvy odpovídají členům vzorce výše.
Při τ = 0,5 se „šla“ vylosuje skoro v pěti případech ze šesti, při τ = 1,5 už jen asi v 59 %.
def generuj(model, zacatek, delka, tau):
text = zacatek
for _ in range(delka):
z = model(text[-24:])[-1] # logity posledního znaku
if tau == 0:
k = argmax(z) # vždy nejpravděpodobnější
else:
p = softmax(z / tau)
u = random() # rovnoměrně z [0, 1)
k = 0
while u > p[k]: # ruleta: znak k zabírá úsek délky p[k]
u -= p[k]
k += 1
text += znaky[k] # přidat a pokračovat s delším textem
return text
6. Od 11 tisíc ke stovkám miliard
- Stejná architektura, jiné měřítko. GPT-2 (2019) měl 1,5 miliardy parametrů a 48 bloků, GPT-3 (2020) 175 miliard a 96 bloků — patnáctmilionkrát víc než náš model. Místo 24 znaků vidí tisíce až statisíce tokenů.
- Tokeny místo znaků. Velké modely nepíšou po znacích, ale po kouscích slov — o tom je díl o tokenizaci.
- Poziční informace. Místo naučených pozičních embeddingů se dnes používají rotace (RoPE), které lépe zvládají delší texty.
- Učení. Předtrénování na bilionech tokenů trvá měsíce na tisících grafických karet; pak přichází doladění, aby z modelu, který doplňuje text, byl asistent. Obojí probírají další díly.
N ≈ nbloků · ( 4d2 + 8d2 ) = 12 · nbloků · d2
- 4d2
- pozornost: matice WQ, WK, WV, WO, každá d × d (hlavy si jen dělí sloupce, počet parametrů nemění)
- 8d2
- MLP: velké modely mají vnitřní šířku 4d, tedy d · 4d + 4d · d; MLP drží dvě třetiny parametrů
- nbloků
- počet bloků nad sebou — každý má vlastní matice
- N
- počet parametrů bez embeddingů; posuny, LayerNorm a embeddingy jsou proti d2 členům u velkých modelů zanedbatelné
Příklad — GPT-2, GPT-3 a náš model
GPT-2 (48 bloků, d = 1 600): 12 · 48 · 1 6002 = 1,47 miliardy (uváděno 1,5 miliardy)
GPT-3 (96 bloků, d = 12 288): 12 · 96 · 12 2882 = 174 miliard (uváděno 175 miliard)
náš model (1 blok, d = 32): 1 · (4 · 322 + 4 · 322) = 8 192 v maticích bloku (MLP má u nás šířku 2d, proto 4d2 místo 8d2); zbylých 3 396 z 11 588 jsou embeddingy, výstupní vrstva, posuny a LayerNorm — u malého modelu nejsou zanedbatelné
Barvy odpovídají členům vzorce výše. Rozměry jsou z článků Radford a kol. (2019) a Brown a kol. (2020). Výpočetní cena učení se odhaduje na 6N operací na token (dopředný průchod 2N, zpětný asi 4N); GPT-3 se učil na 300 miliardách tokenů, tedy 6 · 175 · 109 · 300 · 109 ≈ 3,15 · 1023 operací — Brown a kol. uvádějí 3,14 · 1023.
7. Shrnutí
- Jazykový model předpovídá další token; učí se křížovou entropií na velkém textu.
- Blok transformeru = kauzální vícehlavá pozornost + MLP, obojí s reziduálním spojením a normalizací vrstvy.
- Náš transformer s 11 588 parametry dosáhl perplexity 1,7; bigram 7,0 a stejná síť bez pozornosti 7,3.
- Pozornost mu dovolila naučit se shodu podle rodu: „šla“ po ženských osobách 80 %, po mužských 11 %.
- Generuje se znak po znaku a teplota řídí, jak odvážně; velké modely jsou totéž ve větším.
Chcete si to osahat? Nechte AI agenta napsat tento transformer v PyTorchi (je to asi sto řádků, třeba podle Karpathyho „nanoGPT“) a naučit ho na vaší oblíbené knize — a sledujte, jak se s počtem kroků zlepšuje text.
Máte na to jiný názor? Napište na support@coden-app.com.