Anatomia LLM: neuron i funkcje aktywacji
🚀 Intro
W przeglądowym wpisie tej serii rozłożyliśmy model językowy na siedem przystanków - od neuronu po LoRA - tak, żeby całość dało się przejść bez ani jednego wzoru. To był widok z lotu ptaka. Teraz schodzimy na ziemię i zaczynamy najpoważniejszą część podróży: w głąb mechanizmu, przystanek po przystanku, tym razem z genezą, pełnymi wzorami i konkretnymi liczbami z prawdziwych modeli.
Zaczynamy od samego dołu - od cegiełki, z której zbudowane jest wszystko inne: pojedynczego sztucznego neuronu i tego drobnego „wygięcia” na jego wyjściu, które nazywamy funkcją aktywacji. To pozornie najnudniejszy element całej układanki. A jednak: bez tego wygięcia największy nawet model zwinąłby się do jednego mnożenia i nie nauczyłby się niczego ciekawego, a cicha ewolucja tych funkcji - od sigmoidu po SwiGLU - okazała się jednym z bohaterów skoku jakości nowoczesnych LLM-ów.
Jest tu jeszcze jedna rzecz warta zapamiętania na samym wejściu. Sztuczny neuron, który zaraz rozłożymy, jest drastyczną karykaturą swojego biologicznego pierwowzoru. I mimo to z miliardów takich karykatur wyłania się coś, czego ich wzór w żaden sposób nie zapowiada. To napięcie - prostota części, nieoczywistość całości - będzie nam towarzyszyć przez całą serię.
💡 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
- Sztuczny neuron liczy sumę ważoną wejść, dorzuca bias i przepuszcza wynik przez funkcję aktywacji. Pomysł ma 80 lat (McCulloch i Pitts, 1943) i jest świadomym, mocnym uproszczeniem biologii.
- Funkcja aktywacji to jedyne źródło nieliniowości. Bez niej stos choćby tysiąca warstw jest matematycznie równy jednej warstwie - czyli zwykłej linii.
- Twierdzenie o uniwersalnej aproksymacji mówi, że sieć z jedną warstwą ukrytą potrafi przybliżyć dowolną ciągłą funkcję. Ale to twierdzenie o istnieniu - nie obiecuje, że taka sieć będzie mała ani że gradient ją znajdzie.
- ReLU (zeruj liczby ujemne) wyparła sigmoid, bo nie „nasyca się” i nie zabija gradientu w głębokich sieciach. Jej słabość - „martwe” neurony - załatały warianty.
- Nowoczesne LLM-y używają gładkich, bramkowanych aktywacji: GPT - GELU, LLaMA i PaLM - SwiGLU, Gemma - GeGLU. To nie kosmetyka: w testach dały najlepszą jakość.
- Wszystko poniżej możesz dotknąć na stronie interaktywnej.
🧠 Model neuronu: od progu McCullocha-Pittsa do dziś
Historia sztucznego neuronu zaczyna się od pytania, które dziś brzmi zuchwale: czy myślenie da się opisać logiką?
McCulloch i Pitts (1943). Pierwszy formalny model sztucznego neuronu to binarna jednostka progowa. Sumuje wejścia i „odpala” (wyjście 1), jeśli suma przekracza ustalony próg; w przeciwnym razie milczy (wyjście 0). Neurofizjolog Warren McCulloch i logik Walter Pitts pokazali, że sieci takich jednostek potrafią realizować logikę boolowską, a przy odpowiedniej łączności są obliczeniowo uniwersalne1. Z tej pary - lekarza i logika - wzięła się idea, która napędza dziś całą branżę.
Perceptron Rosenblatta (1958). Frank Rosenblatt poszedł krok dalej i dodał to, czego brakowało: uczenie. Jego perceptron to jednowarstwowa sieć jednostek z ważonymi wejściami i progową aktywacją, z jawną regułą dostrajania wag na przykładach2. To pierwszy praktycznie zrealizowany model sieci neuronowej - i pierwszy, który „uczył się” z danych zamiast być zaprogramowany ręcznie.
Zima: ograniczenie XOR (1969). Entuzjazm szybko ostudzono. W książce Perceptrons Marvin Minsky i Seymour Papert udowodnili, że jednowarstwowy perceptron reprezentuje wyłącznie funkcje liniowo separowalne i nie potrafi obliczyć nawet tak prostej operacji jak XOR3. Wynik - często nadinterpretowany - przyczynił się do „zimy” badań nad sieciami w latach 70. Wyjście z niej dały dopiero sieci wielowarstwowe uczone propagacją wsteczną, które to ograniczenie obeszły. (Do warstw i treningu wrócimy w następnym wpisie serii.)
Współczesny neuron jest „złagodzoną”, płynną wersją tamtej jednostki progowej: zamiast twardego „odpala / milczy” mamy ciągłą funkcję aktywacji. Reszta to dokładnie ten sam pomysł - suma ważona plus bias.
📐 Dla dociekliwych: równanie neuronu
Neuron liczy sumę ważoną wejść z wagami , dodaje bias , a wynik przepuszcza przez funkcję aktywacji (fi):
Zapis to iloczyn skalarny - skrót na sumę . W modelu McCullocha-Pittsa była skokiem (próg); dziś jest gładką funkcją, którą za chwilę poznamy.
Zanim pójdziemy dalej, jedno uczciwe zastrzeżenie. Słowo „neuron” sugeruje, że odtwarzamy mózg. Nie odtwarzamy. Sztuczny neuron to drastyczna idealizacja3 i warto wiedzieć, co dokładnie wyrzucono za burtę:
- Brak impulsów. Neurony biologiczne komunikują się iglicami napięcia (potencjałami czynnościowymi) - zdarzeniami „wszystko albo nic”, kodując informację także w czasie i wzorcu wyładowań. Sztuczny neuron ma jedną ciągłą liczbę, interpretowaną najwyżej jako uśredniona częstość.
- Brak pamięci. Prawdziwy neuron to układ dynamiczny - jego stan zależy od historii. Standardowy neuron feedforward jest bezpamięciowy: wyjście zależy tylko od bieżącego wejścia. Czas dokłada się dopiero architekturą (np. autoregresją w LLM), nie samym neuronem.
- Liniowa sumacja. Prawdziwe dendryty wykonują złożoną, nieliniową integrację zależną od miejsca; tu mamy prostą sumę ważoną.
- Sztywne synapsy. Wagi są stałe w trakcie jednego przejścia; biologiczne synapsy mają bogatą, zależną od czasu plastyczność.
To nie jest przypis dla pedantów. To pierwszy raz, gdy w tej serii widać przepaść między prostotą cegiełki a złożonością tego, co z niej wyrasta - i powód, dla którego pokora wobec „myślenia” modeli jest na miejscu.
〰️ Dlaczego nieliniowość jest konieczna
Tu pojawia się fakt, który decyduje o wszystkim - i który łatwo przeoczyć. Gdyby neuron tylko mnożył i sumował, to złożenie warstw byłoby złożeniem przekształceń liniowych, a złożenie funkcji liniowych jest znowu funkcją liniową. Innymi słowy: stos tysiąca warstw bez aktywacji zwija się algebraicznie do jednej warstwy. Cała gigantyczna sieć umiałaby modelować tylko zależności liniowe - czyli prawie nic z tego, co nas interesuje, bo język, obraz i logika liniowe nie są.
Ratunkiem jest właśnie funkcja aktywacji - drobne „wygięcie” wstawione na wyjściu każdego neuronu. To ono wprowadza nieliniowość, dzięki której warstwy przestają się skracać, a sieć zyskuje moc modelowania dowolnie pofalowanych zależności.
Jak dużą moc? Zaskakująco dużą - i to udowodniono formalnie. Twierdzenie o uniwersalnej aproksymacji (Cybenko, 1989) mówi, że sieć feedforward z jedną warstwą ukrytą i ciągłą sigmoidalną nieliniowością potrafi przybliżyć dowolną ciągłą funkcję z dowolną dokładnością4. Dwa lata później Hornik uogólnił wynik: decydująca jest sama wielowarstwowa architektura, a nie konkretny wybór funkcji aktywacji5. To brzmi jak magiczna obietnica - jedna warstwa wystarczy na wszystko.
Tyle że obietnica ma drobny druk, i to taki, który warto rozumieć, bo chroni przed naiwnością:
- To twierdzenie o istnieniu. Gwarantuje, że odpowiednia sieć istnieje - nie mówi, jak duża ma być ani jak ją znaleźć.
- Szerokość bywa wykładnicza. Dla niektórych funkcji płytka (jednowarstwowa) sieć musiałaby mieć liczbę neuronów rosnącą wykładniczo z wymiarem wejścia. Sieci głębokie reprezentują te same funkcje znacznie taniej - to formalna przewaga głębokości, którą udowodnił Telgarsky6. Dlatego budujemy modele głębokie, a nie szerokie.
- Brak gwarancji nauczenia. Twierdzenie mówi, że istnieje zestaw wag - nie obiecuje, że spadek gradientu do niego dojdzie (krajobraz błędu jest niewypukły, pełen minimów lokalnych).
Ta różnica - „rozwiązanie istnieje” kontra „umiemy je znaleźć” - to jeden z najważniejszych motywów całego uczenia maszynowego. Wrócimy do niej, gdy będziemy mówić o treningu.
📐 Dla dociekliwych: co dokładnie mówi twierdzenie
Cybenko pokazał, że skończone kombinacje liniowe złożeń ustalonej funkcji sigmoidalnej (sigma; z przekształceniami afinicznymi) są gęste w przestrzeni funkcji ciągłych na hipersześcianie jednostkowym . Formalnie: dla dowolnej ciągłej i dowolnie małej tolerancji błędu (epsilon) istnieje suma
dla wszystkich w dziedzinie4. Założenia są istotne: funkcja celu musi być ciągła, a dziedzina zwarta (domknięta i ograniczona). Twierdzenie nie podaje tempa - ile neuronów trzeba dla danego - i właśnie tę lukę wypełniają wyniki o przewadze głębokości6.
👉 Pobaw się: na stronie interaktywnej masz laboratorium neuronu - przesuwaj wagi i wejścia i zobacz, jak suma ważona zmienia się na żywo, oraz wykres funkcji aktywacji, na którym przełączysz kształty omawiane niżej.
🔧 Zoo funkcji aktywacji i jego ewolucja
Skoro nieliniowość jest konieczna, pozostaje pytanie: jakie wygięcie wybrać? Odpowiedź ewoluowała przez dekady, a każda zmiana rozwiązywała konkretny, namacalny problem poprzedniczki. Prześledźmy tę linię.
Sigmoid i tanh: elegancja, która dławi gradient
Pierwsze popularne aktywacje były gładkie i „ładne” matematycznie. Sigmoid ściska dowolną liczbę do przedziału , a tanh do . Problem ujawnia się w głębokich sieciach: dla dużych wartości wejścia obie funkcje nasycają się - ich wykres robi się płaski, a nachylenie (pochodna) dąży do zera.
Dlaczego to katastrofa? Bo uczenie polega na przepychaniu sygnału błędu wstecz przez wszystkie warstwy, mnożąc po drodze przez te nachylenia. Gdy każde z nich jest ułamkiem bliskim zera, iloczyn kilkudziesięciu takich ułamków staje się mikroskopijny - to słynny zanikający gradient (vanishing gradient). Efekt: wczesne warstwy uczą się ślimaczo albo wcale. To była jedna z głównych ścian, o które rozbijało się głębokie uczenie, zanim spopularyzowano ReLU7.
📐 Dla dociekliwych: wzory i pochodne sigmoidu i tanh
Sigmoid zapisujemy małą grecką literą (sigma), a tangens hiperboliczny - :
Maksimum pochodnej sigmoidu to zaledwie (w ), a tanh - (też w ). Dla dużych obie pochodne dążą do zera: stąd zanik gradientu w iloczynie po wielu warstwach. Tanh ma dodatkową zaletę: jest wyśrodkowane wokół zera, co zwykle daje zdrowszą dynamikę uczenia niż sigmoid o zakresie .
ReLU: brutalnie prosta i dlatego skuteczna
Przełom okazał się zaskakująco prymitywny. ReLU (Rectified Linear Unit) to po prostu: „zeruj liczby ujemne, dodatnie przepuść bez zmian”. Żadnych wykładników, żadnego nasycenia po dodatniej stronie - tam nachylenie wynosi równo 1, więc gradient płynie swobodnie choćby przez setki warstw. Do tego jest błyskawiczna w obliczeniu i tworzy rzadkie reprezentacje (część neuronów daje czyste zero), co samo w sobie pomaga.
Ciekawostka: ReLU nie spadła z nieba jako trik inżynierski. Wyłoniła się z teorii - Nair i Hinton wyprowadzili ją, sumując nieskończenie wiele kopii jednostki binarnej z przesuniętymi progami, co daje gładkie przybliżenie zwane softplus8. Rok później Glorot, Bordes i Bengio pokazali empirycznie, że neurony rektyfikujące dorównują tanh lub go biją, tworząc przy tym pożądaną rzadkość9.
ReLU ma jednak własną piętę achillesową: „umierające” neurony (dying ReLU). Dla wejścia ujemnego pochodna wynosi 0, więc jeśli neuron utknie z ujemną sumą dla wszystkich przykładów, jego gradient jest stale zerowy - neuron przestaje się uczyć i jest praktycznie martwy. Na tę bolączkę powstała cała rodzina łatek.
📐 Dla dociekliwych: ReLU i jej warianty przeciw „martwym" neuronom
(w zerze funkcja jest nieróżniczkowalna - w praktyce przyjmuje się pochodną 0 lub 1). Warianty wprowadzają niezerowe nachylenie po stronie ujemnej, sterowane parametrem (alfa), żeby neuron nigdy całkiem nie „zamarł” - jak Leaky ReLU10 ze stałym małym czy ELU:
W PReLU nachylenie przestaje być stałą i staje się parametrem uczonym - sieć sama dobiera, jak bardzo przepuszczać wartości ujemne. To z PReLU padł w 2015 r. głośny wynik: 4,94% błędu top-5 na ImageNet, pierwszy przekraczający poziom ludzki (5,1%) na tym benchmarku11. ELU dodatkowo wypycha średnią aktywacji bliżej zera (efekt podobny do normalizacji), co przyspiesza uczenie12.
GELU, Swish i bramkowane GLU: co naprawdę siedzi w LLM-ach
Tu dochodzimy do funkcji, które napędzają dzisiejsze modele językowe. ReLU ma ostry „łokieć” w zerze - jest niegładka. Nowsze aktywacje wygładzają ten kąt i, co ważniejsze, wprowadzają subtelne bramkowanie: zamiast twardo przepuszczać albo zerować wejście, ważą je miękko w zależności od jego wartości.
GELU (Gaussian Error Linear Unit) zamiast pytać „czy jest dodatnie?” pyta „jak bardzo wyróżnia się na tle szumu?” i przepuszcza je proporcjonalnie7. To właśnie aktywacja z wnętrza GPT-2 i GPT-3. Swish (znany też jako SiLU) to spokrewniony pomysł - gładka interpolacja między linią a ReLU, sterowana jednym parametrem13.
Największy praktyczny skok przyniosły jednak bramkowane jednostki liniowe (GLU). Pomysł: rozszczepić sygnał na dwie liniowe projekcje, jedną z nich przepuścić przez aktywację i użyć jej jako „bramki” mnożącej drugą. Z tego rodu wywodzą się GEGLU i SwiGLU - i to nie ciekawostka, tylko praktyka: w starannych testach (modele dopasowane liczbą parametrów i mocą obliczeniową) warianty GEGLU i SwiGLU dały najlepszą jakość spośród wszystkich badanych aktywacji warstwy FFN14.
📐 Dla dociekliwych: GELU, Swish i rodzina GLU
GELU waży wejście przez prawdopodobieństwo, że zmienna normalna nie przekroczy (gdzie , duże „fi”, to dystrybuanta rozkładu normalnego)7:
Swish to przemnożone przez sigmoid, z parametrem (beta) regulującym kształt13:
Dla to dokładnie SiLU; gdy , Swish dąży do ReLU - stąd „gładka interpolacja”. Bramkowane warianty mnożą po współrzędnych (symbol ) aktywowaną projekcję przez czystą liniową14:
Haczyk: GLU mają trzy macierze wag zamiast dwóch, więc żeby utrzymać stałą liczbę parametrów, redukuje się szerokość warstwy ukrytej o czynnik 14. To dlatego w opisach LLaMA pojawia się tajemnicze „”.
🏭 Co naprawdę siedzi w GPT, LLaMA i Gemmie
Teoria teorią, ale która funkcja wygrała w praniu? Oto twardy fakt z samych prac i kodu źródłowego twórców:
- GPT-2 / GPT-3 (OpenAI): GELU. Potwierdzone wprost z kodu GPT-2 - funkcja
geluto dokładnie przybliżenie tanh z pracy Hendricksa i Gimpela15. Dla GPT-3 użycie GELU jest przyjmowane jako spójne z GPT-2 (sama praca GPT-3 nie precyzuje tego jawnie16). - PaLM (Google, 2022): SwiGLU - wybrany, bo „znacząco poprawia jakość względem standardowych ReLU, GELU lub Swish”17.
- LLaMA (Meta, 2023): SwiGLU - cytując pracę: „zastępujemy nieliniowość ReLU funkcją SwiGLU (…), używamy wymiaru zamiast jak w PaLM”18.
- Gemma (Google DeepMind, 2024): GeGLU - „standardową nieliniowość ReLU zastępuje funkcja aktywacji GeGLU”19.
Trend jest czytelny: starsze modele OpenAI stoją na GELU, a fala nowoczesnych, otwartych LLM-ów (LLaMA, PaLM) przeszła na SwiGLU, podczas gdy Gemma postawiła na GeGLU. Wszystkie te wybory są bezpośrednim potomstwem jednej pracy Shazeera z 2020 r.14 To dobry przykład na to, jak pojedynczy, pozornie drobny wynik - „mnóż dwie projekcje zamiast jednej” - przesącza się do całej generacji modeli.
🎯 Co dalej
Rozebraliśmy najmniejszą cegiełkę do końca: skąd się wzięła (jednostka progowa McCullocha-Pittsa), dlaczego potrzebuje nieliniowości (bo inaczej stos warstw zwija się do jednej linii), co ta nieliniowość obiecuje i czego nie obiecuje (uniwersalna aproksymacja - istnienie, nie wykonalność) oraz które konkretne „wygięcie” wygrało w prawdziwych modelach (gładkie, bramkowane GELU i SwiGLU).
Po drodze zobaczyliśmy też pierwszą szczelinę, w której mieszka tajemnica tej serii: nasz neuron jest karykaturą biologii, a mimo to z jego miliardów kopii wyrasta coś, czego wzór nie zapowiada ani słowem. Poznanie cegiełki nie odbiera temu nic z niezwykłości - pokazuje tylko, jak skromny jest budulec.
W następnym przystanku serii bierzemy garść tych neuronów i układamy je w warstwy i sieć - a potem zadajemy najważniejsze pytanie: skąd właściwie biorą się te słynne „miliardy parametrów” i jak trening zamienia losowy szum w model, który rozumie język. To tam pojawi się propagacja wsteczna, funkcje straty i prawa skalowania.
Jeśli wolisz teraz dotknąć zamiast czytać dalej, interaktywna strona „Anatomia LLM” pozwala poprzesuwać wagi neuronu i przełączać funkcje aktywacji na żywo. A jeśli ciekawi cię, co właściwie wyłania się z tej maszynerii, gdy cegiełek są miliardy - pisałem o tym osobno.
Footnotes
-
W. S. McCulloch, W. H. Pitts (1943). A Logical Calculus of the Ideas Immanent in Nervous Activity. The Bulletin of Mathematical Biophysics 5(4):115-133. https://doi.org/10.1007/BF02478259 ↩
-
F. Rosenblatt (1958). The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain. Psychological Review 65(6):386-408. https://doi.org/10.1037/h0042519 ↩
-
M. Minsky, S. Papert, Perceptrons (MIT Press, 1969) - dowód ograniczenia XOR oraz klasyczna charakterystyka sztucznego neuronu jako idealizacji neuronu biologicznego (fakty potwierdzone niezależnie w pracach o uniwersalnej aproksymacji). ↩ ↩2
-
G. Cybenko (1989). Approximation by Superpositions of a Sigmoidal Function. Mathematics of Control, Signals and Systems 2:303-314. https://doi.org/10.1007/BF02551274 ↩ ↩2
-
K. Hornik (1991). Approximation Capabilities of Multilayer Feedforward Networks. Neural Networks 4(2):251-257. https://doi.org/10.1016/0893-6080(91)90009-T ↩
-
M. Telgarsky (2016). Benefits of Depth in Neural Networks. COLT 2016, PMLR 49:1517-1539. https://arxiv.org/abs/1602.04485 ↩ ↩2
-
D. Hendrycks, K. Gimpel (2016). Gaussian Error Linear Units (GELUs). arXiv:1606.08415. https://arxiv.org/abs/1606.08415 ↩ ↩2 ↩3
-
V. Nair, G. E. Hinton (2010). Rectified Linear Units Improve Restricted Boltzmann Machines. ICML-10, s. 807-814. https://www.cs.toronto.edu/~fritz/absps/reluICML.pdf ↩
-
X. Glorot, A. Bordes, Y. Bengio (2011). Deep Sparse Rectifier Neural Networks. AISTATS, PMLR 15:315-323. https://proceedings.mlr.press/v15/glorot11a.html ↩
-
A. L. Maas, A. Y. Hannun, A. Y. Ng (2013). Rectifier Nonlinearities Improve Neural Network Acoustic Models. ICML Workshop. https://ai.stanford.edu/~amaas/papers/relu_hybrid_icml2013_final.pdf ↩
-
K. He, X. Zhang, S. Ren, J. Sun (2015). Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852. https://arxiv.org/abs/1502.01852 ↩
-
D.-A. Clevert, T. Unterthiner, S. Hochreiter (2015). Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). arXiv:1511.07289 (ICLR 2016). https://arxiv.org/abs/1511.07289 ↩
-
P. Ramachandran, B. Zoph, Q. V. Le (2017). Searching for Activation Functions (Swish). arXiv:1710.05941. https://arxiv.org/abs/1710.05941 ↩ ↩2
-
N. Shazeer (2020). GLU Variants Improve Transformer. arXiv:2002.05202. https://arxiv.org/abs/2002.05202 ↩ ↩2 ↩3 ↩4
-
OpenAI. Kod źródłowy GPT-2,
src/model.py, funkcjagelu. https://github.com/openai/gpt-2/blob/master/src/model.py ↩ -
T. B. Brown et al. (2020). Language Models are Few-Shot Learners (GPT-3). arXiv:2005.14165. https://arxiv.org/abs/2005.14165 ↩
-
A. Chowdhery et al. (2022). PaLM: Scaling Language Modeling with Pathways. arXiv:2204.02311. https://arxiv.org/abs/2204.02311 ↩
-
H. Touvron et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971. https://arxiv.org/abs/2302.13971 ↩
-
Gemma Team, Google DeepMind (2024). Gemma: Open Models Based on Gemini Research and Technology. arXiv:2403.08295. https://arxiv.org/abs/2403.08295 ↩