Anatomia LLM: blok Transformera
🚀 Intro
W poprzednim przystanku tej serii - jednej z gałęzi przeglądowego wpisu „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 - 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ą1. 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łowie2.
- Enkoder-dekoder - np. T5 (Raffel i in., 2019), który każde zadanie NLP ujmuje jako „tekst na wejściu → tekst na wyjściu”3. 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”45.
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ą danych6.
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 warstw7.
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 (czytaj „de model”) - to dlatego ta jedna liczba przewija się przez całą architekturę1.
📐 Dla dociekliwych: matematyka połączenia rezydualnego
W ResNecie zamiast uczyć warstwę bezpośrednio przekształcenia docelowego , uczymy ją reszty (stąd „rezydualne”) , a wyjście składamy z powrotem:
Gdy liczymy gradient wstecz, pochodna tej sumy zawiera składnik tożsamościowy (od „”), który przepuszcza sygnał uczący dalej niezależnie od tego, co robi . To właśnie ta jedynka w pochodnej jest „autostradą”.
W oryginalnym Transformerze (wariant Post-LN) pełne wyjście pod-warstwy to:
gdzie to albo uwaga, albo sieć FFN1. Aby dodawanie było w ogóle wykonalne, i muszą mieć identyczny wymiar .
📏 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 wektor8. 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 stabilniejszy9. 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 procent10. LLaMA i wiele współczesnych modeli używa właśnie RMSNorm w trybie pre-normalizacji.
📐 Dla dociekliwych: LayerNorm i RMSNorm we wzorach
LayerNorm. Dla wektora cech jednego tokenu liczymy najpierw średnią i wariancję po jego współrzędnych:
a potem standaryzujemy i przeskalowujemy uczonymi parametrami:
Tu (mi) to średnia, (sigma kwadrat) - wariancja, czyli miara rozrzutu, a (sigma) bez kwadratu to odchylenie standardowe. Maleńkie (epsilon) chroni przed dzieleniem przez zero. Wektory (gamma) i (beta) to uczone parametry skali i przesunięcia - pozwalają sieci cofnąć normalizację, jeśli akurat jej nie potrzebuje. Symbol oznacza mnożenie po współrzędnych8.
RMSNorm wyrzuca odejmowanie średniej i dzieli po prostu przez pierwiastek ze średniej kwadratów (stąd nazwa - root mean square):
Mniej operacji, brak liczenia średniej - stąd oszczędność czasu przy porównywalnej jakości10.
🧮 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ściowego1. 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 GELU11, a wiele dzisiejszych modeli - na SwiGLU (Shazeer, 2020), wariant z bramkowaniem, w którym jedna projekcja „reguluje przepływ” drugiej12. 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×13.
📐 Dla dociekliwych: FFN i SwiGLU we wzorach
Klasyczna sieć FFN to dwie warstwy liniowe z nieliniowością (czyli ReLU) pomiędzy nimi:
Pierwsza macierz rozszerza wymiar do (czytaj „de ef ef”), zwykle ; druga macierz ściska z powrotem1.
Skąd „2/3 parametrów”? Dwie macierze FFN o wymiarach to razem około wag, podczas gdy cztery projekcje uwagi (zapytania, klucze, wartości, wyjście) to około . Stąd proporcja mniej więcej , czyli na korzyść FFN.
SwiGLU zastępuje pojedynczą nieliniowość bramką - iloczynem dwóch osobnych projekcji, z których jedna przechodzi przez funkcję Swish:
Symbol 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 1213.
🎰 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 . 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). 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.)
📐 Dla dociekliwych: logity i softmax na wyjściu
Niech będzie wektorem tokenu po ostatnim bloku. Głowa językowa rzutuje go macierzą odembeddowania na wektor logitów o długości równej rozmiarowi słownika :
Softmax zamienia logity w rozkład prawdopodobieństwa nad słownikiem:
Mianownik (suma po wszystkich tokenach słownika, oznaczona symbolem - sigma) gwarantuje, że prawdopodobieństwa zsumują się do jedynki. Przy weight tying macierz jest po prostu transpozycją macierzy embeddingów wejściowych.
🎲 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órzeniach14.
- Beam search - utrzymuj naraz 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 powtarzalny14.
- Temperatura - pokrętło „kreatywności”. Skaluje logity tuż przed softmaksem: poniżej jedności wyostrza rozkład (model robi się zachowawczy, stawia na pewniaki), powyżej jedności spłaszcza go (więcej różnorodności, ale i ryzyka), a dążące do zera to granica dekodowania zachłannego.
- Top-k sampling (Fan i in., 2018) - obetnij rozkład do najbardziej prawdopodobnych tokenów, znormalizuj je z powrotem i dopiero z nich losuj. Odcina długi ogon mało sensownych słów15.
- 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 (np. 0,9), i z niego losuj. Zbiór jest dynamiczny - szeroki, gdy model jest niepewny, wąski, gdy pewny16.
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.
📐 Dla dociekliwych: temperatura i nucleus sampling
Temperatura dzieli logity przez przed softmaksem:
Dla różnice między logitami się powiększają (rozkład ostrzejszy), dla maleją (rozkład bardziej płaski), a daje w granicy czyste dekodowanie zachłanne.
Nucleus sampling wybiera najmniejszy zbiór tokenów taki, że ich skumulowane prawdopodobieństwo przekracza próg :
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 ustalony16.
📊 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 | Głowy | Parametry | Źródło | ||
|---|---|---|---|---|---|---|
| Transformer (base) | 6 + 6 | 512 | 8 | 2048 | ~65 mln | Vaswani 20171 |
| Transformer (big) | 6 + 6 | 1024 | 16 | 4096 | ~213 mln | Vaswani 20171 |
| GPT-3 | 96 | 12 288 | 96 | 49 152 | 175 mld | Brown 20206 |
| LLaMA 7B | 32 | 4096 | 32 | ~11 008 | 6,7 mld | Touvron 202313 |
| LLaMA 65B | 80 | 8192 | 64 | - | 65,2 mld | Touvron 202313 |
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 komplecie613. (Niektóre wartości 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ów17. 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ów18. 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. 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.
🎯 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” 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.
Footnotes
-
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 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
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 ↩
-
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 ↩
-
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 ↩
-
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 ↩
-
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 ↩ ↩2 ↩3
-
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 ↩
-
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 ↩ ↩2
-
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 ↩
-
B. Zhang, R. Sennrich (2019). Root Mean Square Layer Normalization (RMSNorm, oszczędność czasu). NeurIPS. arXiv:1910.07467. https://arxiv.org/abs/1910.07467 ↩ ↩2
-
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 ↩
-
N. Shazeer (2020). GLU Variants Improve Transformer (SwiGLU, bramkowanie w FFN). arXiv:2002.05202. https://arxiv.org/abs/2002.05202 ↩ ↩2
-
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 ↩ ↩2 ↩3 ↩4 ↩5
-
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 ↩ ↩2
-
A. Fan, M. Lewis, Y. Dauphin (2018). Hierarchical Neural Story Generation (top-k sampling). ACL. arXiv:1805.04833. https://arxiv.org/abs/1805.04833 ↩
-
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 ↩ ↩2
-
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 ↩
-
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 ↩