Od pojedynczego neuronu, przez wagi i funkcje aktywacji, aż po mechanizm uwagi i dotrenowywanie metodą LoRA. Krótko, z matematyką i interaktywnymi diagramami.
Cała sieć neuronowa składa się z milionów kopii jednego, bardzo prostego elementu. Sztuczny neuron pobiera kilka liczb wejściowych x, mnoży każdą przez przypisaną jej wagę w, sumuje wyniki, dodaje bias b (przesunięcie), a na końcu przepuszcza wynik przez funkcję aktywacji f.
Matematycznie cały neuron to jedno równanie. Najpierw liczymy sumę ważoną z, a potem przepuszczamy ją przez funkcję:
Zapis w·x to iloczyn skalarny - to samo, co suma w₁x₁ + w₂x₂ + …, tylko krócej. Waga mówi neuronowi, jak ważne jest dane wejście (duża dodatnia = wzmacnia, ujemna = hamuje), a bias przesuwa próg zadziałania.
Gdyby neurony tylko sumowały i mnożyły, cała sieć - choćby miała tysiąc warstw - byłaby równoważna jednemu mnożeniu macierzy, czyli linią prostą. Funkcja aktywacji wprowadza nieliniowość, dzięki której sieć potrafi modelować skomplikowane, pofalowane zależności (język, obrazy, logikę).
| Funkcja | Wzór | Zakres | Gdzie używana |
|---|---|---|---|
| ReLU | max(0, z) | [0, ∞) | warstwy ukryte (klasyka, szybka) |
| Sigmoid | 1/(1+e⁻ᶻ) | (0, 1) | prawdopodobieństwo, bramki |
| tanh | (eᶻ−e⁻ᶻ)/(eᶻ+e⁻ᶻ) | (−1, 1) | sieci rekurencyjne |
| GELU | z·Φ(z) | ≈[−0.17, ∞) | nowoczesne Transformery (GPT, BERT) |
Pojedynczy neuron jest słaby. Siłę daje dopiero ułożenie ich w warstwy i połączenie warstw w sieć. Wyjścia jednej warstwy stają się wejściami następnej. Sygnał płynie od lewej (wejście) do prawej (wyjście) - to tzw. propagacja w przód (ang. forward pass).
Zamiast liczyć każdy neuron osobno, całą warstwę zapisujemy jednym mnożeniem macierzy. Jeśli warstwa ma macierz wag W i wektor biasów b, to:
To dlatego trening LLM-ów odbywa się na kartach graficznych (GPU) - są one zaprojektowane do błyskawicznego mnożenia ogromnych macierzy. Cała „inteligencja" modelu siedzi w liczbach wewnątrz tych macierzy W.
Kiedy słyszysz „model ma 7B (7 miliardów) parametrów", chodzi dokładnie o liczbę wszystkich wag i biasów w sieci. To są te liczby, które model „uczy się" podczas treningu, stopniowo je korygując, by jego przewidywania były coraz lepsze.
Przykład: warstwa przyjmująca 1000 wejść i dająca 1000 wyjść ma już 1 000 000 + 1000 ≈ milion parametrów. LLM ma setki takich warstw - stąd miliardy.
Wagi nie są ustawiane ręcznie. Model startuje z losowymi liczbami i poprawia je w pętli:
Każdy krok treningu odrobinę poprawia wagi i zwykle odrobinę zmniejsza stratę. To, jak szybko (i czy w ogóle) strata maleje, zależy od tempa uczenia η. Pobaw się suwakiem - zobacz trzy reżimy: zbyt wolny, dobry i rozbieżny.
Mając ustalony budżet obliczeń, ile wybrać parametrów, a ile tokenów treningu? Praca Chinchilla (DeepMind, 2022) pokazała, że optymalnie jest trenować na około 20 tokenach na każdy parametr - wcześniejsze modele bywały niedotrenowane.
Sieć nie rozumie liter. Tekst najpierw dzieli się na tokeny (kawałki słów), a każdy token zamienia na wektor liczb - embedding. To „współrzędne" słowa w wielowymiarowej przestrzeni znaczeń.
Piękno embeddingów polega na tym, że geometria niesie znaczenie. Słowa „kot" i „pies" leżą blisko siebie; relacje też są wektorami - klasyczny przykład:
Wpisz dowolny tekst, a poniżej zobaczysz, jak rozpadłby się na tokeny. Częste słowa zostają w całości, rzadsze i długie dzielą się na kawałki (## oznacza dalszą część słowa). To podział poglądowy - prawdziwe tokenizery (BPE) uczą się swoich sklejeń ze zbioru danych.
Skoro słowa to wektory, można je dodawać i odejmować. Wybierz trzy słowa i zobacz, do którego słowa najbliżej trafi wynik. (Zabawkowa przestrzeń 2D: oś pozioma ~ płeć, oś pionowa ~ status. Prawdziwe embeddingi mają tysiące wymiarów, a takie analogie bywają zawodne.)
To przełom, który umożliwił dzisiejsze LLM-y. Uwaga (ang. attention) pozwala każdemu słowu „rozejrzeć się" po całym zdaniu i zdecydować, które inne słowa są dla niego najważniejsze. W zdaniu „Kot nie zjadł ryby, bo była zepsuta" - uwaga łączy „była" z „rybą", a nie z „kotem".
Z embeddingu każdego tokenu model tworzy trzy wektory, mnożąc go przez trzy wyuczone macierze:
Dopasowanie Query do każdego Key (iloczyn skalarny) daje punktację; po przeskalowaniu i przepuszczeniu przez softmax dostajemy wagi uwagi sumujące się do 1. Wynik to ważona suma wartości V:
Dzielenie przez √dₖ (pierwiastek z wymiaru) stabilizuje wartości, by softmax nie „nasycał się" przy dużych liczbach. Softmax zamienia surowe punkty na procenty uwagi.
↑ Wartości to ilustracja poglądowa. Im ciemniejszy/grubszy słupek, tym więcej „uwagi" wybrane słowo poświęca danemu słowu w zdaniu.
Słupki wyżej pokazują jeden wiersz tej macierzy. Tutaj widać ją w całości: każdy wiersz to słowo-pytanie (Query), każda kolumna - słowo-klucz (Key), a jasność komórki mówi, ile uwagi pierwsze poświęca drugiemu. To wizualizacja macierzy softmax(QKᵀ/√d) - tej samej, którą liczyliśmy wyżej.
↑ Liczby w komórkach to procent uwagi (każdy wiersz sumuje się do 100%). Zwróć uwagę na jasną komórkę „była/zepsuta → ryby" - dokładnie tę relację łapie mechanizm uwagi.
Jedna „głowa" uwagi patrzy na jeden typ relacji. Model uruchamia ich kilkadziesiąt równolegle - jedna śledzi gramatykę, inna odniesienia, inna styl - a ich wyniki są łączone. Stąd nazwa multi-head attention.
LLM to stos wielu identycznych bloków Transformera (np. 32, 80, a nawet ponad 100). Każdy blok ma dwie główne części: warstwę uwagi i zwykłą sieć w przód (FFN). Spinają je dwa triki, które umożliwiają trenowanie bardzo głębokich sieci:
Na samym końcu stosu ostatnia warstwa zamienia wektory z powrotem na prawdopodobieństwa kolejnego tokenu - i to właśnie z nich „losowane" jest następne słowo odpowiedzi.
Ostatnia warstwa daje rozkład prawdopodobieństwa nad wszystkimi tokenami. To, jak z niego losujemy, ustawiają dwa pokrętła: temperatura (wyostrza lub spłaszcza rozkład) i top-p (odcina ogon mało prawdopodobnych słów). Pobaw się nimi:
↑ Szare słupki to pełny rozkład po temperaturze; czerwone to tokeny, które przeżyły odcięcie top-p i z których model faktycznie losuje (✕ = odcięte).
Pełne dotrenowanie (ang. fine-tuning) modelu 70B oznacza aktualizację wszystkich 70 miliardów parametrów - to wymaga ogromnych kart graficznych i sporo pieniędzy. LoRA (ang. Low-Rank Adaptation) to spryt: zamrażamy oryginalne wagi i uczymy tylko maleńki „dodatek".
Zmiana wag potrzebna do specjalizacji modelu jest „niskiego rzędu" (ang. low-rank) - da się ją zapisać jako iloczyn dwóch cienkich macierzy. Zamiast uczyć całą wielką macierz aktualizacji ΔW (o wymiarach d×d), uczymy tylko dwie chude macierze A i B:
Gdzie r to rank (np. 8 lub 16) - wąskie gardło, które decyduje o liczbie nowych parametrów, a α to skala wpływu adaptera. W₀ pozostaje nietknięte.
Porównajmy pełną poprawkę z LoRA dla macierzy d = 4096 i rangi r = 8:
| Podejście | Wzór na liczbę parametrów | Wynik (d=4096, r=8) |
|---|---|---|
| Pełny fine-tuning (ΔW) | d × d | ≈ 16 800 000 |
| LoRA (B + A) | d × r + r × d = 2·d·r | ≈ 65 500 |
| Oszczędność | d / (2r) | ~256× mniej |
Token x przechodzi przez zamrożoną drogę główną W₀x oraz przez tani „boczny tor" LoRA - a wyniki się sumują. To wszystko.
Ranga r to jedyne realne pokrętło LoRA: im mniejsza, tym mniej nowych parametrów (i taniej), ale tym mniej „pojemności" na nową wiedzę. Zobacz, jak r przekłada się na liczbę uczonych parametrów (skala słupków jest logarytmiczna):