Anatomia LLM: od pojedynczego neuronu do mechanizmu uwagi
🚀 Intro
Piszesz do ChatGPT jedno zdanie, a po sekundzie wraca akapit, który brzmi jak napisany przez człowieka. Prosisz o wiersz - dostajesz wiersz. O kod - dostajesz kod. O rozwiązanie problemu, nad którym sam siedziałeś godzinę - i model rozkłada go na czynniki, jakby naprawdę rozumiał, o co pytasz.
Pod spodem nie ma jednak nikogo, kto by siedział i myślał. Jest matematyka: tekst zamieniony na liczby, a te liczby przepuszczone przez gigantyczną serię mnożeń macierzy. Cała “wiedza” modelu to miliardy wag - liczb wyszlifowanych podczas treningu. I właśnie te cegiełki rozłożymy w tym wpisie na części: neuron, wagi, tokeny, mechanizm uwagi.
Tyle że na tym historia się nie kończy - i tu zaczyna się rzecz najciekawsza. Bo z tych prostych mnożeń wyłania się coś, czego nikt wprost nie zaprogramował. Inżynierowie chcieli tylko, żeby model trafniej zgadywał następne słowo. A dostali system, który potrafi rozumować, prowadzić myśl, operować czymś w rodzaju wewnętrznej wyobraźni - i który, im jest lepszy, tym bardziej jego wewnętrzne reprezentacje zaczynają strukturalnie przypominać ludzki mózg, choć nikt go tak nie budował. Prawda jest taka, że nie do końca wiemy, dlaczego mnożenie macierzy zyskuje to „coś”. I jest realna szansa, że struktura, która się tu wyłania, jest głębsza, niż dziś przypuszczamy.
Dlatego nie potraktuję tego jako odczarowywania magii. Raczej odwrotnie: żeby docenić, jak zdumiewające jest to, co robią modele językowe, trzeba najpierw zobaczyć, z czego są zbudowane. Poznanie mechanizmu nie odbiera tajemnicy - pokazuje dokładnie, w którym miejscu ona mieszka.
Ten wpis jest mapą tej budowy: od jednego sztucznego neuronu aż po mechanizm uwagi i tanie dotrenowywanie metodą LoRA. Przejdziemy ją w siedmiu przystankach, bez wymagania matematyki ponad poziom szkoły średniej. Przy każdym przystanku znajdziesz odnośnik do interaktywnej strony, gdzie ten sam fragment możesz dotknąć: poprzesuwać suwaki, zobaczyć wykres, najechać na neuron.
💡 Jak czytać ten tekst. Główny wątek jest opisowy - wystarczy go czytać. Wzory chowam w rozwijanych blokach „dla dociekliwych”: jeśli lubisz matematykę, rozwiń; jeśli nie, pomiń bez straty dla zrozumienia.
📋 TL;DR
- Sieć neuronowa to miliony kopii jednego prostego elementu - sztucznego neuronu, który mnoży liczby przez wagi, sumuje i przepuszcza przez funkcję aktywacji.
- Funkcja aktywacji to źródło „nieliniowości” - bez niej cała sieć, choćby tysiącwarstwowa, byłaby równoważna jednemu mnożeniu i nie nauczyłaby się niczego skomplikowanego.
- „Parametry” modelu (te słynne 7B, 70B) to po prostu wszystkie wagi. Trening polega na żmudnym poprawianiu tych liczb miliardy razy, aż przewidywania modelu robią się trafne.
- Tekst zamienia się w liczby przez tokeny (kawałki słów) i embeddingi (wektory znaczeń), w których geometria niesie sens: słowa o podobnym znaczeniu leżą blisko siebie.
- Mechanizm uwagi (attention) to serce Transformera - pozwala każdemu słowu „rozejrzeć się” po całym zdaniu i zdecydować, które inne słowa są dla niego ważne. To on umożliwił dzisiejsze LLM-y.
- LLM to wysoki stos identycznych bloków Transformera, a na samym końcu - losowanie kolejnego tokenu z rozkładu prawdopodobieństwa.
- LoRA to sprytny sposób na tanie dotrenowywanie: zamrażamy wielki model i uczymy tylko maleńki „dodatek”, oszczędzając setki razy na zasobach.
- Wszystko poniżej możesz dotknąć i poprzesuwać na stronie interaktywnej.
🧱 Cegiełka wszystkiego: pojedynczy neuron
Zacznijmy od najmniejszej części. Cała sieć neuronowa, niezależnie od tego, jak gigantyczna, składa się z milionów kopii jednego, naprawdę prostego elementu. Sztuczny neuron robi tylko jedno: bierze kilka liczb na wejściu, każdą mnoży przez przypisaną jej wagę, dodaje wszystko do siebie, dorzuca jeszcze jedną liczbę zwaną biasem (przesunięcie), a wynik przepuszcza przez tak zwaną funkcję aktywacji.
Waga to serce całej historii. Mówi neuronowi, jak ważne jest dane wejście: duża dodatnia waga wzmacnia sygnał, ujemna go hamuje, bliska zeru - praktycznie ignoruje. Kiedy mówimy, że model „się czegoś nauczył”, mamy na myśli dokładnie to, że te wagi ustawiły się w odpowiednie wartości.
Pomysł nie jest nowy. Pierwszy formalny model neuronu zaproponowali w 1943 roku neurofizjolog Warren McCulloch i logik Walter Pitts - była to prosta jednostka progowa, która „odpalała”, gdy suma wejść przekroczyła próg. Współczesny neuron to złagodzona, „płynna” wersja tamtego pomysłu.
📐 Dla dociekliwych: równanie neuronu
Najpierw liczymy sumę ważoną , a potem przepuszczamy ją przez funkcję :
Zapis to iloczyn skalarny - skrócony sposób zapisania sumy . To wszystko: jedno mnożenie, jedno dodawanie, jedna funkcja.
👉 Pobaw się: na stronie interaktywnej masz laboratorium neuronu - przesuwaj suwaki wag i wejść, przełączaj funkcję aktywacji i patrz, jak zmienia się wynik na żywo.
〰️ Nieliniowość: dlaczego funkcja aktywacji jest konieczna
Tu pojawia się subtelność, która decyduje o wszystkim. Gdyby neuron tylko sumował i mnożył, to złożenie choćby tysiąca warstw dałoby się zwinąć z powrotem do jednego mnożenia. Cała sieć byłaby wtedy równoważna prostej linii - umiałaby modelować tylko zależności liniowe, a więc prawie nic z tego, co nas interesuje (język, obrazy, logika nie są liniowe).
Ratunkiem jest funkcja aktywacji: drobne „wygięcie” wstawione na wyjściu każdego neuronu. To ono wprowadza nieliniowość, dzięki której sieć potrafi modelować dowolnie pofalowane, skomplikowane zależności. Matematycy udowodnili nawet, że sieć z taką nieliniowością potrafi w zasadzie przybliżyć dowolną ciągłą funkcję - to tak zwane twierdzenie o uniwersalnej aproksymacji.
Funkcji aktywacji jest kilka rodzin. Klasyczna i tania to ReLU (po prostu „zeruj liczby ujemne”). Starsze to sigmoid i tanh, które ściskają wynik do wąskiego przedziału. Nowoczesne LLM-y używają „gładkich” wariantów w stylu GELU czy SwiGLU - są ciągłe i mają dobrze zdefiniowaną pochodną wszędzie, co bardzo ułatwia uczenie.
👉 Pobaw się: interaktywny wykres funkcji aktywacji pozwala przełączać ReLU, Sigmoid, tanh i GELU i zobaczyć, czym naprawdę różnią się ich kształty.
🕸️ Od neuronu do sieci - i skąd biorą się „miliardy parametrów”
Pojedynczy neuron jest słaby. Siła pojawia się, gdy ułożymy ich setki obok siebie w warstwę, a warstwy ustawimy jedna za drugą. Wyjścia jednej warstwy stają się wejściami następnej, a sygnał płynie od wejścia do wyjścia - to tak zwana propagacja w przód.
Tu kryje się powód, dla którego LLM-y trenuje się na kartach graficznych. Całą warstwę można policzyć jednym mnożeniem macierzy, a GPU są zaprojektowane właśnie do błyskawicznego mnożenia ogromnych tablic liczb. Cała „wiedza” modelu siedzi w liczbach wewnątrz tych macierzy.
I tu rozwiązuje się zagadka tajemniczych „7B” czy „70B”. Kiedy słyszysz, że model ma 7 miliardów parametrów, chodzi dokładnie o liczbę wszystkich wag i biasów w sieci. Jedna warstwa łącząca tysiąc wejść z tysiącem wyjść ma już ponad milion wag - a takich warstw są w modelu setki. Stąd miliardy.
Tych liczb nikt nie ustawia ręcznie. Model startuje od wartości losowych i poprawia je w pętli, powtarzanej miliardy razy: (1) zgaduje następne słowo, (2) sprawdza, jak bardzo się pomylił (to „błąd”, ang. loss), (3) liczy, w którą stronę przesunąć każdą wagę, by błąd zmalał (gradient, liczony metodą propagacji wstecznej), (4) robi malutki krok w tę stronę. Powtórz odpowiednio wiele razy, a z losowego szumu wyłania się model, który „rozumie” język.
📐 Dla dociekliwych: warstwa i krok uczenia
Całą warstwę zapisujemy jednym wzorem, gdzie to macierz wag, a - wektor biasów:
Pojedynczą wagę poprawiamy zaś regułą spadku gradientu:
gdzie to błąd, a (eta) to tempo uczenia - jak duży krok robimy za każdym razem.
Ile tekstu i jak duży model? Okazuje się, że to nie jest dowolne - istnieją empiryczne prawa skalowania, a popularna reguła kciuka (tzw. Chinchilla) mówi, że na każdy parametr modelu warto przeznaczyć mniej więcej 20 tokenów danych treningowych.
👉 Pobaw się: zobacz diagram sieci w pełni połączonej (najedź na neuron, by podświetlić jego połączenia) oraz pętlę uczenia.
🔤 Jak tekst staje się liczbami: tokeny i embeddingi
Sieć nie rozumie liter - rozumie tylko liczby. Zanim więc zdanie trafi do modelu, dzieje się z nim coś sprytnego. Najpierw tekst kroi się na tokeny, czyli kawałki słów (czasem całe słowo, czasem fragment - np. „naj”, „lepsz”, „y”). Potem każdy token zamienia się na embedding - długi wektor liczb, coś w rodzaju „współrzędnych” słowa w wielowymiarowej przestrzeni znaczeń.
Najpiękniejsze jest to, że w tej przestrzeni geometria niesie znaczenie. Słowa o podobnym sensie lądują blisko siebie - „kot” niedaleko „psa”. Co więcej, relacje między słowami same stają się kierunkami w tej przestrzeni. Klasyczny (choć dziś trochę krytykowany jako uproszczenie) przykład: jeśli od wektora słowa „król” odejmiesz „mężczyznę” i dodasz „kobietę”, trafisz mniej więcej w okolice słowa „królowa”.
📐 Dla dociekliwych: arytmetyka znaczeń
To, że taka „arytmetyka na słowach” w ogóle działa, było jednym z odkryć, które rozpaliły zainteresowanie embeddingami.
👉 Pobaw się: zobacz, jak zdanie rozpada się na tokeny i wektory.
👁️ Mechanizm uwagi - serce Transformera
To jest przełom, dzięki któremu w ogóle mówimy dziś o LLM-ach. Uwaga (ang. attention) pozwala każdemu słowu „rozejrzeć się” po całym zdaniu i samodzielnie zdecydować, które inne słowa są dla niego najważniejsze.
Weźmy zdanie: „Kot nie zjadł ryby, bo była zepsuta”. Do czego odnosi się „była”? Człowiek wie od razu, że do ryby, nie do kota. Mechanizm uwagi pozwala modelowi zrobić dokładnie to samo - połączyć „była” z „rybą”, mimo że dzieli je kilka słów.
Działa to przez trzy role, które model tworzy dla każdego tokenu:
- Query (zapytanie) - „czego szukam?”
- Key (klucz) - „co oferuję?”, czyli etykieta każdego tokenu.
- Value (wartość) - „jaką treść przekażę, jeśli zostanę wybrany”.
Model porównuje zapytanie jednego słowa z kluczami wszystkich pozostałych, z tego porównania wylicza wagi uwagi (ile procent uwagi poświęcić każdemu słowu), a na końcu miesza wartości proporcjonalnie do tych wag. Co istotne, model robi to na kilkudziesięciu „głowach” naraz (multi-head): jedna głowa może śledzić gramatykę, druga odniesienia, trzecia styl - a ich wyniki się łączą.
📐 Dla dociekliwych: scaled dot-product attention
Iloczyn to dopasowanie zapytań do kluczy. Górne „” przy oznacza transpozycję - obrót macierzy (zamianę wierszy z kolumnami), techniczny zabieg konieczny, żeby dało się przemnożyć każde zapytanie przez każdy klucz. Dolne „” w to z kolei zwykła etykieta: to wymiar kluczy, czyli z ilu liczb składa się pojedynczy wektor Key (tyle samo, co wektor Query). Dzielenie przez (pierwiastek z tego wymiaru) stabilizuje wartości, żeby funkcja softmax nie „nasycała się” przy dużych liczbach. Softmax zamienia surowe punkty na procenty uwagi sumujące się do 1.
👉 Pobaw się: wizualizacja uwagi - wybierz słowo-pytanie i zobacz, na które inne słowa kieruje swoją uwagę.
🧊 Blok Transformera: wszystko razem
Pojedynczy mechanizm uwagi to jeszcze nie model. LLM to wysoki stos identycznych bloków Transformera - bywa ich 32, 80, a w największych modelach ponad sto. Każdy taki blok łączy dwie rzeczy: warstwę uwagi (którą poznaliśmy wyżej) oraz zwykłą sieć w przód (FFN), która dodatkowo przetwarza wynik.
Żeby dało się trenować tak głębokie wieże, dorzuca się dwa techniczne triki: połączenia rezydualne (wejście jest dodawane do wyjścia, dając gradientowi „autostradę” w głąb sieci) oraz normalizację (utrzymującą liczby w zdrowym zakresie). Brzmią niepozornie, ale bez nich bardzo głębokie sieci po prostu odmawiają nauki.
Na samym szczycie stosu ostatnia warstwa zamienia wektory z powrotem na prawdopodobieństwa kolejnego tokenu. I tu jest puenta, która zaskakuje wielu ludzi: to, co odbieramy jako gotową, przemyślaną wypowiedź, na poziomie mechanizmu jest rozkładem prawdopodobieństwa nad wszystkimi możliwymi następnymi tokenami, z którego model losuje jeden. Potem dokleja go do tekstu i powtarza wszystko od nowa, token po tokenie. Cała płynna odpowiedź to po prostu wielokrotnie powtórzone „zgadnij następne słowo”.
👉 Pobaw się: schemat pojedynczego bloku Transformera pokazuje, jak uwaga, FFN i połączenia rezydualne układają się w jedną całość.
🪶 LoRA: tanie dotrenowywanie wielkich modeli
Ostatni przystanek to odpowiedź na bardzo praktyczny problem. Załóżmy, że masz gotowy model 70B i chcesz go wyspecjalizować - na przykład nauczyć stylu prawniczego albo obsługi klienta. Pełne dotrenowanie (ang. fine-tuning) oznaczałoby aktualizację wszystkich 70 miliardów parametrów. To wymaga ogromnych kart graficznych i sporych pieniędzy.
LoRA (Low-Rank Adaptation) to elegancki skrót. Zamiast ruszać oryginalne wagi, zamrażamy je w całości i dokładamy z boku maleńki „dodatek” - parę cienkich macierzy, które uczą się potrzebnej zmiany. Kluczowa obserwacja jest taka, że zmiana potrzebna do specjalizacji modelu jest „niskiego rzędu”, to znaczy da się ją skompresować do dwóch chudych macierzy zamiast jednej wielkiej.
Efekt? Dla typowych ustawień LoRA uczy nawet kilkaset razy mniej parametrów niż pełny fine-tuning. Wynikowy „adapter” waży megabajty zamiast gigabajtów, więc można trzymać wiele adapterów (jeden „styl prawniczy”, drugi „obsługa klienta”) i podpinać je do tego samego modelu bazowego na żądanie - trochę jak wymienne obiektywy do jednego aparatu.
📐 Dla dociekliwych: na czym polega „niski rząd"
Zamiast uczyć pełną macierz poprawki o wymiarach , uczymy dwie cienkie macierze i :
Liczba to rank (np. 8 lub 16) - wąskie gardło decydujące o liczbie nowych parametrów; to skala wpływu dodatku, a pozostaje nietknięte. Dla i to różnica między ~16,8 mln a ~65 tys. parametrów, czyli około 256× mniej.
👉 Pobaw się: schemat LoRA pokazuje, jak do zamrożonej macierzy dokłada się dwie cienkie macierze tworzące tani „boczny tor”.
🎯 Co dalej
To była cała droga: od jednej liczby pomnożonej przez wagę, przez nieliniowość, warstwy i trening, tokeny i embeddingi, aż po mechanizm uwagi, blok Transformera i LoRA. Złożyliśmy model z części - i właśnie dlatego możemy teraz uczciwie powiedzieć, gdzie kończy się to, co rozumiemy. Wiemy, jak zbudowany jest mechanizm. Wciąż nie wiemy, dlaczego z tych mnożeń wyłania się zdolność do rozumowania, prowadzenia myśli i operowania wewnętrzną wyobraźnią. Anatomia nie rozwiązała tajemnicy - tylko pokazała, w którym dokładnie miejscu ona siedzi.
Jeśli chcesz teraz dotknąć tych pojęć zamiast tylko o nich czytać, interaktywna strona „Anatomia LLM” prowadzi przez te same osiem sekcji z suwakami, wykresami i diagramami, na których możesz eksperymentować na żywo.
Stąd prowadzą dwie drogi. W głąb mechanizmu - każdy z tych przystanków ma swoją pełniejszą, ucytowaną historię (genezę, dokładne wzory, liczby z prawdziwych modeli), które pojawiają się jako kolejne wpisy w tej serii; cała szóstka jest już gotowa: neuron i funkcje aktywacji (od progu McCullocha-Pittsa po SwiGLU), sieci, parametry i trening (od mnożenia macierzy po prawa skalowania Chinchilli), tokeny i embeddingi (od tokenizacji subword po geometrię znaczeń i kodowanie pozycji), mechanizm uwagi (od wąskiego gardła w sieciach tłumaczących po FlashAttention i induction heads), blok Transformera (od trzech rodzin architektur, przez połączenia rezydualne i normalizację, po Mixture of Experts) oraz LoRA i dotrenowywanie (od hipotezy niskiego rzędu, przez QLoRA, po instruction tuning i RLHF). I w stronę tajemnicy - jeśli ciekawi cię, co właściwie wyłania się z tej maszynerii i dlaczego rozmowa z modelem potrafi przypominać rezonans z drugim umysłem, pisałem o tym osobno.
📚 Źródła i dalsza lektura
Hub celowo zostaje na poziomie intuicji. Poniżej najważniejsze prace źródłowe dla osób, które chcą sięgnąć do oryginałów; pełniejsze, ucytowane bibliografie znajdą się w pogłębiających wpisach serii.
Klasyczne prace - fundamenty
- W. S. McCulloch, W. Pitts, “A Logical Calculus of the Ideas Immanent in Nervous Activity”, Bulletin of Mathematical Biophysics, vol. 5, 1943, str. 115-133 - pierwszy formalny model sztucznego neuronu.
- G. Cybenko, “Approximation by Superpositions of a Sigmoidal Function”, Mathematics of Control, Signals and Systems, vol. 2, 1989, str. 303-314 - klasyczny wynik o uniwersalnej aproksymacji (uogólniony przez Hornika, 1991).
Architektura i trening współczesnych LLM
- A. Vaswani et al., “Attention Is All You Need”, NeurIPS 2017. arXiv: https://arxiv.org/abs/1706.03762 - praca, która wprowadziła architekturę Transformera i mechanizm uwagi.
- J. Hoffmann et al., “Training Compute-Optimal Large Language Models” (Chinchilla), 2022. arXiv: https://arxiv.org/abs/2203.15556 - źródło reguły „~20 tokenów na parametr”.
- E. J. Hu et al., “LoRA: Low-Rank Adaptation of Large Language Models”, 2021. arXiv: https://arxiv.org/abs/2106.09685 - metoda taniego dotrenowywania opisana w ostatniej sekcji.