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ść xix_i z wagami wiw_i, dodaje bias bb, a wynik zz przepuszcza przez funkcję aktywacji ϕ\phi (fi):

y=ϕ ⁣(iwixi+b)=ϕ(wx+b)y = \phi\!\left(\sum_{i} w_i x_i + b\right) = \phi(\mathbf{w}\cdot\mathbf{x} + b)

Zapis wx\mathbf{w}\cdot\mathbf{x} to iloczyn skalarny - skrót na sumę w1x1+w2x2+w_1x_1 + w_2x_2 + \dots. W modelu McCullocha-Pittsa ϕ\phi 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 (sigma; z przekształceniami afinicznymi) są gęste w przestrzeni funkcji ciągłych na hipersześcianie jednostkowym [0,1]n[0,1]^n. Formalnie: dla dowolnej ciągłej gg i dowolnie małej tolerancji błędu ε>0\varepsilon>0 (epsilon) istnieje suma

G(x)=j=1Nαjσ ⁣(wjx+bj),taka z˙eG(x)g(x)<εG(\mathbf{x}) = \sum_{j=1}^{N} \alpha_j\,\sigma\!\left(\mathbf{w}_j\cdot\mathbf{x} + b_j\right), \qquad \text{taka że}\quad |G(\mathbf{x}) - g(\mathbf{x})| < \varepsilon

dla wszystkich x\mathbf{x} 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 NN trzeba dla danego ε\varepsilon - 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 (0,1)(0,1), a tanh do (1,1)(-1,1). 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 (sigma), a tangens hiperboliczny - tanh\tanh:

σ(x)=11+ex,σ(x)=σ(x)(1σ(x))\sigma(x) = \frac{1}{1+e^{-x}}, \qquad \sigma'(x) = \sigma(x)\big(1-\sigma(x)\big) tanh(x)=exexex+ex,tanh(x)=1tanh2(x)\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}, \qquad \tanh'(x) = 1 - \tanh^2(x)

Maksimum pochodnej sigmoidu to zaledwie 0,250{,}25 (w x=0x=0), a tanh - 11 (też w x=0x=0). Dla dużych x|x| 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 (0,1)(0,1).

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

ReLU(x)=max(0,x),ReLU(x)={1x>00x<0\mathrm{ReLU}(x) = \max(0, x), \qquad \mathrm{ReLU}'(x) = \begin{cases}1 & x>0\\ 0 & x<0\end{cases}

(w zerze funkcja jest nieróżniczkowalna - w praktyce przyjmuje się pochodną 0 lub 1). Warianty wprowadzają niezerowe nachylenie po stronie ujemnej, sterowane parametrem α\alpha (alfa), żeby neuron nigdy całkiem nie „zamarł” - jak Leaky ReLU10 ze stałym małym α0,01\alpha\approx 0{,}01 czy ELU:

LeakyReLU(x)={xx>0αxx0ELU(x)={xx>0α(ex1)x0\mathrm{LeakyReLU}(x) = \begin{cases} x & x>0\\ \alpha x & x\le 0\end{cases} \qquad \mathrm{ELU}(x) = \begin{cases} x & x>0\\ \alpha(e^x - 1) & x\le 0\end{cases}

W PReLU nachylenie α\alpha 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 xx jest dodatnie?” pyta „jak bardzo xx 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 xx (gdzie Φ\Phi, duże „fi”, to dystrybuanta rozkładu normalnego)7:

GELU(x)=xΦ(x)=x12[1+erf ⁣(x/2)]0,5x(1+tanh ⁣[2/π(x+0,044715x3)])\mathrm{GELU}(x) = x\,\Phi(x) = x\cdot\tfrac{1}{2}\Big[1+\mathrm{erf}\!\big(x/\sqrt{2}\big)\Big] \approx 0{,}5\,x\Big(1 + \tanh\!\Big[\sqrt{2/\pi}\,\big(x + 0{,}044715\,x^3\big)\Big]\Big)

Swish to xx przemnożone przez sigmoid, z parametrem β\beta (beta) regulującym kształt13:

Swish(x)=xσ(βx)\mathrm{Swish}(x) = x\cdot\sigma(\beta x)

Dla β=1\beta=1 to dokładnie SiLU; gdy β\beta\to\infty, Swish dąży do ReLU - stąd „gładka interpolacja”. Bramkowane warianty mnożą po współrzędnych (symbol \otimes) aktywowaną projekcję przez czystą liniową14:

GEGLU(x)=GELU(xW)xV,SwiGLU(x)=Swish(xW)xV\mathrm{GEGLU}(x) = \mathrm{GELU}(xW)\otimes xV, \qquad \mathrm{SwiGLU}(x) = \mathrm{Swish}(xW)\otimes xV

Haczyk: GLU mają trzy macierze wag zamiast dwóch, więc żeby utrzymać stałą liczbę parametrów, redukuje się szerokość warstwy ukrytej dffd_{ff} o czynnik 23\tfrac{2}{3}14. To dlatego w opisach LLaMA pojawia się tajemnicze „234d\tfrac{2}{3}\cdot 4d”.

🏭 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 gelu to 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 234d\tfrac{2}{3}4d zamiast 4d4d 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 y=ϕ(wx+b)y=\phi(\mathbf{w}\cdot\mathbf{x}+b) 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

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. M. Telgarsky (2016). Benefits of Depth in Neural Networks. COLT 2016, PMLR 49:1517-1539. https://arxiv.org/abs/1602.04485 2

  7. D. Hendrycks, K. Gimpel (2016). Gaussian Error Linear Units (GELUs). arXiv:1606.08415. https://arxiv.org/abs/1606.08415 2 3

  8. 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

  9. X. Glorot, A. Bordes, Y. Bengio (2011). Deep Sparse Rectifier Neural Networks. AISTATS, PMLR 15:315-323. https://proceedings.mlr.press/v15/glorot11a.html

  10. 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

  11. 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

  12. 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

  13. P. Ramachandran, B. Zoph, Q. V. Le (2017). Searching for Activation Functions (Swish). arXiv:1710.05941. https://arxiv.org/abs/1710.05941 2

  14. N. Shazeer (2020). GLU Variants Improve Transformer. arXiv:2002.05202. https://arxiv.org/abs/2002.05202 2 3 4

  15. OpenAI. Kod źródłowy GPT-2, src/model.py, funkcja gelu. https://github.com/openai/gpt-2/blob/master/src/model.py

  16. T. B. Brown et al. (2020). Language Models are Few-Shot Learners (GPT-3). arXiv:2005.14165. https://arxiv.org/abs/2005.14165

  17. A. Chowdhery et al. (2022). PaLM: Scaling Language Modeling with Pathways. arXiv:2204.02311. https://arxiv.org/abs/2204.02311

  18. H. Touvron et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971. https://arxiv.org/abs/2302.13971

  19. Gemma Team, Google DeepMind (2024). Gemma: Open Models Based on Gemini Research and Technology. arXiv:2403.08295. https://arxiv.org/abs/2403.08295