🧠 Transformer Playground

OpenTechLab Jablonec nad Nisou · Science Micro Elementary School

Skutečnou silou AI je schopnost rozumět myšlenkám a generovat nové myšlenky - čili myslet. Předchozí lekce umožnily hluboké prozkoumání a pochopení všeho potřebného. Attention is all you need.

🔗 Návaznost na předchozí znalosti

🔢 MLP Grayscale

Pixely → čísla → třídy

+

🔮 Autoencoder

Komprese → latent → rozbalení

=

🧠 Transformer

Slova → vektory → predikce

📖 Na úvod
🔢 Token Embedding (Malé MLP)

Vše začíná a končí u starého známého MLP. Každé slovo (token) má svou vlastní malou neuronovou síť. Ta se stará o embedding – převede "hloupé" číslo (ID slova) na bohatou vektorovou reprezentaci v n-rozměrném prostoru. Díky tomu jazykový model pochopí, že slova "Babička" a "Babča" leží v prostoru blízko sebe.

👀 Self-Attention (Mechanismus pozornosti)

Funguje jako "chytrá ústředna". Vektory se transformují na Query (Q), Key (K) a Value (V). Každé slovo se "podívá" na ostatní a podle shody Q a K si "přimíchá" informace od souvisejících slov. Vzniká tak kontext (např. "koruna" v kontextu "platit" = peníze, ne královský klenot).

🧠 Feed-Forward Network (Hlavní MLP)

Obohacené vektory, které nyní nesou svůj význam i kontext celé věty, vstupují do hlavní velké sítě. Toto MLP s mnoha skrytými vrstvami funguje jako mozek operace – hledá v datech hluboké nelineární vztahy a "chápe" sémantiku příběhu.

🎯 Softmax Predikce

Na konci hlavní sítě vypadnou nová čísla. Funkce Softmax je převede na pravděpodobnosti a vybere ze slovníku slovo, které s největší jistotou patří na chybějící místo.

📝 Vstup - Pohádka

Slovník (klikni pro výběr):
Vstupní věta (6 pozic):
📖 Příklady vět:

🔬 Vizualizace sítě

Token Blocks (16→8→4)
Main MLP (Kontext)
Aktivní neuron
Predikce

🎯 Výstup

Předpověď chybějícího slova:
?
Epoch
0
Loss
Přesnost
0%
Slovník
0
Trénovací log:
Připraven k tréninku...

📚 Trénovací Dataset (klikni pro úpravu)

🧩 Jak Transformer funguje? (Architektura modelu)

📝
1. Tokenizace
"Vlk" → ID 0
One-Hot Encoder
🔢
2. Embedding
Význam slova
(Vektor 8 čísel)
👀
3. Self-Attention
"Kdo se dívá na koho?"
Kontext (Q, K, V)
🧠
4. Feed-Forward
Main MLP
Zpracování
🎯
5. Predikce
Softmax
→ Výstup

💡 Attention Is All You Need: Tento simulátor ukazuje "Jednovrstvý Transformer s jednou hlavou" (Single-Head Attention).

Rozdíly oproti GPT-4:
1. Single-Head vs Multi-Head: My máme 1 sadu Q/K/V (jednu "hlavu"), takže síť sleduje jen jeden typ vztahu. GPT jich má tisíce, aby sledovala gramatiku, význam i styl naráz.
2. Hloubka: GPT má těchto bloků (Attention + FFNN) třeba 96 za sebou. My máme jeden.
3. Layer Norm: Reálné sítě normalizují data po každém kroku. My to řešíme malým Learning Rate.

🤔 Proč naše síť nedokáže zobecňovat?

Vstup v datasetu:
"Vlk Sežere [?]"
Predikce:
Babička ✓
Síť to viděla při tréninku
Změněná pozice [?]:
"Vlk [?] Babička"
Predikce:
Domek ?!
Tuto kombinaci nikdy neviděla

💡 Proč se to děje?

1. Malý dataset (16 příkladů)
Síť zná jen přesné kombinace slov, které viděla při tréninku. Změna pozice [?] je pro ni úplně nová situace.

2. Pattern matching místo porozumění
Naše "nanosíť" nemá dost kapacity, aby pochopila sémantický vztah mezi "Vlk" a "Babička". Naučila se jen rozpoznávat konkrétní vzory sekvencí.

3. Omezená attention
S 8-dimenzionálním embeddingem a jednou attention hlavou nemůže zachytit složité jazykové vztahy nezávisle na pozici slov.

Naše síť
~500
parametrů
GPT-3.5
175 Miliard
parametrů
GPT-4
1.8 Trilionů
parametrů (odhad)

🎓 To je důvod, proč velké modely potřebují být velké — aby dokázaly zobecňovat!

📚 Teorie: Matematika Transformeru

🔢 1. One-Hot Encoding (Tokenizace)

Každé slovo ze slovníku převedeme na vektor, kde je jedna jednička na pozici odpovídající ID slova.

"Vlk" (ID=0) → [1, 0, 0, 0, ..., 0]16
"Babička" (ID=1) → [0, 1, 0, 0, ..., 0]16
Délka vektoru = velikost slovníku (16 slov)

Proč? Neuronová síť pracuje s čísly, ne s textem. One-Hot je první krok překladu.

📊 2. Token Embedding (Naučená reprezentace)

Malá MLP síť převede "hloupý" One-Hot vektor na bohatý embedding vektor v n-rozměrném prostoru.

Matematicky (lineární transformace + aktivace):
e = ReLU(Wemb × xone-hot + bemb)
xone-hot ∈ ℝ16 → e ∈ ℝ8 (komprese 16→8)
Leaky ReLU
f(x) = max(0.1x, x)
Derivace
f'(x) = 1 if x > 0, else 0.1

👀 3. Self-Attention (Q, K, V)

Jádro Transformeru. Každý token se "podívá" na ostatní a podle podobnosti si přimíchá jejich informace.

1. Query, Key, Value (pro každý token):
Qi = WQ × ei   |   Ki = WK × ei   |   Vi = WV × ei
2. Attention Score (jak moc se token i dívá na j):
scoreij = (Qi · Kj) / √dk
3. Attention Weights (normalizace přes Softmax):
αij = softmax(scorei)j = escoreij / Σk escoreik
4. Context Vector (vážený součet hodnot):
contexti = Σj αij × Vj

💡 Intuice: Query = "Co hledám?", Key = "Co nabízím?", Value = "Jakou informaci nesu?". Čím více se Q a K shodují, tím více se přimíchá odpovídající V.

🎯 4. Softmax & Cross-Entropy Loss

Výstupní vrstva převede surové logity na pravděpodobnosti. Chyba měří, jak daleko jsme od správné odpovědi.

Softmax
pk = ezk / Σj ezj
Σ pk = 1 (součet = 100%)
Cross-Entropy Loss
L = -log(ptarget)
Čím vyšší p pro správnou třídu, tím nižší L
Gradient pro backpropagation (elegantně jednoduchý!):
∂L/∂zk = pk - yk
yk = 1 pro správnou třídu, jinak 0

💻 Implementační průvodce

1. One-Hot Encoding
function oneHot(idx, vocabSize) {

    const vec = new Array(vocabSize).fill(0);

    if (idx >= 0 && idx < vocabSize) vec[idx] = 1;

    return vec;

}
2. Softmax
function softmax(logits) {

    const maxLogit = Math.max(...logits);  // Numerická stabilita

    const exps = logits.map(x => Math.exp(x - maxLogit));

    const sum = exps.reduce((a, b) => a + b, 0);

    return exps.map(x => x / sum);

}
3. Self-Attention Forward
function attention(embeddings, Wq, Wk, Wv) {

    const seqLen = embeddings.length;

    const dim = embeddings[0].length;

    

    // 1. Compute Q, K, V

    const Q = embeddings.map(e => matMul(e, Wq));

    const K = embeddings.map(e => matMul(e, Wk));

    const V = embeddings.map(e => matMul(e, Wv));

    

    // 2. Attention scores

    const scores = [];

    for (let i = 0; i < seqLen; i++) {

        const row = [];

        for (let j = 0; j < seqLen; j++) {

            const dot = Q[i].reduce((sum, q, d) => sum + q * K[j][d], 0);

            row.push(dot / Math.sqrt(dim));  // Scaled dot-product

        }

        scores.push(row);

    }

    

    // 3. Softmax per row

    const weights = scores.map(row => softmax(row));

    

    // 4. Weighted sum of V

    const output = [];

    for (let i = 0; i < seqLen; i++) {

        const contextVec = new Array(dim).fill(0);

        for (let j = 0; j < seqLen; j++) {

            for (let d = 0; d < dim; d++) {

                contextVec[d] += weights[i][j] * V[j][d];

            }

        }

        output.push(contextVec);

    }

    return output;

}
4. Cross-Entropy Gradient
function crossEntropyGradient(probs, targetIdx) {

    // Elegantní vzorec: gradient = p - y

    return probs.map((p, i) => p - (i === targetIdx ? 1 : 0));

}



// Loss pro logging

const loss = -Math.log(probs[targetIdx] + 1e-10);

🎓 Klíčové ponaučení

Transformer kombinuje embedding (význam slov), attention (kontext) a feed-forward network (hluboké vztahy) do jediné architektury, která revolucionizovala zpracování jazyka.