---
title: "Anatomia LLM: blok Transformera"
date: 2026-06-13
description: "Jak z jednej warstwy uwagi powstaje cały model: trzy rodziny architektur i dlaczego dzisiejsze LLM-y to prawie zawsze „dekoder”, połączenia rezydualne i normalizacja, które pozwalają piętrzyć dziesiątki warstw, sieć FFN jako magazyn wiedzy, a na końcu - jak z wektora liczb wyłania się konkretne słowo, od softmaksu po temperaturę i nucleus sampling."
tags: ["anatomia llm", "ai", "llm", "transformer", "deep-dive"]
---

## 🚀 Intro

W [poprzednim przystanku tej serii](/posty/llm-mechanizm-uwagi) - jednej z gałęzi [przeglądowego wpisu „Anatomia LLM"](/posty/anatomia-llm) - rozłożyliśmy na części **mechanizm uwagi**: zobaczyliśmy, jak token tworzy zapytanie, klucz i wartość, jak porównuje się z innymi i jak domieszuje do siebie informację od najistotniejszych sąsiadów. Ale na końcu padło ważne zastrzeżenie: uwaga to dopiero **jeden klocek**. Sama z siebie nie jest jeszcze modelem.

W tym wpisie składamy z klocków całą maszynę. Zobaczymy, jak warstwa uwagi łączy się z **siecią przetwarzającą** w jeden powtarzalny **blok Transformera**, jak dwa proste pomysły - **połączenia rezydualne** i **normalizacja** - pozwalają układać te bloki w stosy o dziesiątkach warstw, nie psując przy tym treningu, i jak na samym końcu model zamienia swój wewnętrzny wektor liczb z powrotem w słowo, które czytasz.

Po drodze odpowiemy też na pytanie, które zwykle zostaje bez odpowiedzi: skoro istnieją różne sposoby budowania takich modeli, **dlaczego** dzisiejsze LLM-y - od ChatGPT po Claude'a - wybrały akurat jeden z nich? I jak zwykle w tej serii: sam plan budowy okaże się zaskakująco prosty i regularny, a to, co z niego wyrasta przy dostatecznej skali - wciąż nie do końca przewidywalne.

> 💡 **Jak czytać ten tekst.** Główny wątek jest opisowy i samowystarczalny. Wzory chowam w rozwijanych blokach „dla dociekliwych" - jeśli lubisz matematykę, rozwiń; jeśli nie, pomiń bez straty dla zrozumienia. Wszystkie twierdzenia mają przypisy do prac źródłowych na końcu.


## 📋 TL;DR

- **Trzy rodziny, jeden zwycięzca.** Z oryginalnego Transformera wyrosły trzy architektury: enkoder-dekoder (T5), tylko-enkoder (BERT) i tylko-dekoder (GPT). Dzisiejsze generatywne LLM-y to prawie zawsze **dekodery** - bo cel „przewiduj następny token" jest naturalnie generatywny, prosty i świetnie się skaluje.
- **Połączenia rezydualne = autostrada dla gradientu.** Każda pod-warstwa nie zastępuje swojego wejścia, lecz **dodaje** do niego poprawkę. Dzięki tej „ścieżce na skróty" gradient dociera do najgłębszych warstw i można trenować stosy o setkach warstw.
- **Normalizacja stabilizuje.** LayerNorm (a w nowszych modelach tańszy RMSNorm) sprowadza aktywacje do wspólnej skali. Drobna decyzja - czy normalizować **przed** pod-warstwą (Pre-LN), czy **po** (Post-LN) - decyduje, czy trening trzeba „rozgrzewać", czy nie.
- **FFN to magazyn wiedzy.** Po uwadze każdy token przechodzi przez małą sieć w przód (FFN), która rozszerza wektor czterokrotnie i z powrotem go ściska. To w niej siedzi ok. **2/3 parametrów** bloku - i prawdopodobnie większość „wiedzy" modelu.
- **Od wektora do słowa.** Ostatni wektor każdego tokenu rzutuje się na cały słownik (**logity**), a softmax zamienia logity w **rozkład prawdopodobieństwa** następnego słowa.
- **Dekodowanie to nie detal.** To, jak z tego rozkładu wybierzemy token - zachłannie, czy losując z **temperaturą** i **nucleus samplingiem** - decyduje, czy tekst będzie nudny, szalony, czy w sam raz.
- **Mixture of Experts.** Najnowszy kierunek: zamiast jednej sieci FFN model ma wielu „ekspertów", a dla każdego tokenu uruchamia tylko kilku. Ogromna liczba parametrów przy **stałym** koszcie liczenia.

👉 **Pobaw się:** na stronie interaktywnej masz [sekcję bloku Transformera](/llm/anatomia#transformer) - zobacz, jak warstwy układają się w stos z połączeniami rezydualnymi i normalizacją.


## 🏛️ Trzy rodziny: dlaczego LLM to „dekoder"

Oryginalny Transformer (Vaswani i in., 2017) został zaprojektowany do **tłumaczenia maszynowego** i miał budowę **enkoder-dekoder**: dwa stosy po sześć warstw. Enkoder czytał całe zdanie źródłowe, dekoder produkował tłumaczenie, zaglądając do enkodera przez uwagę skrośną[^vaswani]. Ale z tej jednej architektury wyrosły z czasem **trzy rodziny** modeli - zależnie od tego, którą połowę się zachowa i jak się ją wytrenuje.

- **Tylko-enkoder** - sztandarowy przykład to **BERT** (Devlin i in., 2018). Sam stos enkodera z **dwukierunkową** uwagą: każdy token widzi naraz to, co po lewej i po prawej. Trenuje się go, zasłaniając losowe słowa i każąc je odgadnąć (Masked Language Modeling). Świetny do *rozumienia* tekstu - klasyfikacji, wyszukiwania, analizy - ale z natury **nie generuje** tekstu słowo po słowie[^bert].
- **Enkoder-dekoder** - np. **T5** (Raffel i in., 2019), który każde zadanie NLP ujmuje jako „tekst na wejściu → tekst na wyjściu"[^t5]. Zachowuje obie połowy oryginału.
- **Tylko-dekoder** - **GPT** (Radford i in., 2018/2019) i prawie wszystko, co dziś nazywamy „dużym modelem językowym". Sam stos dekodera z **maskowaną (przyczynową) uwagą**, którą poznaliśmy w poprzednim wpisie: każdy token widzi tylko przeszłość. Trenuje się go jako zwykły autoregresyjny model języka - „przewiduj następny token"[^gpt][^gpt2].

Dlaczego to właśnie **dekodery** zdominowały świat generatywnych LLM-ów? Złożyło się na to kilka rzeczy. Cel autoregresyjny - „zgadnij następne słowo" - jest **naturalnie generatywny** (model uczy się dokładnie tego, co potem robi) i **samonadzorowany**: nie wymaga żadnych etykiet, surowy tekst sam jest swoją odpowiedzią, więc da się go karmić całym internetem. Architektura jest też **prostsza** - jeden stos, bez uwagi skrośnej - i pozwala na efektywne generowanie z KV-cache, o którym była mowa poprzednio. Podejście GPT okazało się po prostu **najlepiej skalować** z rozmiarem modelu i ilością danych[^gpt3].

Warto tu jednak uczciwie postawić znak ostrożności: „dekoder jest lepszy" to **obserwacja empiryczna**, ugruntowana inżyniersko i potwierdzona praktyką ostatnich lat, a nie twierdzenie z formalnym dowodem. Tak się złożyło, że ta droga zaprowadziła najdalej.


## 🔗 Połączenia rezydualne: autostrada dla gradientu

Gdy próbujemy budować bardzo głębokie sieci - dziesiątki, setki warstw - pojawia się stary wróg z wcześniejszych wpisów: **zanikający gradient**. Sygnał uczący, wędrując wstecz przez wiele warstw, słabnie tak bardzo, że najgłębsze warstwy niemal się nie uczą. Przez lata to był sufit, o który rozbijała się głębokość sieci.

Przełom przyszedł z rozpoznawania obrazów. **ResNet** (He i in., 2015) wprowadził pomysł tak prosty, że aż zaskakujący, że trzeba było na niego czekać: zamiast kazać warstwie uczyć się od zera całego pożądanego przekształcenia, każ jej uczyć się tylko **poprawki** do tego, co już dostała na wejściu. Wyjście warstwy to nie „nowy wektor", lecz „wektor wejściowy **plus** to, co warstwa chciała dorzucić". Ten pozornie kosmetyczny zabieg pozwolił trenować sieci o głębokości 152, a w eksperymentach nawet tysiąca warstw[^resnet].

Dlaczego to działa? Bo owo „plus wejście" tworzy **ścieżkę na skróty** - dosłownie autostradę, którą gradient może przejechać wstecz przez całą sieć, omijając po drodze wszystkie kosztowne przekształcenia. Nawet jeśli warstwa pośrodku „dławi" sygnał, identycznościowa obwodnica zostaje przejezdna. W Transformerze **każda** pod-warstwa - i uwaga, i sieć FFN - jest opakowana w takie połączenie rezydualne. To one są kręgosłupem, dzięki któremu w ogóle da się piętrzyć kilkadziesiąt warstw jedna na drugiej.

Jest tu jeszcze cichy warunek techniczny: skoro do wyjścia pod-warstwy **dodajemy** jej wejście, oba muszą mieć ten sam rozmiar. Dlatego wszystkie pod-warstwy i embeddingi w Transformerze dzielą jeden wspólny wymiar $d_{\text{model}}$ (czytaj „de model") - to dlatego ta jedna liczba przewija się przez całą architekturę[^vaswani].

<details>
<summary>📐 Dla dociekliwych: matematyka połączenia rezydualnego</summary>

W ResNecie zamiast uczyć warstwę bezpośrednio przekształcenia docelowego $H(x)$, uczymy ją **reszty** (stąd „rezydualne") $F(x) = H(x) - x$, a wyjście składamy z powrotem:

$$y = F(x) + x$$

Gdy liczymy gradient wstecz, pochodna tej sumy zawiera składnik **tożsamościowy** (od „$+x$"), który przepuszcza sygnał uczący dalej niezależnie od tego, co robi $F$. To właśnie ta jedynka w pochodnej jest „autostradą".

W oryginalnym Transformerze (wariant Post-LN) pełne wyjście pod-warstwy to:

$$\text{LayerNorm}\big(x + \text{Sublayer}(x)\big)$$

gdzie $\text{Sublayer}$ to albo uwaga, albo sieć FFN[^vaswani]. Aby dodawanie $x$ było w ogóle wykonalne, $x$ i $\text{Sublayer}(x)$ muszą mieć identyczny wymiar $d_{\text{model}}$.

</details>


## 📏 Normalizacja: wspólna skala dla wszystkich

Drugi filar, bez którego głębokie stosy by się nie trenowały, to **normalizacja**. Problem jest taki: gdy sygnał przechodzi przez wiele warstw, wartości aktywacji potrafią dryfować - raz robią się ogromne, raz znikomo małe. Taki rozjazd skali destabilizuje uczenie. Normalizacja działa jak ciągłe „resetowanie miary": sprowadza wektor z powrotem do wystandaryzowanego zakresu, zanim podamy go dalej.

Standardem w Transformerze jest **LayerNorm** (Ba, Kiros, Hinton, 2016). Liczy on średnią i rozrzut **w obrębie jednego tokenu**, po wszystkich jego cechach, i na tej podstawie standaryzuje wektor[^layernorm]. Kluczowa jest tu różnica wobec wcześniejszego pomysłu zwanego BatchNorm, który liczył statystyki **w poprzek całej paczki przykładów**. LayerNorm patrzy tylko na pojedynczy przykład, więc jest **niezależny od rozmiaru i składu paczki** i działa identycznie w treningu i w użyciu - co czyni go naturalnym wyborem dla sekwencji o zmiennej długości.

Pojawia się jednak subtelne, a brzemienne w skutkach pytanie: czy normalizować **przed** pod-warstwą, czy **po** niej?

- **Post-LN** (jak w oryginale): najpierw uwaga lub FFN, potem dodanie wejścia, a normalizacja **na końcu**.
- **Pre-LN** (jak w nowoczesnych modelach): najpierw normalizacja wejścia, dopiero potem pod-warstwa i dodanie.

Xiong i in. (2020) pokazali, że to nie jest kosmetyka. W Post-LN gradienty przy warstwach blisko wyjścia są na starcie treningu bardzo duże, co czyni go niestabilnym i **wymusza „rozgrzewkę"** (warm-up) współczynnika uczenia - powolne rozpędzanie na początku. W Pre-LN gradienty są od razu dobrze wyważone, dzięki czemu rozgrzewkę można pominąć, a trening jest stabilniejszy[^xiong]. Dlatego dzisiejsze duże modele - GPT-2, GPT-3, LLaMA - stosują **Pre-LN**.

Nowsze modele idą o krok dalej i sięgają po **RMSNorm** (Zhang i Sennrich, 2019). To uproszczony LayerNorm: rezygnuje z odejmowania średniej (centrowania), zostawiając samo skalowanie. Efekt? Taka sama mniej więcej jakość, ale liczenie tańsze o kilka do kilkudziesięciu procent[^rmsnorm]. LLaMA i wiele współczesnych modeli używa właśnie RMSNorm w trybie pre-normalizacji.

<details>
<summary>📐 Dla dociekliwych: LayerNorm i RMSNorm we wzorach</summary>

**LayerNorm.** Dla wektora cech jednego tokenu $x \in \mathbb{R}^{d}$ liczymy najpierw średnią i wariancję po jego współrzędnych:

$$\mu = \frac{1}{d}\sum_{i=1}^{d} x_i, \qquad \sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i - \mu)^2$$

a potem standaryzujemy i przeskalowujemy uczonymi parametrami:

$$\text{LayerNorm}(x) = \gamma \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$

Tu $\mu$ (mi) to średnia, $\sigma^2$ (sigma kwadrat) - wariancja, czyli miara rozrzutu, a $\sigma$ (sigma) bez kwadratu to odchylenie standardowe. Maleńkie $\epsilon$ (epsilon) chroni przed dzieleniem przez zero. Wektory $\gamma$ (gamma) i $\beta$ (beta) to **uczone** parametry skali i przesunięcia - pozwalają sieci cofnąć normalizację, jeśli akurat jej nie potrzebuje. Symbol $\odot$ oznacza mnożenie po współrzędnych[^layernorm].

**RMSNorm** wyrzuca odejmowanie średniej i dzieli po prostu przez pierwiastek ze średniej kwadratów (stąd nazwa - root mean square):

$$\text{RMSNorm}(x) = \frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2 + \epsilon}} \odot \gamma$$

Mniej operacji, brak liczenia średniej - stąd oszczędność czasu przy porównywalnej jakości[^rmsnorm].

</details>


## 🧮 Feed-Forward Network: magazyn wiedzy

Po pod-warstwie uwagi w każdym bloku czeka druga pod-warstwa: **sieć w przód** (Feed-Forward Network, FFN; bywa nazywana MLP). To prosta, dwuwarstwowa sieć, którą poznaliśmy na samym początku serii - ale ma tu kluczową rolę.

Działa według schematu **„rozszerz i skompresuj"**. Najpierw bierze wektor tokenu i rzutuje go w przestrzeń **cztery razy większą** (w oryginale: z 512 wymiarów do 2048), przepuszcza przez nieliniowość, a potem ściska z powrotem do wymiaru wyjściowego[^vaswani]. Ta chwilowa „rozdmuchana" przestrzeń daje sieci dużo więcej miejsca na reprezentowanie i mieszanie cech - jakby na moment rozłożyła wszystkie narzędzia na większym stole, by wybrać właściwe, i potem znów je spakowała. Współczynnik **4×** to konwencja powtarzana w większości modeli (w GPT-3 ta ukryta warstwa ma ponad 49 tysięcy wymiarów).

I tu kryje się rzecz, która zaskakuje wielu: to **nie uwaga**, lecz właśnie FFN pochłania zwykle większość parametrów bloku - około **dwóch trzecich**. Jeśli uwaga jest mechanizmem **komunikacji** między tokenami (kto z kim wymienia informację), to FFN jest mechanizmem **przetwarzania** tego, co dany token zebrał - i prawdopodobnie głównym **magazynem wiedzy** modelu. Coraz więcej badań sugeruje, że to w wagach FFN siedzą zapamiętane fakty i wzorce. *(To stosunek przybliżony - dokładny zależy od architektury.)*

Z czasem zmieniła się też nieliniowość w środku FFN. Oryginał używał ReLU, ale BERT i GPT przeszły na gładsze **GELU**[^gelu], a wiele dzisiejszych modeli - na **SwiGLU** (Shazeer, 2020), wariant z bramkowaniem, w którym jedna projekcja „reguluje przepływ" drugiej[^swiglu]. LLaMA stosuje właśnie SwiGLU - a żeby mimo trzech macierzy zamiast dwóch nie rozdąć liczby parametrów, zmniejsza wymiar ukryty do około dwóch trzecich tego, co dałoby zwykłe 4×[^llama].

<details>
<summary>📐 Dla dociekliwych: FFN i SwiGLU we wzorach</summary>

Klasyczna sieć FFN to dwie warstwy liniowe z nieliniowością $\max(0, \cdot)$ (czyli ReLU) pomiędzy nimi:

$$\text{FFN}(x) = \max(0,\, xW_1 + b_1)\,W_2 + b_2$$

Pierwsza macierz $W_1$ rozszerza wymiar do $d_{ff}$ (czytaj „de ef ef"), zwykle $4 \times d_{\text{model}}$; druga macierz $W_2$ ściska z powrotem[^vaswani].

Skąd „2/3 parametrów"? Dwie macierze FFN o wymiarach $d_{\text{model}} \times 4d_{\text{model}}$ to razem około $8\,d_{\text{model}}^2$ wag, podczas gdy cztery projekcje uwagi (zapytania, klucze, wartości, wyjście) to około $4\,d_{\text{model}}^2$. Stąd proporcja mniej więcej $8:4$, czyli $2/3$ na korzyść FFN.

**SwiGLU** zastępuje pojedynczą nieliniowość **bramką** - iloczynem dwóch osobnych projekcji, z których jedna przechodzi przez funkcję Swish:

$$\text{SwiGLU}(x) = \big(\text{Swish}(xW_1) \odot xW_3\big)\,W_2$$

Symbol $\odot$ to mnożenie po współrzędnych - to ono realizuje „bramkowanie": wartości jednej gałęzi regulują, ile przepuścić z drugiej. Trzy macierze zamiast dwóch zwiększyłyby liczbę parametrów, więc LLaMA kompensuje to, zmniejszając wymiar ukryty do $\frac{2}{3}\cdot 4d$[^swiglu][^llama].

</details>


## 🎰 Od wektora do słowa: warstwa wyjściowa

Token przeszedł przez cały stos bloków - uwaga, FFN, rezydua, normalizacja, warstwa po warstwie. Na wyjściu ostatniego bloku jest wciąż tym, czym był przez całą drogę: **wektorem liczb** o wymiarze $d_{\text{model}}$. Trzeba go jeszcze zamienić w coś, co rozumiemy - w przewidywane **słowo**.

Robi to **głowa językowa** (po angielsku *LM head* albo *unembedding* - „odembeddowanie", bo to operacja odwrotna do zamiany tokenu na wektor z [trzeciego wpisu serii](/posty/llm-tokeny-embeddingi)). To jedna duża macierz, która rzutuje wektor tokenu na **cały słownik**: dla każdego z dziesiątek tysięcy możliwych tokenów wylicza jedną liczbę - tzw. **logit**, surową „punktację dopasowania". Im wyższy logit, tym bardziej model skłania się ku temu tokenowi.

Logity to jednak jeszcze nie prawdopodobieństwa - to dowolne liczby, dodatnie i ujemne. Zamienia je w porządny rozkład prawdopodobieństwa stary znajomy: **softmax**. Bierze wszystkie logity, podnosi je do potęgi (co czyni je dodatnimi i wyostrza różnice) i normalizuje tak, by sumowały się do jedynki. Wynik to rozkład „z jakim prawdopodobieństwem następnym słowem jest każdy z tokenów słownika".

Ciekawostka oszczędnościowa: w wielu modelach (np. GPT-2) ta sama macierz służy i do zamiany tokenu na wektor **na wejściu**, i do rzutowania z powrotem na słownik **na wyjściu** - to tzw. **weight tying** (wiązanie wag), które oszczędza ogromną liczbę parametrów. *(Nie jest to jednak uniwersalne - LLaMA np. trzyma osobne macierze.)*

<details>
<summary>📐 Dla dociekliwych: logity i softmax na wyjściu</summary>

Niech $h \in \mathbb{R}^{d_{\text{model}}}$ będzie wektorem tokenu po ostatnim bloku. Głowa językowa rzutuje go macierzą odembeddowania $W_U$ na wektor **logitów** o długości równej rozmiarowi słownika $|V|$:

$$z = h\,W_U$$

Softmax zamienia logity $z$ w rozkład prawdopodobieństwa nad słownikiem:

$$P(\text{token}_i \mid \text{kontekst}) = \frac{\exp(z_i)}{\sum_{j=1}^{|V|} \exp(z_j)}$$

Mianownik (suma po wszystkich tokenach słownika, oznaczona symbolem $\Sigma$ - sigma) gwarantuje, że prawdopodobieństwa zsumują się do jedynki. Przy **weight tying** macierz $W_U$ jest po prostu transpozycją macierzy embeddingów wejściowych.

</details>


## 🎲 Dekodowanie: jak naprawdę wybiera się słowo

Mamy rozkład prawdopodobieństwa nad całym słownikiem. Wydawałoby się: wybierz najbardziej prawdopodobny token i gotowe. Tyle że to, **jak** wybierzemy następny token z tego rozkładu - zwane **strategią dekodowania** - okazuje się jednym z najważniejszych pokręteł jakości. Strona interaktywna kwituje to jednym słowem „losowanie", ale kryje się za nim cała rodzina metod.

- **Dekodowanie zachłanne** (greedy) - zawsze bierz token o najwyższym prawdopodobieństwie. Deterministyczne i bezpieczne, ale podatne na nudę i **zapętlanie się** w powtórzeniach[^holtzman].
- **Beam search** - utrzymuj naraz $k$ najlepszych częściowych zdań i rozwijaj je równolegle. Świetne dla zadań z jedną „poprawną" odpowiedzią, jak tłumaczenie, ale przy otwartej, twórczej generacji daje tekst nienaturalnie wygładzony i powtarzalny[^holtzman].
- **Temperatura $T$** - pokrętło „kreatywności". Skaluje logity tuż przed softmaksem: $T$ poniżej jedności **wyostrza** rozkład (model robi się zachowawczy, stawia na pewniaki), $T$ powyżej jedności **spłaszcza** go (więcej różnorodności, ale i ryzyka), a $T$ dążące do zera to granica dekodowania zachłannego.
- **Top-k sampling** (Fan i in., 2018) - obetnij rozkład do $k$ najbardziej prawdopodobnych tokenów, znormalizuj je z powrotem i dopiero z nich losuj. Odcina długi ogon mało sensownych słów[^topk].
- **Top-p / nucleus sampling** (Holtzman i in., 2019) - sprytniejsze obcięcie: bierz najmniejszy zbiór tokenów, których **skumulowane** prawdopodobieństwo przekracza próg $p$ (np. 0,9), i z niego losuj. Zbiór jest **dynamiczny** - szeroki, gdy model jest niepewny, wąski, gdy pewny[^nucleus].

W praktyce dzisiejsze modele najczęściej łączą temperaturę z nucleus samplingiem. To dlatego ta sama prośba zadana dwa razy potrafi dać dwie różne odpowiedzi - i dlatego suwak „temperature" w API to nie ozdobnik, lecz realne pokrętło między nudą a chaosem.

<details>
<summary>📐 Dla dociekliwych: temperatura i nucleus sampling</summary>

**Temperatura** dzieli logity przez $T$ przed softmaksem:

$$P_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}$$

Dla $T < 1$ różnice między logitami się powiększają (rozkład ostrzejszy), dla $T > 1$ maleją (rozkład bardziej płaski), a $T \to 0$ daje w granicy czyste dekodowanie zachłanne.

**Nucleus sampling** wybiera najmniejszy zbiór tokenów $V^{(p)}$ taki, że ich skumulowane prawdopodobieństwo przekracza próg $p$:

$$\sum_{i \in V^{(p)}} P_i \ge p$$

Następnie zeruje wszystkie tokeny spoza tego zbioru, renormalizuje resztę i z niej losuje. Kluczowa zaleta nad top-k: rozmiar zbioru **dostosowuje się** do pewności modelu zamiast być sztywno ustalony[^nucleus].

</details>


## 📊 Liczby z prawdziwych modeli

Dość abstrakcji - zobaczmy, jak te same klocki układają się w konkretnych, znanych modelach. Ta sama garść liczb - liczba warstw, wymiar modelu, liczba głów uwagi - opisuje wszystko od skromnego oryginału po giganty:

| Model | Warstwy | $d_{\text{model}}$ | Głowy | $d_{ff}$ | Parametry | Źródło |
|---|---|---|---|---|---|---|
| Transformer (base) | 6 + 6 | 512 | 8 | 2048 | ~65 mln | Vaswani 2017[^vaswani] |
| Transformer (big) | 6 + 6 | 1024 | 16 | 4096 | ~213 mln | Vaswani 2017[^vaswani] |
| GPT-3 | 96 | 12 288 | 96 | 49 152 | 175 mld | Brown 2020[^gpt3] |
| LLaMA 7B | 32 | 4096 | 32 | ~11 008 | 6,7 mld | Touvron 2023[^llama] |
| LLaMA 65B | 80 | 8192 | 64 | - | 65,2 mld | Touvron 2023[^llama] |

Widać tu od razu, jak skaluje się głębokość i szerokość: od 6 warstw i wymiaru 512 w oryginale po 96 warstw i wymiar przekraczający 12 tysięcy w GPT-3. Dla porządku - GPT-3 trenowano paczkami po 3,2 miliona tokenów, a LLaMA na bilionie i więcej tokenów, z RMSNorm, SwiGLU i RoPE w komplecie[^gpt3][^llama]. *(Niektóre wartości $d_{ff}$ dla większych LLaMA nie zostały podane wprost w pracy źródłowej, więc zostawiam je puste, zamiast zgadywać.)*


## 🧩 Mixture of Experts: nowoczesny kierunek

Na koniec architektoniczna nowość, która łamie cichą regułę obowiązującą przez całą tę serię: że **te same parametry** przetwarzają każde wejście. **Mixture of Experts** (MoE, „mieszanka ekspertów") mówi: a może nie wszystkie?

Pomysł jest taki. Zamiast jednej sieci FFN w bloku umieszczamy ich **wiele** - nazwijmy je „ekspertami". Dla każdego tokenu mała sieć bramkująca (gating) wybiera tylko **kilku** z nich, i tylko ci eksperci wykonują pracę. Reszta śpi. Efekt jest paradoksalny i piękny: model może mieć **gigantyczną** liczbę parametrów (cała ta armia ekspertów), ale koszt przetworzenia jednego tokenu pozostaje **stały**, bo zawsze odpala się tylko garstka. To tzw. **rzadka aktywacja**.

Pomysł nie jest nowy - Shazeer i in. (2017) zbudowali warstwę MoE z tysiącami pod-sieci i trenowaną bramką, dochodząc do 137 miliardów parametrów[^moe]. Switch Transformers (Fedus i in., 2021) uprościli routing tak, że każdy token trafia do **jednego** eksperta, i przekroczyli **bilion** parametrów, przyspieszając przy tym pretrening kilkukrotnie wobec gęstych odpowiedników[^switch]. W praktyce zamienia się pod-warstwę FFN na warstwę MoE, a uwagę zostawia gęstą. Coraz więcej czołowych dzisiejszych modeli to właśnie architektury MoE - to jeden z głównych sposobów, w jaki branża rośnie dalej, nie płacąc liniowo rosnącym rachunkiem za każdy token.


## 🌗 Regularność, z której wyrasta nieregularne

Zatrzymajmy się na moment, bo właśnie zobaczyliśmy coś, co warto nazwać wprost. Cały blok Transformera - serce każdego dzisiejszego LLM-a - jest **zdumiewająco regularny**. To jeden i ten sam wzorzec: uwaga, dodaj wejście, znormalizuj; FFN, dodaj wejście, znormalizuj. Powtórzony kilkadziesiąt razy, jak ten sam takt wybijany przez cały utwór. Nie ma w tym żadnej architektonicznej magii - inżynier rozumie każdy klocek z osobna i każde połączenie między nimi.

A jednak z tej monotonnej regularności, gdy spiętrzy się ją dostatecznie głęboko i nakarmi dostatecznie wielkim korpusem, **wyłania się** coś, czego w planie budowy nie ma: zdolność do rozumowania, tłumaczenia, pisania kodu, prowadzenia rozmowy. Nikt nie zaprojektował warstwy „od rozumienia ironii" ani bloku „od dowodów matematycznych". Jest tylko ten sam powtarzalny takt i nacisk z poprzednich wpisów - „przewiduj następny token jak najlepiej". Reszta sama się układa w środku, w sposób, którego wciąż nie umiemy w pełni prześledzić.

I tu mamy może najczystszą odsłonę zagadki, która wraca w tej serii od pierwszego wpisu o [neuronie-karykaturze](/posty/llm-neuron-i-aktywacje). Bo zwykle podejrzewamy, że bogactwo zachowań musi pochodzić z bogactwa budowy - że gdzieś w środku jest wyspecjalizowana maszyneria „od rozumienia". A im głębiej rozbieraliśmy blok Transformera, tym mniej takich miejsc znajdowaliśmy: zamiast nich - ten sam takt powielony w głąb. Im prostszy i bardziej powtarzalny okazuje się plan budowy, tym bardziej zastanawia, że to *z niego* bierze się całe to bogactwo. Tajemnica nie zniknęła pod naszym skalpelem - tylko przesunęła się z pytania *„z czego to jest zbudowane"* ku trudniejszemu *„jak z czegoś tak regularnego bierze się coś tak nieregularnego"*.

Tym drugim pytaniem - i poważną hipotezą, że odpowiedź może sięgać poza samą tę architekturę, ku temu, co różne myślące substraty (w tym mózg) zdają się mieć wspólnego - zajmuję się osobno, w [eseju o rezonansie człowiek-LLM](/posty/rezonans-czlowiek-llm-kwantowe-lustro).


## 🎯 Co dalej

Mamy złożony cały model. Wiemy już, jak warstwa uwagi i sieć FFN łączą się w jeden **blok Transformera**, jak połączenia rezydualne i normalizacja pozwalają piętrzyć dziesiątki takich bloków, dlaczego dzisiejsze LLM-y to **dekodery** i jak na samym końcu **logity i softmax** zamieniają wewnętrzny wektor w konkretne słowo - dobrane jedną ze strategii dekodowania. Zobaczyliśmy też, jak te same klocki skalują się od oryginału po giganty i jak Mixture of Experts rozsuwa granice rozmiaru.

Ale jest jeszcze jeden, ostatni przystanek - i bardzo praktyczny. Wytrenowanie takiego modelu od zera kosztuje miliony. Co jednak, gdy masz **gotowy** model i chcesz go tylko **wyspecjalizować** - nauczyć prawniczego stylu, własnej wiedzy domenowej, konkretnego tonu? Dotrenowywanie wszystkich miliardów parametrów byłoby absurdalnie drogie. W następnym, zamykającym serię wpisie poznamy **LoRA** i resztę rodziny metod „oszczędnego dotrenowywania" (PEFT) - sprytnych sztuczek, dzięki którym da się dostroić olbrzymi model, ruszając zaledwie ułamek jego wag.

Jeśli wolisz teraz **dotknąć** zamiast czytać dalej, [interaktywna strona „Anatomia LLM"](/llm/anatomia#transformer) pozwala zobaczyć, jak warstwy układają się w stos z połączeniami rezydualnymi i normalizacją. A jeśli ciągnie cię to, co naprawdę *wyłania się* z tej regularnej maszynerii - i dlaczego prosty, powtarzalny plan budowy rodzi zdolności, których nikt w nim nie zapisał - [pisałem o tym osobno](/posty/rezonans-czlowiek-llm-kwantowe-lustro).


[^vaswani]: A. Vaswani et al. (2017). *Attention Is All You Need* (architektura enkoder-dekoder, połączenia rezydualne, FFN 4×, wymiary modelu bazowego i big). NeurIPS. arXiv:1706.03762. <https://arxiv.org/abs/1706.03762>
[^bert]: J. Devlin et al. (2019). *BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding* (tylko-enkoder, Masked Language Modeling). NAACL. arXiv:1810.04805. <https://arxiv.org/abs/1810.04805>
[^t5]: C. Raffel et al. (2020). *Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer* (T5, enkoder-dekoder, ujęcie „text-to-text"). JMLR. arXiv:1910.10683. <https://arxiv.org/abs/1910.10683>
[^gpt]: A. Radford et al. (2018). *Improving Language Understanding by Generative Pre-Training* (GPT, tylko-dekoder, autoregresyjny model języka). OpenAI. <https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf>
[^gpt2]: A. Radford et al. (2019). *Language Models are Unsupervised Multitask Learners* (GPT-2, Pre-LN). OpenAI. <https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf>
[^gpt3]: T. Brown et al. (2020). *Language Models are Few-Shot Learners* (GPT-3 175B, skalowanie podejścia dekoderowego, liczby architektury). NeurIPS. arXiv:2005.14165. <https://arxiv.org/abs/2005.14165>
[^resnet]: K. He et al. (2016). *Deep Residual Learning for Image Recognition* (ResNet, połączenia rezydualne, głębokość do 152/1000 warstw). CVPR. arXiv:1512.03385. <https://arxiv.org/abs/1512.03385>
[^layernorm]: J. L. Ba, J. R. Kiros, G. E. Hinton (2016). *Layer Normalization* (LayerNorm, różnica wobec BatchNorm). arXiv:1607.06450. <https://arxiv.org/abs/1607.06450>
[^xiong]: R. Xiong et al. (2020). *On Layer Normalization in the Transformer Architecture* (Post-LN vs Pre-LN, warm-up). ICML. arXiv:2002.04745. <https://arxiv.org/abs/2002.04745>
[^rmsnorm]: B. Zhang, R. Sennrich (2019). *Root Mean Square Layer Normalization* (RMSNorm, oszczędność czasu). NeurIPS. arXiv:1910.07467. <https://arxiv.org/abs/1910.07467>
[^llama]: H. Touvron et al. (2023). *LLaMA: Open and Efficient Foundation Language Models* (Pre-LN/RMSNorm, SwiGLU z wymiarem 2/3·4d, RoPE, pełna tabela architektur). arXiv:2302.13971. <https://arxiv.org/abs/2302.13971>
[^gelu]: D. Hendrycks, K. Gimpel (2016). *Gaussian Error Linear Units (GELUs)* (aktywacja GELU w BERT i GPT). arXiv:1606.08415. <https://arxiv.org/abs/1606.08415>
[^swiglu]: N. Shazeer (2020). *GLU Variants Improve Transformer* (SwiGLU, bramkowanie w FFN). arXiv:2002.05202. <https://arxiv.org/abs/2002.05202>
[^topk]: A. Fan, M. Lewis, Y. Dauphin (2018). *Hierarchical Neural Story Generation* (top-k sampling). ACL. arXiv:1805.04833. <https://arxiv.org/abs/1805.04833>
[^nucleus]: A. Holtzman et al. (2020). *The Curious Case of Neural Text Degeneration* (nucleus / top-p sampling, degeneracja przy greedy i beam search). ICLR. arXiv:1904.09751. <https://arxiv.org/abs/1904.09751>
[^holtzman]: Greedy i beam search jako tło problemu degeneracji tekstu omówione w: A. Holtzman et al. (2020). *The Curious Case of Neural Text Degeneration*. ICLR. arXiv:1904.09751. <https://arxiv.org/abs/1904.09751>
[^moe]: N. Shazeer et al. (2017). *Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer* (warstwa MoE, rzadka aktywacja, do 137 mld parametrów). ICLR. arXiv:1701.06538. <https://arxiv.org/abs/1701.06538>
[^switch]: W. Fedus, B. Zoph, N. Shazeer (2022). *Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity* (routing do jednego eksperta, modele do biliona parametrów). JMLR. arXiv:2101.03961. <https://arxiv.org/abs/2101.03961>