Reading the Math in AI Papers · Część 1 z 1

Jak czytać matematykę w artykułach AI z arXiv: praktyczny przewodnik

Tłumaczenie automatyczne

Ten artykuł został automatycznie przetłumaczony z angielskiego oryginału.

Czytanie matematyki w artykule o AI to przydatna umiejętność dla inżynierów, którzy muszą zrozumieć model, odtworzyć metodę albo ocenić wynik eksperymentu. Ten przewodnik pokazuje, jak odczytywać notację, sprawdzać równanie na małych liczbach i łączyć je z resztą artykułu oraz z implementacją. Zakłada, że umiesz czytać kod, ale nie zakłada, że notacja z publikacji naukowych jest ci już znana.

Równanie ściska w jednej linii kilka decyzji: jakie obiekty przetwarza, jakie mają wymiary, które wartości są losowane oraz co jest uczone, a co pozostaje stałe. Odtworzenie tych szczegółów to dobry pierwszy krok. Wyjaśnienie, dlaczego metoda działa, i wierna implementacja wymagają dalszej pracy.

Zacznij od omówienia mechanizmu uwagi: łączy ono jedno równanie z kształtami tablic, małymi liczbami i działającym kodem w Pythonie. Ściąga z notacji wyjaśnia wyrażenia, które spotkasz w innych artykułach. Dalsze części serii stosują tę samą metodę do równań z konkretnych artykułów: równań architektury, takich jak RoPE, MLA i LoRA; celów treningowych, takich jak DPO i GRPO; oraz modeli generatywnych i metryk, takich jak ELBO, dyfuzja i pass@k. Tych części jeszcze nie ma, więc omówienia, do których odwołuje się ta część, nie są podlinkowane. Dłuższe ujęcie podstaw znajdziesz w książce Tianhua Chena The Little Book of Generative AI Foundations, która rozwija algebrę liniową i rachunek prawdopodobieństwa stojące za modelami generatywnymi.

Uwaga (attention) – czytana symbol po symbolu

Uwaga tworzy wektor wyjściowy jako średnią ważoną wektorów wartości (value). Wagi uzyskuje, porównując wektor zapytania (query) dla pozycji wyjściowej z wektorem klucza (key) dla każdej dostępnej pozycji wejściowej. Macierze QQ, KK i VV zbierają wektory zapytań, kluczy i wartości. Skalowana uwaga iloczynu skalarnego łączy te kroki w równaniu (1) w §3.2.1 (§ oznacza „sekcję”) artykułu Attention Is All You Need:

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V.\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V.

Definicje są w tekście, nie w równaniu. Akapit przed równaniem (1) mówi, że zapytania i klucze mają wymiar dkd_k, a wartości wymiar dvd_v. Metoda liczy iloczyn skalarny każdego zapytania ze wszystkimi kluczami, dzieli każdy z nich przez dk\sqrt{d_k} i stosuje softmax, „aby uzyskać wagi wartości”. Zapytania są „spakowane razem w macierz QQ”, a klucze i wartości w KK i VV. Każdy wiersz tych macierzy to więc wektor jednego tokena, a softmax daje jeden zestaw wag na zapytanie. Wyuczone macierze, które zamieniają wektory tokenów na QQ, KK i VV, pojawiają się dalej, w §3.2.2.

Kształty i role. Głowica uwagi (head) wykonuje jedno takie obliczenie na własnych wektorach zapytań, kluczy i wartości. Zanim zaczniesz czytać operatory, zapisz ich kształty. Dla jednej głowicy z nn zapytaniami i mm kluczami:

SymbolKształtCzym jestSkąd się bierze
QQn×dkn\times d_kjeden wiersz zapytania na każdą pozycję wyjściowąwektory tokenów razy wyuczona macierz
KKm×dkm\times d_kjeden wiersz klucza na każdą pozycję, na którą można patrzećwektory tokenów razy wyuczona macierz
VVm×dvm\times d_vjeden wiersz wartości na każdy kluczwektory tokenów razy wyuczona macierz
K⊤K^\topdk×md_k\times mKK transponowana: wiersze stają się kolumnamite same liczby co w KK
dkd_kliczbaszerokość każdego zapytania i kluczastałe ustawienie: 64 w bazowym Transformerze

Artykuły podają kształt, wskazując zbiór, do którego należy macierz: Q∈Rn×dkQ\in\mathbb R^{n\times d_k} oznacza macierz liczb rzeczywistych o nn wierszach i dkd_k kolumnach, czyli tablicę o kształcie [n, dk].

Czytaj od środka na zewnątrz.

  1. QK⊤QK^\top mnoży macierz n×dkn\times d_k przez macierz dk×md_k\times m. Wspólny wymiar dkd_k zostaje zsumowany, więc wynikiem jest tabela wyników (scores) o wymiarach n×mn\times m. Element (i,j)(i,j) to iloczyn skalarny zapytania ii i klucza jj: pomnóż odpowiadające sobie elementy, a potem dodaj iloczyny. Przy ustalonych długościach wektorów wynik jest tym większy, im bardziej podobne są ich kierunki.

  2. Dzielenie przez dk\sqrt{d_k} powstrzymuje wzrost wyników wraz z szerokością wektora. Przypis 4 w artykule pokazuje, dlaczego nieskalowane iloczyny skalarne rosną. Załóżmy, że składowe zapytania i klucza są od siebie niezależne (znajomość części z nich nic nie mówi o pozostałych), każda ze średnią 0 i wariancją 1 (średnia kwadratu odległości od średniej). Wtedy:

    one product qiki:variance 1q⊤k=∑i=1dkqiki:variance dk, standard deviation dkq⊤k/dk:standard deviation 1\begin{aligned} \text{one product }q_ik_i:&\quad\text{variance }1\\ q^\top k=\textstyle\sum_{i=1}^{d_k}q_ik_i:&\quad\text{variance }d_k,\ \text{standard deviation }\sqrt{d_k}\\ q^\top k/\sqrt{d_k}:&\quad\text{standard deviation }1 \end{aligned}

    Te linie korzystają z dwóch reguł dotyczących liczb niezależnych. Po pierwsze, iloczyn dwóch niezależnych liczb, z których każda ma średnią 0 i wariancję 1, też ma wariancję 1. Po drugie, przy dodawaniu liczb niezależnych ich wariancje się sumują, więc dkd_k iloczynów daje wariancję dkd_k. Odchylenie standardowe to pierwiastek kwadratowy z wariancji, czyli dk\sqrt{d_k}. Podzielenie każdego wyniku przez dk\sqrt{d_k} zmniejsza rozrzut o ten sam czynnik, z powrotem do 1.

    Dlaczego te dwie reguły są prawdziwe

    Wariancja przy średniej 0. Wariancja to średni kwadrat odległości od średniej. Gdy średnia wynosi 0, kwadrat odległości od średniej to po prostu kwadrat liczby, więc wariancja jest średnią z kwadratu. Składowa qiq_i o średniej 0 i wariancji 1 ma więc qi2q_i^2 ze średnią 1.

    Średnia z iloczynu. Dla liczb niezależnych średnia z iloczynu jest iloczynem średnich. Weźmy liczbę aa, która z równym prawdopodobieństwem wynosi 1 lub 3, więc ma średnią 2, oraz liczbę bb, która z równym prawdopodobieństwem wynosi 1 lub 5, więc ma średnią 3. Niezależność oznacza, że bb przyjmuje każdą ze swoich wartości równie często bez względu na to, jaka wyszła aa, więc wszystkie cztery pary są jednakowo prawdopodobne. Gdy a=1a=1, iloczyny to 1 i 5, ze średnią 3=1×33=1\times3. Gdy a=3a=3, iloczyny to 3 i 15, ze średnią 9=3×39=3\times3. W obu przypadkach średnia wynosi a×3a\times3, więc po obu wartościach aa jest to (3+9)/2=6(3+9)/2=6, czyli 2×32\times3. Bez niezależności reguła zawodzi: gdyby bb wynosiło 5 zawsze, gdy aa wynosi 3, a 1 zawsze, gdy aa wynosi 1, pojawiłyby się tylko iloczyny 1 i 15, a ich średnia to 8. Wikipedia podaje tę regułę dla dowolnych niezależnych zmiennych losowych, używając określenia „wartość oczekiwana” na średnią: independence and expectation.

    Reguła 1: jeden iloczyn ma wariancję 1. Weźmy jeden iloczyn qikiq_ik_i. Jego średnia to iloczyn średnich, 0×0=00\times0=0, więc jego wariancja jest średnią z (qiki)2=qi2ki2(q_ik_i)^2=q_i^2k_i^2. Kwadraty są niezależne, bo niezależne są qiq_i i kik_i, a każdy ma średnią 1, więc wariancja wynosi 1×1=11\times1=1. Ogólny wzór to variance of a product of independent variables.

    Reguła 2: wariancje niezależnych składników się sumują. Nazwijmy iloczyny xi=qikix_i=q_ik_i, tak że iloczyn skalarny jest sumą x1+⋯+xdkx_1+\cdots+x_{d_k}. Składniki są niezależne, bo każdy używa innych składowych, a każdy ma średnią 0 i wariancję 1. Suma też ma średnią 0, więc jej wariancja jest średnią z jej kwadratu. Pomnożenie sumy przez siebie daje jeden iloczyn xixjx_ix_j dla każdej pary składników, czyli siatkę dk×dkd_k\times d_k:

    Siatka cztery na cztery dla kwadratu sumy x1 + x2 + x3 + x4, z jedną komórką na każdy iloczyn dwóch składników. Cztery komórki na przekątnej, kwadraty od x1 do x4, są wyróżnione: każda ma średnią 1, więc razem dają 4. Dwanaście pozostałych komórek mnoży dwa różne niezależne składniki i każda ma średnią 0 razy 0, więc razem dają 0. Kwadrat sumy ma średnią 4: wariancja 4, odchylenie standardowe 2. Przy 64 składnikach to samo zliczanie daje wariancję 64 i odchylenie standardowe 8.Siatka cztery na cztery dla kwadratu sumy x1 + x2 + x3 + x4, z jedną komórką na każdy iloczyn dwóch składników. Cztery komórki na przekątnej, kwadraty od x1 do x4, są wyróżnione: każda ma średnią 1, więc razem dają 4. Dwanaście pozostałych komórek mnoży dwa różne niezależne składniki i każda ma średnią 0 razy 0, więc razem dają 0. Kwadrat sumy ma średnią 4: wariancja 4, odchylenie standardowe 2. Przy 64 składnikach to samo zliczanie daje wariancję 64 i odchylenie standardowe 8.

    Komórki na przekątnej to kwadraty xi2x_i^2 i każda ma średnią 1. Każda inna komórka mnoży dwa różne, niezależne składniki, więc jej średnia jest iloczynem ich średnich, 0×0=00\times0=0: dodatnie i ujemne wartości się znoszą. Zostaje tylko dkd_k komórek na przekątnej, więc wariancja sumy wynosi dkd_k, a jej odchylenie standardowe dk\sqrt{d_k}. Rozrzut rośnie z pierwiastkiem kwadratowym z szerokości, bo większość siatki się znosi. Ogólne twierdzenie Wikipedia podaje jako variance of a sum of uncorrelated variables; zmienne niezależne są zawsze nieskorelowane, więc reguła je obejmuje.

    Przy dk=64d_k=64 surowe wyniki rozkładają się zwykle w przedziale około ±8\pm8; po przeskalowaniu w około ±1\pm1, przy dowolnej szerokości.

    Szeroko rozrzucone wyniki nasycają softmax (krok 3), a jego gradienty zanikają. Jeśli jeden wynik w wierszu jest znacznie wyższy od pozostałych, softmax daje temu kluczowi wagę bliską 1, a każdemu innemu kluczowi wagę bliską 0. Mała zmiana któregokolwiek wyniku ledwo rusza wagami, więc gradient docierający do zapytań i kluczy jest bliski zeru, a trening prawie nie ma czym ich dostrajać. Artykuł podaje to jako prawdopodobne wyjaśnienie wcześniejszego wyniku: bez skalowania uwaga oparta na iloczynie skalarnym radziła sobie przy dużym dkd_k gorzej niż uwaga addytywna, starsza forma, która ocenia parę zapytanie–klucz małą siecią (Britz et al., 2017). Sam artykuł nie mierzy gradientów.

  3. Softmax zamienia każdy wiersz wyników na wagi. Niech z=(z1,…,zm)z=(z_1,\ldots,z_m) będzie jednym wierszem przeskalowanych wyników. Wykładnicza eae^a, zapisywana też jako exp⁡(a)\exp(a), używa stałej e≈2.718e\approx2.718. Wtedy softmax⁡(z)j=ezj/∑j′ezj′\operatorname{softmax}(z)_j=e^{z_j}/\sum_{j'}e^{z_{j'}}, gdzie j′j' to po prostu druga nazwa indeksu, więc suma przebiega po wszystkich kluczach w wierszu. Wagi są dodatnie, a każdy wiersz sumuje się do 1.

  4. Pomnożenie wag n×mn\times m przez wartości m×dvm\times d_v sumuje po osi kluczy. Wiersz ii wyjścia n×dvn\times d_v jest średnią ważoną wierszy wartości, z wagami zależnymi od tego, jak dobrze każdy klucz pasował do zapytania ii.

Jedna głowica uwagi narysowana jako siatki liczb: trzy zapytania, cztery klucze, szerokość klucza dwa i szerokość wartości trzy. Q, trzy na dwa, razy K transponowane, dwa na cztery, daje tabelę wyników trzy na cztery. Softmax zachowuje ten kształt i sprawia, że każdy wiersz sumuje się do jedności. Wagi, trzy na cztery, razy V, cztery na trzy, dają wyjście trzy na trzy, a wiersz drugi wyjścia jest średnią ważoną wierszy wartości z wagami z wiersza drugiego.Jedna głowica uwagi narysowana jako siatki liczb: trzy zapytania, cztery klucze, szerokość klucza dwa i szerokość wartości trzy. Q, trzy na dwa, razy K transponowane, dwa na cztery, daje tabelę wyników trzy na cztery. Softmax zachowuje ten kształt i sprawia, że każdy wiersz sumuje się do jedności. Wagi, trzy na cztery, razy V, cztery na trzy, dają wyjście trzy na trzy, a wiersz drugi wyjścia jest średnią ważoną wierszy wartości z wagami z wiersza drugiego.

Policz kwadraty na rysunku: każdy iloczyn usuwa oś, którą dzielą jego dwie siatki.

Sprawdź to na dwóch liczbach. Weźmy jedno zapytanie i dwa klucze, których przeskalowane wyniki to (0,log⁡3)(0,\log3), dobrane tak, by wykładnicze wyszły 1 i 3, oraz wartości v1=(2,0)v_1=(2,0) i v2=(0,4)v_2=(0,4). Rysunek przelicza to po jednej operacji na kolumnę:

Tabela z jednym wierszem na klucz. Klucz 1: przeskalowany wynik 0, wykładnicza 1, waga 1/4, wartość (2, 0), wartość ważona (0,5; 0). Klucz 2: przeskalowany wynik log 3, wykładnicza 3, waga 3/4, wartość (0, 4), wartość ważona (0, 3). Wykładnicze sumują się do 4, wagi do 1, a wartości ważone do wyjścia (0,5; 3).Tabela z jednym wierszem na klucz. Klucz 1: przeskalowany wynik 0, wykładnicza 1, waga 1/4, wartość (2, 0), wartość ważona (0,5; 0). Klucz 2: przeskalowany wynik log 3, wykładnicza 3, waga 3/4, wartość (0, 4), wartość ważona (0, 3). Wykładnicze sumują się do 4, wagi do 1, a wartości ważone do wyjścia (0,5; 3).

Uwaga wymieszała obie wartości; nie wybrała lepiej pasującego tokena.

Porównaj to z kodem. Poniższa funkcja NumPy implementuje jedną głowicę. k.T to transpozycja. axis=1 to oś kluczy, więc wiersz każdego zapytania jest normalizowany osobno. Maksimum wiersza jest odejmowane przed np.exp: dodanie tej samej liczby do każdego wyniku w wierszu skraca się w ilorazie softmaxu, więc wynik się nie zmienia, ale duże wyniki przestają powodować przepełnienie. Opcjonalna maska ustawia zablokowane wyniki na −∞-\infty, co daje im wagi dokładnie równe zero. Dekoder używa takiej maski, by token nie patrzył na późniejsze tokeny (§3.2.3 artykułu).

Zapisz blok jako attention_example.py i uruchom uv run --with numpy python attention_example.py. Testy przechodzą bez żadnego komunikatu.

import numpy as np

def attention(q, k, v, allowed=None):
    """One head. q: [n, dk], k: [m, dk], v: [m, dv], allowed: bool [n, m]."""
    scores = q @ k.T / np.sqrt(q.shape[1])  # [n, m]
    if allowed is not None:
        if not allowed.any(axis=1).all():
            raise ValueError("every query needs at least one allowed key")
        scores = np.where(allowed, scores, -np.inf)
    scores = scores - scores.max(axis=1, keepdims=True)
    weights = np.exp(scores)
    weights = weights / weights.sum(axis=1, keepdims=True)  # rows sum to 1
    return weights @ v, weights  # [n, dv], [n, m]

# The two-key example from the text.
out, w = attention(
    np.array([[1.0]]),
    np.array([[0.0], [np.log(3.0)]]),
    np.array([[2.0, 0.0], [0.0, 4.0]]),
)
np.testing.assert_allclose(w, [[0.25, 0.75]])
np.testing.assert_allclose(out, [[0.5, 3.0]])

# A causal mask: query i may attend only to keys 0..i.
x = np.random.default_rng(0).normal(size=(3, 4))
out, w = attention(x, x, x, allowed=np.tril(np.ones((3, 3), dtype=bool)))
assert out.shape == (3, 4)
np.testing.assert_allclose(w.sum(axis=1), 1.0)
assert np.all(w[np.triu_indices(3, k=1)] == 0)

Zapytanie, którego wszystkie klucze są zablokowane, to przypadek, który równanie zostawia nierozstrzygnięty: każda waga w jego wierszu wyniosłaby 0/00/0. Funkcja zgłasza błąd zamiast zwracać NaN.

Od jednej głowicy do kilku. Bazowy Transformer uruchamia równolegle osiem głowic, każdą z własnymi wyuczonymi macierzami do tworzenia QQ, KK i VV i każdą z dk=dv=64d_k=d_v=64. Łączy ich wyniki i mnoży rezultat przez kolejną wyuczoną macierz, WOW^O (Attention Is All You Need, §3.2.2).

Implementacja może też przetwarzać batch: kilka sekwencji wejściowych naraz. Na przykład scaled dot-product attention w PyTorch przyjmuje tensor zapytań Q o kształcie [batch, heads, n, d_k]. Pierwsze dwa wymiary wybierają sekwencję i głowicę; Q[b, h] to macierz [n, d_k] dla tej pary. Wzór uwagi stosuje się osobno do każdej pary. Funkcja NumPy z tego artykułu obsługuje tylko jedną taką parę: jej operacje .T i axis=1 zakładają dwuwymiarowe dane wejściowe.

Sześć pytań do każdego równania

PytanieOdpowiedź dla uwagi
Co zwraca równanie i o jakim kształcie?Macierz n×dvn\times d_v: jeden wiersz wyjścia na zapytanie
Czy każdy symbol to dane, wytrenowana waga, zamrożony model, ustawienie czy próbka?QQ, KK i VV są obliczane z tokenów przez wyuczone macierze; dkd_k to stałe ustawienie; nic nie jest losowane
Po którym indeksie lub osi przebiega każda operacja?Softmax przebiega po mm kluczach w wierszu każdego zapytania; iloczyn wag z VV sumuje po kluczach
Gdzie są definicje?Akapit przed równaniem (1), przypis 4 oraz §3.2.2 dla wyuczonych rzutowań
Co daje sprawdzenie na dwóch lub trzech liczbach?Wagi (1/4,3/4)(1/4,3/4) i wyjście (0.5,3)(0.5,3)
Co musiał rozstrzygnąć kod, czego równanie nie rozstrzyga?Odejmowanie maksimum wiersza, wartość użyta dla zamaskowanych wyników, wiersz bez dozwolonego klucza

Jaki rodzaj twierdzenia zawiera równanie

Uwaga jest obliczeniem: mówi, jak z danych wejściowych uzyskać wynik. Artykuły zapisują też równania, które pełnią inne role:

RodzajPrzykład w tej seriiCo sprawdzić
ObliczenieWyjście uwagi; skompresowany wektor w MLAKształt każdego wyniku pośredniego
DefinicjaWynik GRPO względem innych odpowiedziCo oznacza nowa nazwa, tak by można było ją podstawić z powrotem
Cel: strata do minimalizacji lub wynik do maksymalizacjiStrata DPOCzy jest minimalizowany, czy maksymalizowany, i po jakich danych się uśrednia
Reguła aktualizacjiSpadek gradientu; pamięć w Gated DeltaNetCo zmienia się w każdym kroku, a co pozostaje stałe
Ograniczenie, czyli zbiór dozwolonych wartościDozwolone macierze mieszania w mHCJak artykuł wytwarza wartość, która je spełnia
Granica: górny lub dolny kres wielkościDolna granica dowodu (evidence lower bound, ELBO)Różnica między obiema stronami i kiedy wynosi zero
Estymator lub metrykapass@kCo jest zliczane i z ilu próbek
Dopasowanie empirycznePrawo skalowania z DeepSeek LLMZakres danych, na którym dopasowano krzywą

Ograniczenie (constraint) stwierdza własność, którą musi mieć wynik. Dla wag uwagi ta własność brzmi: każda waga jest nieujemna, a każdy wiersz sumuje się do 1. Softmax to obliczenie, które wytwarza wagi o tej własności. Sam wymóg nie mówi, że trzeba użyć softmaxu.

== stwierdza, że dwa wyrażenia są równe. :=:= oznacza „jest zdefiniowane jako”: nadaje wyrażeniu nazwę. Definicja może nazywać metrykę, stratę albo zbiór dozwolonych wartości, więc samo :=:= nie mówi, z jakim rodzajem równania z tabeli powyżej masz do czynienia.

Na przykład Evaluating Large Language Models Trained on Code, artykuł, który wprowadził model generowania kodu Codex, używa :=:= do zdefiniowania estymatora pass@k (równanie 1). Ta metryka mierzy szansę, że co najmniej jeden z kk wygenerowanych programów przejdzie testy. W raporcie technicznym DeepSeek-V4 równanie (2) łączy dwa twierdzenia: M:={…}\mathcal M:=\{\ldots\} definiuje zbiór dozwolonych macierzy, a Bl∈MB_l\in\mathcal M wymaga, by macierz mieszania modelu BlB_l należała do tego zbioru. Definicja używa :=:=; ograniczenie używa ∈\in, czyli „należy do”. Sekcje o pass@k i mHC omawiają te przykłady.

Znajdowanie nowego równania, jego definicji i jego kodu

Sekcja metody artykułu opisuje, jak działa jego model lub algorytm treningowy. Nagłówek może brzmieć „Method”, „Architecture” albo bardziej szczegółowo. Autorzy często najpierw wyjaśniają istniejącą metodę, a potem pokazują, co zmienili. Aby ustalić deklarowany wkład, zacznij od podsumowania nowości we wstępie. Na przykład DeepSeekMath, §1.1 wymienia Group Relative Policy Optimization (GRPO), swoją metodę trenowania modeli na ocenionych odpowiedziach. Numery sekcji i równań odnoszą się tu do podlinkowanego artykułu.

Następnie porównaj proponowaną metodę z wcześniejszą, którą zmienia. Ilustrują to dwa artykuły:

  • Zmiana architektury. DeepSeek-V2 opisuje standardową uwagę wielogłowicową w §2.1.1 i wprowadza multi-head latent attention (MLA) w §2.1.2. Standardowa uwaga przechowuje klucze i wartości każdego wcześniejszego tokena. MLA przechowuje skompresowany wektor, z którego można je odtworzyć. Porównanie tych równań pokazuje, co model przechowuje inaczej; omówienie MLA wyprowadza oszczędność pamięci.
  • Zmiana treningu. DeepSeekMath, §4.1.1 podaje cel Proximal Policy Optimization (PPO) jako równanie (1), a GRPO jako równanie (3). Oba używają przewagi (advantage): liczby, która mówi, czy odpowiedź była lepsza, czy gorsza od oczekiwanej. PPO szacuje ją za pomocą drugiej wyuczonej sieci, modelu wartości, który przewiduje nagrodę, jaka jeszcze zostanie uzyskana z niepełnej odpowiedzi. GRPO zamiast tego porównuje nagrodę za odpowiedź z nagrodami za inne odpowiedzi na to samo pytanie. Omówienie GRPO porównuje te składniki, używając notacji całych odpowiedzi z DeepSeek-R1.

Znajdź definicje wokół równania. Sprawdź poprzedzający akapit, każde zdanie „gdzie …” po nim, przypisy i dodatki. W Attention Is All You Need akapit przed równaniem (1) definiuje wymiary, a przypis 4 wyjaśnia współczynnik skalowania. DeepSeek-V3 definiuje większość symboli routingu zaraz po równaniu (15), a składnik bib_i tuż przed równaniem (16). DeepSeek-V2 rozwija MLA w równaniach (9)–(19), a potem zbiera obliczenia w Dodatku C.

Sprawdź algorytm i kod. Ramka algorytmu to ponumerowany listing pseudokodu, który podaje kolejność operacji. Algorithm 1 w DeepSeekMath pokazuje, kiedy generować odpowiedzi, a kiedy aktualizować model. Algorithm 1 w Denoising Diffusion Probabilistic Models (DDPM) określa, jak losować obraz treningowy, poziom szumu i szum. Implementacje rozstrzygają dalsze szczegóły: domyślnie np.std dzieli sumę kwadratów odchyleń przez nn, a torch.std przez n−1n-1. Przykład GRPO pokazuje, jak ten wybór zmienia wartości przewagi obliczone z tych samych nagród.

Wersje arXiv mogą przenosić sekcje i powtarzać równania pod nowymi numerami, więc podawaj wersję. W DeepSeek-R1 v1 cel GRPO to §2.2.1, równania (1)–(3). W v2, opublikowanej w styczniu 2026, to §2.1, a te same równania wracają jako (11)–(13) w Supplementary A.3. Link bez wersji otwiera najnowszą, więc każdy link do arXiv w tej serii zawiera wersję, z którą go sprawdzono.

Sprawdzanie własnego odczytu za pomocą LLM

Model czatowy potrafi przygotować szkic tabeli symboli, indeks każdej sumy i sprawdzenie na małych liczbach, jeśli podasz mu definicje i poprosisz o wskazanie braków. Tekst skopiowany z PDF spłaszcza indeksy dolne, górne i ułamki do jednej linii; linki „HTML (experimental)” i „TeX Source” na stronie abstraktu arXiv dają czysty tekst do wklejenia. Wklej równanie i otaczające je akapity razem z takim poleceniem:

Below is equation (N) from <paper title, arXiv ID and version>, followed by
the paragraphs that define its symbols.

1. Make a table with one row per symbol: shape or type, meaning, and whether
   it is input data, a trained weight, a frozen model, a fixed setting or a
   random sample. Quote the sentence that defines it.
2. List every symbol the pasted text does not define. Do not guess them.
3. For every sum, mean, softmax, min or expectation, name the index or the
   distribution it runs over.
4. Work through the equation with the smallest numbers that use every term.
5. Say which kind of statement it is: a computation, definition, objective,
   update rule, constraint, bound, estimator or empirical fit.

Bez kroku 2 nic nie powstrzymuje modelu przed uzupełnieniem brakującej definicji zwykłym znaczeniem litery, na przykład odczytaniem σ\sigma w DPO jako odchylenia standardowego zamiast sigmoidy. Cytaty z kroku 1 pozwalają sprawdzić tabelę: wyszukaj każdy z nich w PDF i potraktuj wiersz, którego cytatu nie możesz znaleźć, jako zgadywanie.

Ta sama procedura jako umiejętności agenta. paper-math-skills pakuje tę sekcję i poniższą ściągę z notacji w dwie umiejętności (skills) napisane dla Claude Code; mogą z nich korzystać także inni agenci, którzy ładują pliki SKILL.md. read-paper-math pobiera przypiętą wersję arXiv, cytuje zdanie definiujące każdy symbol, czyta równanie od środka na zewnątrz i wykonuje sprawdzenie na małych liczbach. check-paper-math przegląda taki odczyt względem artykułu: wyszukuje każdy cytat, powtarza obliczenia i oznacza twierdzenia mocniejsze lub słabsze niż w artykule. paper-math-readings zawiera odczyty tych umiejętności dla części 2–4, po jednym dla każdej z 15 sekcji z linią Source:.

Ściąga z notacji

Jeśli jakaś grecka litera jest ci obca, otwórz tabelę liter greckich z tego artykułu (Dodatek A), by poznać jej nazwę i typowe znaczenia. Jeśli chcesz więcej ćwiczyć matematykę, Stanford CS229 udostępnia powtórki z rachunku prawdopodobieństwa i algebry liniowej wraz z ćwiczeniami; Preliminaries z Dive into Deep Learning wyjaśniają podstawy razem z kodem.

Indeksy, znaki nad literami i znaki relacji

Litery są lokalnymi nazwami zmiennych: każdy artykuł definiuje własne. Indeksy dolne są zwykle numerami pozycji. xix_i może być współrzędną ii wektora albo przykładem ii w zbiorze danych, a hth_t to wektor modelu dla tokena tt, zwany jego stanem ukrytym (hidden state).

Indeksy górne w artykułach o modelach często są etykietami. W ht(ℓ)h_t^{(\ell)} indeks górny w nawiasie to zwykle numer warstwy, a nie potęga; w FFN⁡i(s)\operatorname{FFN}^{(s)}_i i FFN⁡i(r)\operatorname{FFN}^{(r)}_i z DeepSeek-V3 oznacza on ekspertów współdzielonych (shared) i kierowanych (routed), czyli tych, z których korzysta każdy token, i tych, które wybiera router (zobacz przykład routingu MoE). W DeepSeek-V2 WDKVW^{DKV} i ktCk_t^C niosą etykiety, a nie wykładniki; przykład MLA definiuje te etykiety. W⊤W^\top to transpozycja, a x2x^2 to kwadrat.

x1:Tx_{1:T} oznacza pozycje od 1 do TT, w tym TT, inaczej niż wycinek (slice) w Pythonie; artykuły zwykle liczą od 1. x<tx_{<t} oznacza każdą pozycję przed tt. Xt,:X_{t,:} wybiera wiersz tt, jak w wycinaniu w NumPy.

Znaki przy literze zwykle zmieniają jej znaczenie w jeden z tych sposobów:

ZnakZwykłe znaczeniePrzykład lub wyjątek
y^\hat yPredykcja lub estymataPrzykład: A^i,t\hat A_{i,t} w DeepSeekMath szacuje, o ile lepszy od oczekiwanego był wynik odpowiedzi
xˉ\bar xŚredniaWyjątek: w DDPM αˉt\bar\alpha_t mnoży czynniki harmonogramu szumu od kroku 1 do tt
x~\tilde xWersja zaburzona lub nieograniczonaPrzykład: w DeepSeek-V4 B~l\tilde B_l to macierz przed normalizacją, która wymusza jej ograniczenia
x∗x^\astOptimumWyjątek: w DPO r∗r^\ast to prawdziwa nagroda, której metoda nigdy nie obserwuje
x′x'Nowa wartość lub wynik pośredniPrzykład: w DeepSeek-V3 gi,t′g'_{i,t} to waga eksperta przed normalizacją
A−1A^{-1}Macierz odwrotnaNie odwrotność element po elemencie: A−1A^{-1} odwraca działanie AA, A−1A=IA^{-1}A=I (macierz jednostkowa), a (A−1)ij≠1/Aij(A^{-1})_{ij}\neq1/A_{ij} w ogólności

Niektóre symbole inne niż greckie litery też pełnią kilka funkcji:

SymbolZnaczenia
∣\midWarunkowanie w p(y∣x)p(y\mid x); „takie, że” wewnątrz zbioru
∣x∣\vert x\vertWartość bezwzględna; długość sekwencji, jak w ∣oi∣\vert o_i\vert, liczbie tokenów odpowiedzi oio_i w GRPO; liczność zbioru
∼\sim„Jest losowane z” w x∼px\sim p; „mniej więcej” w tekście nieformalnym
TTDługość sekwencji; temperatura softmaxu; liczba kroków dyfuzji
qqWektor zapytania (uwaga); pytanie (GRPO); model ucznia qθq_\theta (destylacja); koder qϕq_\phi (ELBO)

Pięć znaków mówi, jak powiązane są dwie strony. :=:=, czasem ≜\triangleq, definiuje nową nazwę. ≈\approx oznacza przybliżenie, na przykład uśrednienie po próbkach w sekcji Wartości oczekiwane i skąd biorą się próbki. ∝\propto znaczy „proporcjonalne do”, z pominiętą stałą normalizującą: pi∝ezip_i\propto e^{z_i} staje się rozkładem dopiero po podzieleniu przez ∑jezj\sum_j e^{z_j}. ≪\ll znaczy „znacznie mniejsze niż”, jak w dc≪dhnhd_c\ll d_hn_h z DeepSeek-V2: skompresowana szerokość jest znacznie mniejsza niż łączna szerokość wszystkich głowic. ←\leftarrow to przypisanie, jak w regule aktualizacji.

Sumy, zliczanie, przedziały i logarytmy

Duże ∑\sum dodaje składniki, a ∏\prod je mnoży. Indeks pod każdym operatorem zaczyna się tu od 1 i biegnie do górnej granicy NN:

∑i=1Nxi=x1+⋯+xN,∏i=1Nxi=x1⋯xN.\sum_{i=1}^{N}x_i=x_1+\cdots+x_N,\qquad\prod_{i=1}^{N}x_i=x_1\cdots x_N.

Indeks należy do operatora, tak jak zmienna pętli należy do swojej pętli. W yi=∑j=1dWijxjy_i=\sum_{j=1}^{d}W_{ij}x_j suma przebiega po jj, a ii identyfikuje element wyniku. Wynikiem jest wektor z jednym elementem na każde ii: rozpisany iloczyn macierzy i wektora WxWx. Indeksy po lewej stronie mówią, jaki kształt ma wynik.

Czynnik przed sumą decyduje, co dostaje równą wagę. Batch z odpowiedzią o 2 tokenach i odpowiedzią o 8 tokenach, gdzie ℓit\ell_{it} to strata na tokenie tt odpowiedzi ii (w GRPO ℓ\ell jest zamiast tego składnikiem do maksymalizacji), można uśrednić na dwa sposoby:

Lanswers=12(12∑t=12ℓ1t+18∑t=18ℓ2t)Ltokens=110(∑t=12ℓ1t+∑t=18ℓ2t)\begin{aligned} L_{\text{answers}}&=\frac12\left(\frac12\sum_{t=1}^{2}\ell_{1t}+\frac18\sum_{t=1}^{8}\ell_{2t}\right)\\ L_{\text{tokens}}&=\frac1{10}\left(\sum_{t=1}^{2}\ell_{1t}+\sum_{t=1}^{8}\ell_{2t}\right) \end{aligned}

W pierwszym sposobie każda odpowiedź dostaje wagę 12\tfrac12, dzieloną między jej tokeny:

short answer, each token:12×12=14long answer, each token:12×18=116\begin{aligned} \text{short answer, each token:}&\quad\tfrac12\times\tfrac12=\tfrac14\\ \text{long answer, each token:}&\quad\tfrac12\times\tfrac18=\tfrac1{16} \end{aligned}

W drugim każdy token ma wagę 1/101/10. GRPO losuje GG odpowiedzi o1,…,oGo_1,\ldots,o_G na każde pytanie, a ∣oi∣\vert o_i\vert to liczba tokenów odpowiedzi ii. Oba uśrednienia wyglądają wtedy tak, dla GRPO z DeepSeekMath i dla DAPO, późniejszego wariantu GRPO:

DeepSeekMath’s GRPO, per answer:1G∑i=1G1∣oi∣∑t=1∣oi∣ℓitDAPO, per token:1∑i∣oi∣∑i=1G∑t=1∣oi∣ℓit\begin{aligned} \text{DeepSeekMath's GRPO, per answer:}&\quad\frac1G\sum_{i=1}^{G}\frac1{\vert o_i\vert}\sum_{t=1}^{\vert o_i\vert}\ell_{it}\\ \text{DAPO, per token:}&\quad\frac1{\sum_i\vert o_i\vert}\sum_{i=1}^{G}\sum_{t=1}^{\vert o_i\vert}\ell_{it} \end{aligned}

Dla G=2G=2 są to LanswersL_{\text{answers}} i LtokensL_{\text{tokens}} z góry. DAPO przyjęło uśrednianie po tokenach (§3.3), ponieważ uśrednianie po odpowiedziach dawało tokenom długich odpowiedzi zbyt małą wagę: model uczył się zbyt mało z długich dobrych odpowiedzi i nie karał dostatecznie długich, powtarzalnych złych.

Suma może też zliczać. Artykuły robią to za pomocą wskaźnika (indicator): pogrubionej jedynki z warunkiem, 1[C]\mathbf 1[C], która równa się 1, gdy warunek CC jest prawdziwy, a 0, gdy jest fałszywy. Niektóre artykuły umieszczają warunek w nawiasach okrągłych albo drukują zamiast tego jedynkę w kroju podwójnie kreskowanym (double-struck); znaczenie jest to samo. Dodanie wskaźników zlicza więc, ile razy warunek jest spełniony. Typowym przykładem jest trafność (accuracy). Jeśli y^i\hat y_i to przewidziana klasa, a yiy_i poprawna klasa dla przykładu ii, to ∑i1[y^i=yi]\sum_i\mathbf 1[\hat y_i=y_i] jest liczbą poprawnych predykcji. Predykcje (kot, pies, pies) wobec poprawnych etykiet (kot, kot, pies) dają wskaźniki 1, 0 i 1, więc liczba wynosi 2, a trafność 2/3. W warstwie mixture-of-experts (MoE) router wysyła każdy token do kilku z wielu podsieci feed-forward, zwanych ekspertami. W stracie bilansującej DeepSeek-V3 (równanie 18) wskaźnik wynosi 1, gdy wynik eksperta dla tokena należy do KrK_r najwyższych wyników dla tego tokena, gdzie KrK_r to liczba ekspertów, do których kierowany jest każdy token. Jego suma po tokenach sekwencji zlicza, jak często to się zdarzyło. Wynik użyty tutaj pomija obciążenie (bias) dodawane przez routing, więc zliczenie może się różnić od ekspertów, których router faktycznie wybiera (routing MoE).

Współczynnik dwumianowy (nk)\binom nk, czytany „nn po kk”, zlicza sposoby wyboru kk różnych elementów spośród nn bez względu na kolejność. Dla liczb całkowitych 0≤k≤n0\leq k\leq n równa się n!/(k! (n−k)!)n!/(k!\,(n-k)!). Wykrzyknik oznacza silnię: n!=1×2×⋯×nn!=1\times2\times\cdots\times n, przy 0!=10!=1. Na przykład (52)=5!/(2! 3!)=10\binom52=5!/(2!\,3!)=10: pięć elementów daje dziesięć różnych par. DeepSeekMoE używa współczynników dwumianowych do zliczania kombinacji ekspertów, a estymator pass@k do zliczania zbiorów próbek.

Przedziały używają nawiasów do oznaczenia, które końce są wliczone: [a,b][a,b] zawiera oba, (a,b)(a,b) żaden. W Gated DeltaNet αt∈(0,1)\alpha_t\in(0,1) oznacza ściśle między 0 a 1. W innych miejscach (a,b)(a,b) to para.

Logarytm naturalny odwraca potęgowanie: log⁡(ea)=a\log(e^a)=a. Logarytmy zamieniają iloczyny na sumy, a ilorazy na różnice: log⁡(ab)=log⁡a+log⁡b\log(ab)=\log a+\log b i log⁡(a/b)=log⁡a−log⁡b\log(a/b)=\log a-\log b, ale log⁡(a+b)\log(a+b) się nie rozkłada. Dlatego artykuły pracują na logarytmach prawdopodobieństw. Logarytm iloczynu prawdopodobieństw tokenów jest sumą, a logarytm ilorazu prawdopodobieństw dwóch modeli jest różnicą, czyli postacią użytą w celach DPO i GRPO. Artykuły o ML mają na myśli logarytm naturalny, o ile nie powiedziano inaczej; wyniki są w natach, a logarytmy o podstawie 2 dają bity. Dla prawdopodobieństwa p≤1p\leq1 mamy −log⁡p≥0-\log p\geq0, a wartość ta rośnie bez ograniczeń, gdy pp zbliża się do 0, więc pewna siebie błędna predykcja jest kosztowna.

Log-sum-exp oznacza: podnieś do potęgi wykładniczej każdy wynik ziz_i, zsumuj rezultaty, a potem weź logarytm. Bezpośrednie obliczenie log⁡∑iezi\log\sum_i e^{z_i} może przepełnić zakres, gdy któryś wynik jest duży. Zamiast tego znajdź największy wynik i nazwij go mm. Zapis m=max⁡izim=\max_i z_i oznacza „porównaj wszystkie elementy ziz_i i weź największy”; w NumPy m = z.max().

Odejmij mm od każdego wyniku przed potęgowaniem, a po wzięciu logarytmu dodaj je z powrotem:

log⁡∑iezi=m+log⁡∑iezi−m.\log\sum_i e^{z_i}=m+\log\sum_i e^{z_i-m}.

Dla z=(1000,1001)z=(1000,1001) największy wynik to m=1001m=1001. Przesunięte wyniki to (−1,0)(-1,0), więc obliczenie przyjmuje postać 1001+log⁡(e−1+1)≈1001.3131001+\log(e^{-1}+1)\approx1001.313. Żadna wykładnicza nie jest większa niż 1. Kod uwagi używa tego samego odejmowania przed softmaxem; tam wspólny czynnik skraca się w dzieleniu, więc nic nie trzeba dodawać z powrotem.

Prawdopodobieństwo warunkowe i prawdopodobieństwo tekstu

pθ(y∣x)p_\theta(y\mid x) to prawdopodobieństwo, jakie model o parametrach θ\theta przypisuje wynikowi yy przy danym wejściu xx. Indeks dolny nazywa parametry; niektóre artykuły piszą p(y∣x;θ)p(y\mid x;\theta), gdzie średnik również oznacza parametry, a nie warunek. Z kropką w miejscu wyniku, pθ(⋅∣x)p_\theta(\cdot\mid x) jest całym rozkładem po wynikach, a nie pojedynczą liczbą. Artykuły o RL zapisują ten sam obiekt jako πθ(o∣q)\pi_\theta(o\mid q), czyli prawdopodobieństwo, że model napisze odpowiedź oo na pytanie qq, i nazywają model polityką (policy).

Zamiana zdarzenia z warunkiem daje inną liczbę. Przyjmijmy 100 odpowiedzi modelu: 60 jest poprawnych, 50 to poprawny JSON, a 40 spełnia oba warunki. Wtedy

P(correct∣valid JSON)=40/50=0.8,P(valid JSON∣correct)=40/60≈0.67.\begin{aligned} P(\text{correct}\mid\text{valid JSON})&=40/50=0.8,\\ P(\text{valid JSON}\mid\text{correct})&=40/60\approx0.67. \end{aligned}

Niech AA oznacza „odpowiedź jest poprawna”, a BB „odpowiedź jest poprawnym JSON-em”. Prawdopodobieństwo warunkowe ogranicza zliczanie do odpowiedzi spełniających warunek: P(A∣B)=P(A∩B)/P(B)P(A\mid B)=P(A\cap B)/P(B), pod warunkiem że P(B)>0P(B)>0. Symbol ∩\cap oznacza „zachodzą oba zdarzenia”. Tutaj ułamek wynosi 0.4/0.5=0.80.4/0.5=0.8, tyle samo co 40 poprawnych odpowiedzi wśród 50 z poprawnym JSON-em.

Dwa zdarzenia są niezależne, gdy wiedza, że jedno zaszło, nie zmienia prawdopodobieństwa drugiego. Wymaga to P(A∩B)=P(A)P(B)P(A\cap B)=P(A)P(B). W tej próbce P(both)=0.4P(\text{both})=0.4, podczas gdy P(correct)P(valid JSON)=0.6×0.5=0.3P(\text{correct})P(\text{valid JSON})=0.6\times0.5=0.3, więc zaobserwowane proporcje nie spełniają niezależności.

Twierdzenie Bayesa, zwane też regułą Bayesa, wiąże oba kierunki warunkowania: P(A∣B)=P(B∣A)P(A)/P(B)P(A\mid B)=P(B\mid A)P(A)/P(B). Pozwala obliczyć prawdopodobieństwo AA przy danym BB z prawdopodobieństwa BB przy danym AA i prawdopodobieństw obu zdarzeń. Przykład ELBO używa go do znalezienia prawdopodobieństwa ukrytego kodu przy danym zaobserwowanym obrazie.

Model językowy ocenia sekwencję token po tokenie. Z reguły łańcuchowej prawdopodobieństwa

pθ(y1:T∣x)=∏t=1Tpθ(yt∣x,y<t)log⁡pθ(y1:T∣x)=∑t=1Tlog⁡pθ(yt∣x,y<t)\begin{aligned} p_\theta(y_{1:T}\mid x)&=\prod_{t=1}^{T}p_\theta(y_t\mid x,y_{<t})\\ \log p_\theta(y_{1:T}\mid x)&=\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}) \end{aligned}

Każdy czynnik warunkuje się na wszystkich wcześniejszych tokenach, więc wzór nie zakłada niezależności tokenów. Jeśli trzy tokeny mają prawdopodobieństwa warunkowe 0,5, 0,2 i 0,1:

p=0.5×0.2×0.1=0.01log⁡p=log⁡0.5+log⁡0.2+log⁡0.1≈−0.693−1.609−2.303≈−4.61\begin{aligned} p&=0.5\times0.2\times0.1=0.01\\ \log p&=\log0.5+\log0.2+\log0.1\approx-0.693-1.609-2.303\approx-4.61 \end{aligned}

Zwykła strata treningowa to ujemna wartość tej sumy podzielona przez długość:

L(θ)=−1T∑t=1Tlog⁡pθ(yt∣x,y<t).\mathcal L(\theta)=-\frac1T\sum_{t=1}^{T}\log p_\theta(y_t\mid x,y_{<t}).

Podczas treningu wcześniejsze tokeny y<ty_{<t} pochodzą ze zbioru danych. Podczas generowania są to własne wcześniejsze wybory modelu.

Wartości oczekiwane i skąd biorą się próbki

Wartość oczekiwana to średnia ważona prawdopodobieństwami:

Ex∼p[f(x)]=∑xp(x)f(x).\mathbb E_{x\sim p}[f(x)]=\sum_x p(x)f(x).

Czytaj Ex∼p[f(x)]\mathbb E_{x\sim p}[f(x)] jako „średnia z f(x)f(x), gdy xx jest losowane z pp”. Zapis ∑x\sum_x sumuje po wszystkich możliwych wartościach dyskretnych xx. Bez indeksu dolnego E[X]\mathbb E[X] uśrednia zmienną losową XX po jej własnym rozkładzie: jeśli XX wynosi 1 z prawdopodobieństwem 0,75 i 3 z prawdopodobieństwem 0,25, to E[X]=1×0.75+3×0.25=1.5\mathbb E[X]=1\times0.75+3\times0.25=1.5.

Gdy zmienna ma gęstość p(x)p(x), czyli prawdopodobieństwo na jednostkę xx, średnia ważona jest całką, ∫f(x)p(x) dx\int f(x)p(x)\,dx. Symbol dxdx wskazuje xx jako zmienną, po której się całkuje; bez zapisanych granic całka obejmuje cały jej zakres. Przykład gęstości wyjaśnia prawdopodobieństwo na jednostkę i pokazuje całkę jako pole pod krzywą.

Kod treningowy nie może sumować po każdym możliwym wejściu, więc losuje i uśrednia: Ex∼p[f(x)]≈1N∑i=1Nf(xi)\mathbb E_{x\sim p}[f(x)]\approx\frac1N\sum_{i=1}^{N}f(x_i), gdzie każde xix_i jest losowane niezależnie z pp, co artykuły zapisują jako xi∼iidpx_i\overset{\text{iid}}{\sim}p. Artykuły nazywają to estymatą Monte Carlo, a w kodzie jest to loss.mean() po batchu. Średnia z batcha estymuje wartość oczekiwaną tylko wtedy, gdy batch jest losowany z rozkładu podanego w indeksie E\mathbb E, więc indeks mówi, jak powstają dane treningowe:

  • DPO uśrednia po zapisanych przykładach (x,yw,yl)∼D(x,y_w,y_l)\sim\mathcal D: prompcie, odpowiedzi preferowanej i odpowiedzi odrzuconej. Odpowiedzi są zbierane i oznaczane przed tym etapem treningu; mogą pochodzić z wcześniejszego generowania przez model. W każdym kroku treningu model oblicza prawdopodobieństwa dla tych dostarczonych odpowiedzi i aktualizuje swoje wagi. Nie losuje w tym kroku nowych odpowiedzi.
  • GRPO w DeepSeek-R1: wygeneruj odpowiedzi, potem porównaj ich nagrody. Trening losuje pytanie ze zbioru danych, generuje kilka odpowiedzi i ocenia je funkcją nagrody, na przykład sprawdzeniem wyniku matematycznego albo uruchomieniem testów jednostkowych. Aktualizacja faworyzuje odpowiedzi, które uzyskały wynik powyżej średniej grupy. Zapis q∼P(Q)q\sim P(Q) oznacza „wylosuj pytanie qq z rozkładu pytań”. Zapis {oi}∼πθold(O∣q)\{o_i\}\sim\pi_{\theta_{old}}(O\mid q) oznacza „wylosuj odpowiedzi oio_i na to pytanie z kopii modelu o nazwie πθold\pi_{\theta_{old}}”. Indeks old oznacza kopię, która wygenerowała te odpowiedzi; ta kopia pozostaje stała, dopóki batch służy do aktualizacji. Omówienie GRPO wyjaśnia porównanie nagród i aktualizacje.
  • Destylacja on-policy w MiniLLM i DeepSeek-V4: wygeneruj tekst, potem ucz się z prawdopodobieństw nauczyciela. Trenowany model to uczeń (student). Generuje tekst; zamrożony nauczyciel (teacher) dostarcza prawdopodobieństwa następnego tokena dla tych samych prefiksów, a trening dostraja prawdopodobieństwa ucznia do prawdopodobieństw nauczyciela. To te prawdopodobieństwa stanowią sygnał treningowy, a nie nagroda za odpowiedź jak w GRPO. MiniLLM zapisuje tekst wylosowany przez ucznia jako y∼qθy\sim q_\theta: yy to tekst, a qθq_\theta nazywa model ucznia. DeepSeek-V4 nazywa swojego ucznia πθ\pi_\theta i używa kilku wyspecjalizowanych nauczycieli. Faktyczna procedura losowania w MiniLLM dodatkowo domieszkuje tokeny wylosowane od nauczyciela. Omówienie destylacji wyjaśnia cele i to rozróżnienie w losowaniu.

Kolejność mówi, co optymalizuje trening. Załóżmy, że model przypisuje prawdopodobieństwa 0,9 i 0,1 poprawnym wynikom dwóch jednakowo ważonych przykładów treningowych. Uśrednienie ich logarytmów prawdopodobieństwa oznacza, że najpierw bierzemy każdy logarytm, a potem uśredniamy: np.log(probs).mean(). Logarytm z ich średniej to np.log(probs.mean()). Jeśli XX to prawdopodobieństwo przypisane poprawnemu wynikowi losowo wybranego przykładu:

E[log⁡X]=12(log⁡0.9+log⁡0.1)≈−1.20log⁡E[X]=log⁡((0.9+0.1)/2)=log⁡0.5≈−0.69\begin{aligned} \mathbb E[\log X]&=\tfrac12(\log0.9+\log0.1)\approx-1.20\\ \log\mathbb E[X]&=\log\bigl((0.9+0.1)/2\bigr)=\log0.5\approx-0.69 \end{aligned}

Zmiana znaku tych wyników daje straty 1,20 i 0,69. Drugi model, który przypisuje 0,5 każdemu poprawnemu wynikowi, dostaje 0,69 w obu obliczeniach. Zatem uśrednianie prawdopodobieństw przed wzięciem logarytmu traktuje oba modele jako równie dobre, podczas gdy zwykła średnia ujemnego logarytmu prawdopodobieństwa karze pierwszy model mocniej za niskie prawdopodobieństwo drugiego poprawnego wyniku. Przekładając stratę na kod, zachowaj kolejność logarytmu i średniej.

Nierówność Jensena podaje ogólną zależność dla dodatniego XX: E[log⁡X]≤log⁡E[X]\mathbb E[\log X]\leq\log\mathbb E[X]. Pomaga też konstruować alternatywne cele treningowe. Gdy prawdopodobieństwo danych w modelu wymaga kosztownego uśredniania po zmiennych ukrytych, średnia z logarytmów może dać dolną granicę, którą łatwiej oszacować. Omówienie ELBO wyjaśnia ten problem treningowy; ELBO to skrót od evidence lower bound. Sekcja 2.4 książki Tianhua Chena The Little Book of Generative AI Foundations wyprowadza tę granicę za pomocą nierówności Jensena.

Gęstości, wariancja i słupki błędów

p(x)p(x) ma dwa częste znaczenia. Dla wyników dyskretnych, takich jak tokeny lub klasy, daje prawdopodobieństwo wyniku xx: liczbę od 0 do 1, przy czym prawdopodobieństwa po wszystkich wynikach sumują się do 1.

Aby zrozumieć drugie znaczenie, załóżmy, że XX jest wybierane jednostajnie między 0 a 0,5. Przedziały o równej długości mają równe prawdopodobieństwa. Przedział od 0,1 do 0,2 zajmuje jedną piątą całego zakresu, więc

P(0.1≤X≤0.2)=0.2−0.10.5=0.2.P(0.1\leq X\leq0.2)=\frac{0.2-0.1}{0.5}=0.2.

W tym zakresie prawdopodobieństwo to szerokość przedziału pomnożona przez 2. Ten mnożnik to gęstość prawdopodobieństwa: p(x)=2p(x)=2 dla 0≤x≤0.50\leq x\leq0.5 i zero poza tym. Gęstość opisuje prawdopodobieństwo na jednostkę zmiennej, a nie prawdopodobieństwo jednej dokładnej wartości.

Zerowe prawdopodobieństwo punktu nie znaczy, że nic nie zostanie wylosowane. Zawężaj przedział wokół 0,15: jego prawdopodobieństwo to dwukrotność szerokości, więc zbliża się do zera, gdy szerokość dąży do zera. Pojedynczy dokładny punkt ma więc prawdopodobieństwo zero. Losowanie nadal daje jakąś wartość w [0,0.5][0,0.5], a cały ten przedział ma prawdopodobieństwo 1. Jeśli zapiszesz wynik zaokrąglony do dwóch miejsc po przecinku, zapisana wartość 0,15 reprezentuje przedział od 0,145 do 0,155, którego prawdopodobieństwo wynosi 2×0.01=0.022\times0.01=0.02.

Dla gęstości niejednostajnej mnożnik zmienia się z xx. Całka sumuje wkłady na całym przedziale:

P(a≤X≤b)=∫abp(x) dx.P(a\leq X\leq b)=\int_a^bp(x)\,dx.

Geometrycznie jest to pole pod krzywą gęstości między aa i bb; pole nad całym zakresem wynosi 1. W przykładzie jednostajnym pole to po prostu wysokość 2 razy szerokość 0,5. Gęstość może więc przekraczać 1, a jej logarytm może być dodatni, jak log⁡2≈0.69\log2\approx0.69 tutaj. Prawdopodobieństwo nigdy nie przekracza 1.

Rozkład Gaussa używany jako szum w DDPM ma gęstość tego rodzaju. Nie każdy rozkład ciągły ma zwykłą gęstość: rozkład Cantora jest matematycznym kontrprzykładem, spoza omawianych tu modeli. Przechowywanie wartości rzeczywistych nie oznacza też rozkładu ciągłego: zmienna ograniczona do 0.0 i 1.0 nadal ma dwa wyniki dyskretne.

Artykuły często używają tej samej litery dla prawdopodobieństw i gęstości. Sprawdź, jak artykuł definiuje rozkład zmiennej i po której zmiennej sumuje się lub całkuje. Całka po zmiennej ukrytej zz, takiej jak kod latentny w ELBO w części 4, nie mówi, czy zaobserwowane xx jest dyskretne, czy ciągłe. Niektóre artykuły piszą wielkie PP dla prawdopodobieństw, a małe pp dla gęstości, ale wiele używa pp dla obu.

Aby opisać, jak bardzo rozkład rozprasza się wokół średniej, artykuły używają wariancji: średniego kwadratu różnicy od średniej, Var⁡(X)=E[(X−μ)2]\operatorname{Var}(X)=\mathbb E[(X-\mu)^2], gdzie μ=E[X]\mu=\mathbb E[X]. Odchylenie standardowe jest jej pierwiastkiem kwadratowym, więc ma te same jednostki co XX.

Te wielkości pojawiają się też w nazwach rozkładów. Rozkład Gaussa, zwany też normalnym, zapisuje się N(μ,σ2)\mathcal N(\mu,\sigma^2): μ\mu to jego średnia, a σ2\sigma^2 wariancja. Dla wektora N(μ,Σ)\mathcal N(\mu,\Sigma) używa macierzy kowariancji Σ\Sigma: element (i,j)(i,j) mierzy, jak współrzędne ii i jj zmieniają się razem, a przekątna zawiera ich wariancje. N(0,I)\mathcal N(0,I) opisuje wektor niezależnych liczb o standardowym rozkładzie normalnym, każdej ze średnią 0 i wariancją 1; II to macierz jednostkowa.

Tabele wyników benchmarków często podają średni wynik razem z miarą zmienności. Rozrzut pojedynczych przebiegów różni się od niepewności ich średniej: dla NN niezależnych przebiegów z odchyleniem standardowym σ\sigma błąd standardowy średniej wynosi σ/N\sigma/\sqrt N.

Zanim porównasz dwa wpisy, takie jak 82.3±0.482.3\pm0.4 i 81.5±0.481.5\pm0.4, ustal z podpisu, czy 0,4 to odchylenie standardowe między przebiegami, błąd standardowy, czy połowa szerokości przedziału ufności. Aby porównać średnie, oblicz przedział dla ich różnicy. Procedura 95-procentowego przedziału ufności daje zakresy, które w 95% powtórzonych eksperymentów zawierają prawdziwą różnicę, przy jej założeniach.

W tym przykładzie załóż cztery niezależne przebiegi na model, w przybliżeniu normalne wyniki przebiegów i równe wariancje populacji. Jeśli przebiegi są sparowane, na przykład dwa modele oceniane na tych samych niezależnie wylosowanych zadaniach, analizuj zamiast tego różnice wewnątrz par. Przewodnik NIST po testach dwóch prób wyjaśnia te przypadki.

Dla niezależnych średnich wariancja ich różnicy jest sumą ich wariancji. Standardowa zmienna normalna mieści się między −1.96-1.96 a 1.961.96 z prawdopodobieństwem około 0,95, co daje mnożnik dla przybliżenia normalnego 95-procentowego przedziału. Jeśli 0,4 to odchylenie standardowe w czterech przebiegach, to pierwsze obliczenie daje:

standard error of each mean=0.4/4=0.2standard error of the gap=0.22+0.22≈0.28gap=82.3−81.5=0.8normal approximation=0.8±1.96×0.28≈0.8±0.55=from 0.25 to 1.35\begin{aligned} \text{standard error of each mean}&=0.4/\sqrt4=0.2\\ \text{standard error of the gap}&=\sqrt{0.2^2+0.2^2}\approx0.28\\ \text{gap}&=82.3-81.5=0.8\\ \text{normal approximation}&=0.8\pm1.96\times0.28\approx0.8\pm0.55\\ &=\text{from }0.25\text{ to }1.35 \end{aligned}

Mnożnik 1,96 traktuje oszacowany rozrzut jako znany. Przy zaledwie czterech przebiegach na model użyj rozkładu t Studenta, by uwzględnić niepewność rozrzutu. Przy powyższych założeniach liczba stopni swobody wynosi 4+4−2=64+4-2=6 (osiem przebiegów minus dwie oszacowane średnie). scipy.stats.t.ppf(0.975, 6) daje około 2,447 zamiast 1,96; 0,975 zostawia 2,5% poza każdym końcem 95-procentowego przedziału. Jeśli założenie równych wariancji jest nieodpowiednie, użyj przedziału Welcha, w którym stopnie swobody liczy się inaczej.

Rozważmy teraz drugi sposób odczytania podpisu: 0,4 jest już błędem standardowym każdej średniej, oszacowanym z tych czterech przebiegów. Nic nie dzieli się przez 4\sqrt4, a błąd standardowy różnicy wynosi około 0,566. Mnożnik t nadal jest potrzebny. Oba odczyty dają:

0.4 a standard deviation, t interval:0.8±2.4470.22+0.22≈0.8±0.69from 0.11 to 1.490.4 a standard error, t interval:0.8±2.4470.42+0.42≈0.8±1.38from −0.58 to 2.18\begin{aligned} \text{0.4 a standard deviation, t interval:}&\quad0.8\pm2.447\sqrt{0.2^2+0.2^2}\approx0.8\pm0.69\\ &\quad\text{from }0.11\text{ to }1.49\\ \text{0.4 a standard error, t interval:}&\quad0.8\pm2.447\sqrt{0.4^2+0.4^2}\approx0.8\pm1.38\\ &\quad\text{from }-0.58\text{ to }2.18 \end{aligned}

Rysunek porównuje początkowe przybliżenie normalne z dwoma przedziałami t:

Trzy przedziały dla tej samej różnicy 0,8, przy założeniu czterech niezależnych, w przybliżeniu normalnych przebiegów na model i równych wariancji populacji. Gdy 0,4 jest odchyleniem standardowym, przybliżenie normalne daje od 0,25 do 1,35, a przedział t od 0,11 do 1,49. Gdy 0,4 jest oszacowanym błędem standardowym, przedział t daje od minus 0,58 do 2,18 i zawiera zero.Trzy przedziały dla tej samej różnicy 0,8, przy założeniu czterech niezależnych, w przybliżeniu normalnych przebiegów na model i równych wariancji populacji. Gdy 0,4 jest odchyleniem standardowym, przybliżenie normalne daje od 0,25 do 1,35, a przedział t od 0,11 do 1,49. Gdy 0,4 jest oszacowanym błędem standardowym, przedział t daje od minus 0,58 do 2,18 i zawiera zero.

Gdy 0,4 jest odchyleniem standardowym, przedział t wyklucza zero: przy tych założeniach wyniki wspierają dodatnią różnicę. Gdy 0,4 jest oszacowanym błędem standardowym, przedział zawiera zero, więc wyniki nie rozstrzygają, który model ma wyższy średni wynik.

Entropia krzyżowa i dywergencja KL

W trakcie treningu model potrzebuje liczbowej straty (loss), która mierzy, jak dobrze jego przewidywane prawdopodobieństwa zgadzają się z celem treningowym. Algorytm treningowy zmienia parametry modelu, by tę stratę zmniejszyć. Entropia krzyżowa dostarcza taką stratę dla przykładów z etykietami lub dla prawdopodobieństw modelu-nauczyciela. Dywergencja Kullbacka–Leiblera (KL) mierzy rozbieżność między dwoma rozkładami. Artykuły używają jej, by wytrenować ucznia naśladującego nauczyciela albo by karać odchylenia od ustalonego modelu referencyjnego.

Tutaj wyniki są dyskretne, na przykład tokeny lub klasy. Rozkład docelowy zapisz jako pp, a przewidywany przez model rozkład po tych samych wynikach jako qq. Zacznij od jednego zaobserwowanego wyniku ii: gdy model przypisał mu prawdopodobieństwo qiq_i, jego strata wynosi −log⁡qi-\log q_i. Jest to 0 dla qi=1q_i=1, około 0,69 dla qi=0.5q_i=0.5, około 2,3 dla qi=0.1q_i=0.1 i nieskończoność dla qi=0q_i=0.

Entropia krzyżowa uśrednia tę stratę po wynikach losowanych z celu:

H(p,q)=Ei∼p[−log⁡qi]=−∑ipilog⁡qi.H(p,q)=\mathbb E_{i\sim p}[-\log q_i]=-\sum_i p_i\log q_i.

Przy etykiecie one-hot pp, która wynosi 1 dla poprawnej klasy yy i 0 dla pozostałych, liczy się tylko poprawna klasa, a H(p,q)=−log⁡qyH(p,q)=-\log q_y: zwykła strata klasyfikacji. nn.CrossEntropyLoss z PyTorch oblicza ją z surowych wyników modelu, zwanych logitami, i wewnętrznie stosuje log-softmax; jej wejściem nie jest wektor prawdopodobieństw qq. Gdy jako pp weźmiemy miękki rozkład modelu-nauczyciela, każda klasa liczy się proporcjonalnie do prawdopodobieństwa nauczyciela. Klasyczna destylacja w ten sposób trenuje mały model na prawdopodobieństwach dużego. Dla celu p=(0.9,0.1)p=(0.9,0.1) dwa modele mają takie entropie krzyżowe H(p,q)H(p,q):

q=(0.5,0.5):−0.9log⁡0.5−0.1log⁡0.5≈0.693q=(0.9,0.1):−0.9log⁡0.9−0.1log⁡0.1≈0.095+0.230=0.325\begin{aligned} q=(0.5,0.5):&\quad -0.9\log0.5-0.1\log0.5\approx0.693\\ q=(0.9,0.1):&\quad -0.9\log0.9-0.1\log0.1\approx0.095+0.230=0.325 \end{aligned}

Drugi model odpowiada celowi i żaden model nie może być lepszy. To minimum, tu 0,325, to H(p)=−∑ipilog⁡piH(p)=-\sum_ip_i\log p_i, czyli entropia rozkładu pp. Wynosi ona 0 tylko dla celu one-hot: gdy sam cel jest niepewny, pozostaje strata, której żaden model nie usunie.

Dywergencja KL odejmuje to minimum i zostawia tylko stratę wynikającą z tego, że qq różni się od pp. Zapisuje się ją z podwójną kreską ∥\Vert, która jedynie oddziela dwa argumenty; nie jest to ani kreska prawdopodobieństwa warunkowego ∣\mid z sekcji Prawdopodobieństwo warunkowe i prawdopodobieństwo tekstu, ani kreski długości ∥x∥\Vert x\Vert z wektorów i macierzy. Artykuły używają jej zamiast przecinka, by zaznaczyć, że kolejność ma znaczenie: uśrednianie przebiega po wynikach losowanych z pierwszego argumentu.

DKL(p ∥ q)=H(p,q)−H(p)=∑ipilog⁡piqi=Ei∼p[log⁡piqi].D_{\mathrm{KL}}(p\,\Vert\,q)=H(p,q)-H(p)=\sum_i p_i\log\frac{p_i}{q_i}=\mathbb E_{i\sim p}\Bigl[\log\frac{p_i}{q_i}\Bigr].

Dla pierwszego modelu powyżej 0.693−0.325≈0.370.693-0.325\approx0.37. KL wynosi 0, gdy oba rozkłady się zgadzają, a poza tym jest dodatnia.

Kolejność zmienia to, które rozbieżności są karane. Składnik z pi>0p_i>0 i qi=0q_i=0 jest nieskończony, więc DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) karze qq za przypisanie zerowego prawdopodobieństwa czemukolwiek, co pp może wytworzyć. Wyniki z pi=0p_i=0 nic nie dodają (z konwencji 0log⁡0=00\log0=0), więc nie dają bezpośredniej kary, nawet jeśli qi>0q_i>0. Zamiana argumentów daje DKL(q∥p)D_{\mathrm{KL}}(q\Vert p), która jest nieskończona wszędzie tam, gdzie qi>0q_i>0 i pi=0p_i=0. Wyniki z qi=0q_i=0 nic nie dodają, nawet jeśli pi>0p_i>0. Gdy pp jest celem, DKL(p∥q)D_{\mathrm{KL}}(p\Vert q) nazywa się KL w przód (forward), a DKL(q∥p)D_{\mathrm{KL}}(q\Vert p) KL wstecz (reverse).

Dla p=(0.5,0.5)p=(0.5,0.5) i q=(1,0)q=(1,0) KL w przód jest nieskończona, bo qq pomija wynik, który wytwarza pp, podczas gdy KL wstecz wynosi tylko 1×log⁡(1/0.5)+0=log⁡21\times\log(1/0.5)+0=\log2: wynik pominięty przez qq nic nie dodaje. Dla p=(0.9,0.1)p=(0.9,0.1) i q=(0.5,0.5)q=(0.5,0.5) KL w przód to 0,37 znalezione wyżej, tu obliczone składnik po składniku, a KL wstecz jest inna:

DKL(p∥q)=0.9log⁡0.90.5+0.1log⁡0.10.5≈0.53−0.16=0.37DKL(q∥p)=0.5log⁡0.50.9+0.5log⁡0.50.1≈−0.29+0.80=0.51\begin{aligned} D_{\mathrm{KL}}(p\Vert q)&=0.9\log\tfrac{0.9}{0.5}+0.1\log\tfrac{0.1}{0.5}\approx0.53-0.16=0.37\\ D_{\mathrm{KL}}(q\Vert p)&=0.5\log\tfrac{0.5}{0.9}+0.5\log\tfrac{0.5}{0.1}\approx-0.29+0.80=0.51 \end{aligned}

Ta asymetria jest powodem, dla którego KL nazywa się dywergencją, a nie odległością.

Ponieważ H(p,q)=H(p)+DKL(p∥q)H(p,q)=H(p)+D_{\mathrm{KL}}(p\Vert q), a entropia H(p)H(p) ustalonego nauczyciela nie zależy od ucznia, entropia krzyżowa względem ustalonego nauczyciela daje uczniowi te same gradienty co DKL(p∥q)D_{\mathrm{KL}}(p\Vert q). Zmiana parametru ucznia zmienia obie straty o tyle samo, więc ich pochodne używane w treningu są równe; Gradienty i optymalizacja wyjaśniają to obliczenie. Dzięki temu kod klasyfikacji i klasycznej destylacji może używać entropii krzyżowej. Zamiana działa tylko wtedy, gdy nauczyciel jest pierwszy. Gdy pierwszy jest uczeń, DKL(q∥p)=H(q,p)−H(q)D_{\mathrm{KL}}(q\Vert p)=H(q,p)-H(q), a entropia samego ucznia H(q)H(q) zmienia się w trakcie treningu, więc obie wielkości nie dają już tych samych gradientów.

Wektory i macierze

Równania architektury opisują obliczenia na tablicach liczb. Kształt tablicy mówi, jak ułożone są jej liczby, jakie operacje są dozwolone i co one dają. Wektor to uporządkowana lista liczb. Macierz układa liczby w wiersze i kolumny. W kodzie ML tensor to ogólne określenie takich tablic liczbowych, także tych z więcej niż dwiema osiami. Oś to wymiar, wzdłuż którego indeksuje się tablicę: macierz ma oś wierszy i oś kolumn.

Stan ukryty tokena to wektor liczb obliczony wewnątrz modelu, by reprezentować ten token. Przypuśćmy, że przetwarzamy razem batch BB sekwencji, każda z TT pozycjami tokenów, a każdy stan ukryty zawiera dd liczb. Tablica stanów ukrytych ma kształt [B, T, d], który artykuły zapisują też jako B×T×dB\times T\times d. Jej trzy osie wybierają sekwencję, pozycję tokena i liczbę w wektorze tego tokena. Na przykład [2, 3, 4] zawiera dwie sekwencje, po trzy wektory tokenów w każdej i po cztery liczby w wektorze: łącznie 24 liczby. Tutaj dd to szerokość wektora. Kształt wymienia trzy rozmiary; ich pomnożenie daje liczbę elementów.

Artykuły często zapisują kształty jako przynależność do zbioru: a∈Rda\in\mathbb R^d oznacza, że aa jest wektorem dd liczb rzeczywistych, a A∈Rm×nA\in\mathbb R^{m\times n} oznacza, że AA jest macierzą o mm wierszach i nn kolumnach. Pogrubione litery czasem oznaczają wektory lub tensory, ale o kształcie rozstrzyga definicja z artykułu.

W tabeli poniżej aa i bb to wektory kolumnowe: ich liczby są ułożone pionowo. Indeks górny ⊤\top oznacza transpozycję: zamianę wierszy z kolumnami. Zatem a⊤a^\top to wiersz zawierający te same liczby co kolumna aa. Wielkie AA i BB nazywają tu macierze; BB nie oznacza już rozmiaru batcha.

WyrażenieUżywane wartościCo robi operacjaWynik
a⊤ba^\top b — iloczyn skalarnyDwa wektory kolumnowe, każdy z dd elementamiPomnóż odpowiadające sobie elementy, potem dodaj iloczyny: ∑iaibi\sum_i a_i b_iJedna liczba
ab⊤ab^\top — iloczyn zewnętrznyKolumna aa z mm elementami i kolumna bb z nn elementamiPomnóż każdy element aa przez każdy element bbMacierz m×nm\times n; element (i,j)(i,j) to aibja_i b_j
ABAB — iloczyn macierzyAA z mm wierszami i kk kolumnami; BB z kk wierszami i nn kolumnamiDla elementu (i,j)(i,j) pomnóż odpowiadające sobie liczby w wierszu ii macierzy AA i kolumnie jj macierzy BB, potem dodajMacierz m×nm\times n; liczba kolumn AA musi być równa liczbie wierszy BB
A⊙BA\odot B — iloczyn po elementachDwie tablice o tym samym kształciePomnóż elementy na odpowiadających sobie pozycjach, bez dodawaniaTablica o tym samym kształcie
[a;b][a;b] — konkatenacjaKolumny aa i bb z mm i nn elementamiUmieść elementy bb za elementami aaJedna kolumna z m+nm+n elementami; sprawdź konwencję artykułu co do osi łączenia

Dla konkretnego porównania weźmy a=(12)a=\begin{pmatrix}1\\2\end{pmatrix} i b=(34)b=\begin{pmatrix}3\\4\end{pmatrix}. Przesunięcie transpozycji zmienia zarówno obliczenie, jak i wynik:

a⊤b=1×3+2×4=11ab⊤=(1×31×42×32×4)=(3468).\begin{aligned} a^\top b&=1\times3+2\times4=11\\ ab^\top&=\begin{pmatrix}1\times3&1\times4\\2\times3&2\times4\end{pmatrix}=\begin{pmatrix}3&4\\6&8\end{pmatrix}. \end{aligned}

Iloczyn skalarny daje jeden wynik, jak w porównaniu zapytania z kluczem w uwadze. Iloczyn zewnętrzny zachowuje osobną wartość dla każdej pary elementów; aktualizacja w Gated DeltaNet używa go do zbudowania z dwóch wektorów aktualizacji macierzy.

Iloczyn macierzy można pogrupować inaczej, (AB)C=A(BC)(AB)C=A(BC), ale nie można zmieniać kolejności; wyprowadzenie MLA używa przegrupowania, by uniknąć odbudowywania kluczy. NumPy zapisuje mnożenie macierzy jako @, a iloczyn po elementach jako *. Artykuły nie dziedziczą reguł broadcastingu z NumPy: dodanie wektora do macierzy wymaga podanej osi. Artykuły różnią się też tym, czy wektor jest wierszem, czy kolumną: uwaga układa tokeny jako wiersze QQ, podczas gdy MLA, Gated DeltaNet i LoRA zapisują WhWh z wektorami kolumnowymi, a nn.Linear w PyTorch oblicza x @ W.T na wierszach.

Równanie architektury może też opisywać rozmiar wektora, ograniczać dozwolone macierze albo przestawiać iloczyn:

NotacjaZnaczenie
∥x∥2=∑ixi2\Vert x\Vert_2=\sqrt{\sum_i x_i^2}Długość euklidesowa; ∥x∥2\Vert x\Vert^2, bez pierwiastka, pojawia się w stracie DDPM
∥x∥1=∑i∣xi∣\Vert x\Vert_1=\sum_i\vert x_i\vertSuma wartości bezwzględnych
∥A∥2\Vert A\Vert_2Norma spektralna: największy czynnik, przez który AA zwiększa długość wektora; mHC utrzymuje ją na poziomie co najwyżej 1
rank⁡(A)\operatorname{rank}(A)Liczba niezależnych kolumn; aktualizacja LoRA ma rząd co najwyżej rr
det⁡A\det AWyznacznik: ∣det⁡A∣\vert\det A\vert to czynnik, przez który AA skaluje objętość, a znak zapisuje, czy AA odwraca orientację; używa go przykład zamiany zmiennych w Dodatku B tego artykułu
A≥0A\geq0Każdy element jest nieujemny, jak w mHC; A⪰0A\succeq0 to inny warunek, półdodatnia określoność: x⊤Ax≥0x^\top Ax\geq0 dla każdego xx
II, 1n\mathbf 1_nMacierz jednostkowa (1 na przekątnej, 0 poza nią, więc Ix=xIx=x); wektor nn jedynek
(AB)⊤=B⊤A⊤(AB)^\top=B^\top A^\topTranspozycja iloczynu odwraca kolejność; korzystają z niej sekcje RoPE i MLA w części 2

Gradienty i optymalizacja

Trening używa pochodnych, by zdecydować, jak zmienić parametry modelu. Niech L\mathcal L będzie jedną skalarną stratą, a θ\theta wektorem wszystkich parametrów; θi\theta_i to jeden element tego wektora.

Pochodna cząstkowa ∂L/∂θi\partial\mathcal L/\partial\theta_i to jedna liczba, obliczona dla bieżących wartości parametrów. Mierzy tempo zmiany straty, gdy zmienia się tylko θi\theta_i, a pozostałe parametry są stałe. Czytaj ją jako „pochodna cząstkowa straty względem parametru θi\theta_i”.

Gradient ∇θL\nabla_\theta\mathcal L zbiera te liczby dla wszystkich parametrów w jeden wektor. Jego ii-ty element to ∂L/∂θi\partial\mathcal L/\partial\theta_i. Symbol ∇\nabla nazywa się nabla; tu znaczy „weź gradient”. Przy jednym parametrze gradient ma jeden element równy zwykłej pochodnej.

Na przykład weźmy L(θ1,θ2)=θ12+3θ22\mathcal L(\theta_1,\theta_2)=\theta_1^2+3\theta_2^2. Dla θ1=2\theta_1=2 i θ2=1\theta_2=1:

∂L∂θ1=2θ1=4∂L∂θ2=6θ2=6∇θL=(46).\begin{aligned} \frac{\partial\mathcal L}{\partial\theta_1}&=2\theta_1=4\\ \frac{\partial\mathcal L}{\partial\theta_2}&=6\theta_2=6\\ \nabla_\theta\mathcal L&=\begin{pmatrix}4\\6\end{pmatrix}. \end{aligned}

Pierwsza pochodna cząstkowa, 4, oznacza, że zwiększenie θ1\theta_1 o 0,01 podnosi stratę o około 0,04, gdy θ2\theta_2 pozostaje stałe. Gradient zawiera tę informację dla obu parametrów. Spadek gradientu (gradient descent) odejmuje pochodną każdego parametru pomnożoną przez dodatnią szybkość uczenia (learning rate) η\eta, która kontroluje wielkość kroku:

θ←θ−η∇θL,η>0.\theta\leftarrow\theta-\eta\nabla_\theta\mathcal L,\qquad\eta>0.

Dla η=0.1\eta=0.1 przykład zmienia się z (2,1)(2,1) na (1.6,0.4)(1.6,0.4), a strata spada z 7 do 3,04. Dla różniczkowalnej straty z niezerowym gradientem dostatecznie mały krok zmniejsza stratę. Zerowy gradient nie daje aktualizacji.

Indeks dolny przy ∇\nabla mówi, co się zmienia. ∇θlog⁡pθ(x)\nabla_\theta\log p_\theta(x) zmienia parametry; ∇xlog⁡pθ(x)\nabla_x\log p_\theta(x) zmienia wejście, a artykuły o dyfuzji nazywają to score, co nie ma nic wspólnego z wynikiem w benchmarku.

Jakobian zapisuje pochodne dla wielu wyjść. Warstwa sieci neuronowej może produkować wiele liczb, takich jak składowe stanu ukrytego tokena. Aby opisać, jak każde wyjście reaguje na każde wejście, zbierz pochodne cząstkowe w macierz zwaną jakobianem (Jacobian). Dla y=f(x)y=f(x) z nn liczbami wejściowymi i mm liczbami wyjściowymi jej kształt to m×nm\times n: wiersze odpowiadają wyjściom, kolumny wejściom, a element Jij=∂yi/∂xjJ_{ij}=\partial y_i/\partial x_j mierzy, jak zmienia się wyjście ii, gdy zmienia się wejście jj.

Na przykład niech funkcja przyjmuje dwie liczby i zwraca y1=x1+2x2y_1=x_1+2x_2 oraz y2=3x1−x2y_2=3x_1-x_2. Jej jakobian to

J=(∂y1/∂x1∂y1/∂x2∂y2/∂x1∂y2/∂x2)=(123−1).\begin{aligned} J&=\begin{pmatrix} \partial y_1/\partial x_1 & \partial y_1/\partial x_2\\ \partial y_2/\partial x_1 & \partial y_2/\partial x_2 \end{pmatrix}\\ &=\begin{pmatrix}1&2\\3&-1\end{pmatrix}. \end{aligned}

Druga kolumna mówi, że zwiększenie x2x_2 o 0,1 przy stałym x1x_1 zwiększa y1y_1 o 0,2 i zmniejsza y2y_2 o 0,1. Ten przykład jest liniowy, więc jego jakobian jest stały. Dla funkcji nieliniowej elementy mogą zależeć od bieżącego wejścia i opisują małe zmiany lokalnie. Przy tylko jednym wyjściu skalarnym jakobian ma jeden wiersz: te same pochodne co gradient, transponowane w naszej konwencji wektorów kolumnowych. Ogólne definicje podaje Deep Learning, §4.3.

Propagacja wsteczna (backpropagation) używa tych pochodnych do obliczenia gradientu straty przez kolejne warstwy. Przykład zamiany zmiennych w Dodatku B tego artykułu korzysta z innej własności: wartość bezwzględna wyznacznika kwadratowego jakobianu daje lokalny współczynnik skalowania objętości, który jest potrzebny do skorygowania gęstości prawdopodobieństwa.

W treningu pochodne opisują zmiany lokalne; cel optymalizacji mówi, co aktualizacje mają minimalizować lub maksymalizować. Artykuły odróżniają najlepszą wartość celu od parametrów, które ją osiągają: min⁡θf(θ)\min_\theta f(\theta) to najmniejsza wartość ff, a arg min⁡θf(θ)\operatorname*{arg\,min}_\theta f(\theta) daje wartości parametrów, które ją osiągają. Dla f(θ)=(θ−3)2f(\theta)=(\theta-3)^2 minimum wynosi 0, a argmin to 3. Argmin określa pożądany wynik, ale pozostawia otwarty algorytm aktualizacji.

Na przykład MiniLLM zapisuje swój cel jako θ=arg min⁡θDKL(qθ∥p)\theta=\operatorname*{arg\,min}_\theta D_{\mathrm{KL}}(q_\theta\Vert p) (równanie 1), gdzie qθq_\theta to model ucznia, a pp nauczyciel, od którego się uczy. Sekcja 2.2 wyprowadza następnie gradient i modyfikuje go, by trening był stabilniejszy; równanie (7) to gradient używany do aktualizacji. Przykład destylacji on-policy wyjaśnia te zmiany. Samo przeczytanie argmin by je pominęło.

Stop-gradient, sg⁡(x)\operatorname{sg}(x), przekazuje xx do przodu bez zmian, ale blokuje przechodzące przez niego gradienty, jak .detach() w PyTorch. Dwa wyrażenia o tej samej wartości w przebiegu w przód mogą trenować się inaczej, jeśli jedno z nich jest odłączone. W przykładzie GRPO Hugging Face TRL traktuje logarytm prawdopodobieństwa starego modelu jako stały. W skrócie destylacji omawianym przez DeepSeek-V4 odłączony logarytm ilorazu nauczyciel–uczeń dostarcza stałej wagi dla aktualizacji.

Zbiory i ograniczenia

Ograniczenie (constraint) mówi, jakie wartości są dozwolone. Artykuły często wyrażają ograniczenia za pomocą zbiorów: kolekcji różnych elementów zapisywanych w klamrach, takich jak {1,2,3}\{1,2,3\}. Kolejność nie ma znaczenia, więc {3,1,2}\{3,1,2\} nazywa ten sam zbiór. Powtórzone elementy liczą się tylko raz. Dla porównania nawiasy okrągłe w wektorze takim jak (1,2,3)(1,2,3) opisują uporządkowaną listę: (3,1,2)(3,1,2) to inny wektor.

Gdy artykuł zdefiniuje zbiór, może sprawdzać przynależność, łączyć zbiory, zliczać ich elementy albo stawiać na nich warunek. Weźmy A={1,2,3}A=\{1,2,3\} i B={3,4}B=\{3,4\}:

NotacjaZnaczeniePrzykład i jak go czytać
x∈Ax\in APrzynależność: xx należy do AA2∈A2\in A: 2 jest elementem AA
A∪BA\cup BSuma: weź każdy element któregokolwiek ze zbiorówA∪B={1,2,3,4}A\cup B=\{1,2,3,4\}; 3 wchodzi tylko raz
A∩BA\cap BIloczyn (część wspólna): zostaw tylko elementy wspólne obu zbiorówA∩B={3}A\cap B=\{3\}
∣A∣\vert A\vertLiczba różnych elementów∣A∣=3\vert A\vert=3
∀\forall„Dla każdego”: warunek musi zachodzić dla wszystkich wymienionych elementów∀x∈A: x>0\forall x\in A:\ x>0: każdy element AA jest dodatni
∃\exists„Istnieje”: co najmniej jeden element musi spełniać warunek∃x∈A: x>2\exists x\in A:\ x>2: AA ma element większy niż 2, mianowicie 3

Notacja kształtów z sekcji Wektory i macierze też nazywa zbiory: Rd\mathbb R^d to zbiór wszystkich wektorów dd liczb rzeczywistych, a Rn×d\mathbb R^{n\times d} zbiór wszystkich macierzy rzeczywistych o nn wierszach i dd kolumnach. Zatem Q∈Rn×dkQ\in\mathbb R^{n\times d_k} określa, jaki kształt musi mieć QQ.

Notacja budowania zbioru opisuje zbiór warunkiem: {x∈S∣condition}\{x\in S\mid\text{condition}\} czyta się „elementy SS, które spełniają warunek”, jak zbiór składany (set comprehension) w Pythonie {x for x in S if condition(x)}. Kreska oznacza „takie, że”, a nie prawdopodobieństwo warunkowe; niektóre artykuły używają zamiast niej dwukropka. Przykłady w tej serii to dozwolone macierze w mHC, wybrani eksperci w MoE i wybrane tokeny w uwadze rzadkiej.

DAPO, metoda treningu, która filtruje grupy wygenerowanych odpowiedzi, zachowuje pytanie tylko wtedy, gdy część odpowiedzi jest poprawna, a część błędna. Dla GG wylosowanych odpowiedzi o1,…,oGo_1,\ldots,o_G i odpowiedzi referencyjnej aa zbiór indeksów poprawnych odpowiedzi zapisujemy jako

C={i∈{1,…,G}∣is_equivalent⁡(a,oi)}.C=\{i\in\{1,\ldots,G\}\mid\operatorname{is\_equivalent}(a,o_i)\}.

Filtr to 0<∣C∣<G0<\vert C\vert<G. Użycie indeksów sprawia, że zliczanie jest jawne: dwie próbki o identycznym tekście nadal liczą się jako dwie odpowiedzi. Artykuł DAPO zapisuje natomiast zbiór po odpowiedziach oio_i; czytany dosłownie jako zbiór tekstów, ten zapis liczy dwie identyczne odpowiedzi raz.

Ćwiczenia

  1. Kształty. QQ ma kształt 4×84\times8, KK ma 6×86\times8, a VV ma 6×36\times3. Jakie kształty mają wyniki (scores) i wyjście? Po której osi przebiega softmax?
  2. Softmax. Oblicz softmax dla (0,log⁡4)(0,\log4). Czy dodanie 100 do obu wejść zmienia wynik?
  3. Średnie. Jedna odpowiedź ma jeden token ze stratą 4; druga ma trzy tokeny ze stratą 0. Oblicz średnią na token i średnią na odpowiedź.
  4. Warunkowanie. Spośród 200 odpowiedzi 120 jest poprawnych, 80 przechodzi walidację formatu, a 60 spełnia oba warunki. Znajdź P(correct∣valid)P(\text{correct}\mid\text{valid}) i P(valid∣correct)P(\text{valid}\mid\text{correct}).
  5. KL. Dla nauczyciela p=(1,0)p=(1,0) i ucznia q=(0.5,0.5)q=(0.5,0.5) oblicz oba kierunki KL.
  6. Zbiory. DAPO zachowuje pytanie tylko wtedy, gdy 0<∣C∣<G0<\vert C\vert<G, gdzie CC zawiera indeksy poprawnych odpowiedzi spośród GG próbek. Dla G=4G=4: czy zachowa pytanie, którego odpowiedzi dostają wyniki (1,1,1,1)(1,1,1,1)? A takie, którego odpowiedzi dostają (1,0,1,1)(1,0,1,1)? Czy pierwsza odpowiedź się zmieni, jeśli wszystkie cztery próbki zawierają identyczny poprawny tekst?

Odpowiedzi:

  1. Wyniki mają kształt 4×64\times6, a wyjście 4×34\times3. Softmax przebiega po sześciu kluczach w wierszu każdego zapytania.

  2. (1/5,4/5)(1/5,4/5). Dodanie tej samej liczby do każdego wejścia nie zmienia softmaxu, ale bezpośrednie obliczenie e100e^{100} przepełnia 32-bitowe liczby zmiennoprzecinkowe.

  3. Dwie średnie:

    per token:(4+0+0+0)/4=1per answer:(4/1+0/3)/2=(4+0)/2=2\begin{aligned} \text{per token:}&\quad(4+0+0+0)/4=1\\ \text{per answer:}&\quad(4/1+0/3)/2=(4+0)/2=2 \end{aligned}
  4. 60/80=0.7560/80=0.75 i 60/120=0.560/120=0.5.

  5. DKL(p∥q)=log⁡2≈0.69D_{\mathrm{KL}}(p\Vert q)=\log2\approx0.69, a DKL(q∥p)=∞D_{\mathrm{KL}}(q\Vert p)=\infty, ponieważ uczeń przypisuje prawdopodobieństwo wynikowi, który nauczyciel wyklucza.

  6. Nie: C={1,2,3,4}C=\{1,2,3,4\} ma cztery elementy, czyli tyle, ile wynosi GG. Tak: C={1,3,4}C=\{1,3,4\} ma trzy elementy, między 0 a 4. Identyczny tekst nie zmienia pierwszej odpowiedzi: to cztery osobne próbki, więc ich cztery indeksy nadal się liczą.

Dodatek A. Litery greckie

Role są typowymi przykładami; każdy artykuł nadal sam definiuje, co oznaczają jego symbole.

LiteraNazwaTypowe role w artykułach o ML
α\alphaalfaWaga mieszania lub skala; zanik (Gated DeltaNet); harmonogram szumu (DDPM)
β\betabetaSiła kary (DPO, GRPO); siła zapisu (Gated DeltaNet); harmonogram szumu (DDPM)
γ\gammagammaWspółczynnik dyskontowania w RL; rozmiar kroku (aktualizacja obciążenia w DeepSeek-V3)
δ,Δ\delta,\DeltadeltaRóżnica lub zmiana
ϵ,ε\epsilon,\varepsilonepsilonSzum (DDPM); zakres obcinania (GRPO); mały stabilizator
η\etaetaSzybkość uczenia
θ,Θ\theta,\ThetathetaParametry modelu; kąty obrotu w RoPE
λ,Λ\lambda,\LambdalambdaWaga regularyzacji; wartość własna
μ\mumiŚrednia; liczba kroków gradientu na batch w Algorithm 1 z DeepSeekMath
π,Π\pi,\PipiPolityka; ∏\prod to operator iloczynu
ρ\rhoroIloraz prawdopodobieństw, jak w sekcji GRPO w części 3; korelacja
σ,Σ\sigma,\SigmasigmaSigmoida (DPO); odchylenie standardowe; kowariancja; ∑\sum to operator sumy
τ\tautauTemperatura; próg; trajektoria w RL
ϕ,φ,Φ\phi,\varphi,\PhifiParametry drugiej sieci, takiej jak koder; cechy; kąt
ψ,Ψ\psi,\PsipsiParametry innej sieci, takiej jak model wartości VψV_\psi w PPO z DeepSeekMath
ω,Ω\omega,\OmegaomegaCzęstotliwość; Ω\Omega to także dolne ograniczenie w teorii złożoności lub zbiór wyników

Warianty takie jak ϕ/φ\phi/\varphi i ϵ/ε\epsilon/\varepsilon to zwykle ta sama litera w innym kroju, ale artykuł może używać obu do różnych zmiennych.

Dodatek B. Inne rodziny równań

Postacie równań, których ta seria nie rozpracowuje, razem z definicjami, których każda wymaga:

Selektywne modele przestrzeni stanów. Model przestrzeni stanów przetwarza sekwencję, aktualizując w każdym kroku zapisany stan. Aktualizacja w postaci ht=Aˉtht−1+Bˉtxth_t=\bar A_th_{t-1}+\bar B_tx_t, yt=Cthty_t=C_th_t łączy poprzedni stan z bieżącym wejściem, a potem oblicza wynik. Tu xtx_t to bieżące wejście, hth_t zapisany stan, a yty_t wynik. Macierze Aˉt\bar A_t, Bˉt\bar B_t i CtC_t odpowiednio przekształcają poprzedni stan, dodają wkład wejścia i wytwarzają wynik. Kreski nad literami oznaczają parametry przekształcone z modelu ciągłego w czasie na kroki dyskretne; nie oznaczają średnich. W Mamba parametry aktualizacji zależą od bieżącego wejścia, co oznacza słowo „selektywny”.

Stochastyczne równania różniczkowe. dx/dt=f(x,t)dx/dt=f(x,t) opisuje, jak stan xx zmienia się z czasem tt: ff to jego tempo zmian. Stochastyczne równanie różniczkowe (SDE) dodaje zmiany losowe, dXt=f(Xt,t) dt+g(Xt,t) dWtdX_t=f(X_t,t)\,dt+g(X_t,t)\,dW_t. Tu ff opisuje zmianę deterministyczną, gg ustala skalę szumu, a dWtdW_t jest przyrostem ruchów Browna. Aby przybliżyć je w kodzie, metoda Eulera–Maruyamy używa małego kroku czasowego Δt\Delta t i zastępuje dWtdW_t szumem Gaussa o wariancji Δt\Delta t. Sekcja 5.1 książki Tianhua Chena The Little Book of Generative AI Foundations podaje taką aktualizację; §6.4 tej samej książki używa SDE do opisu modeli dyfuzyjnych.

Zamiana zmiennych. Przekształcenie zmiennej losowej zmienia jej gęstość zgodnie z tym, jak przekształcenie zmienia lokalną objętość. Załóżmy, że y=f(x)y=f(x) odwzorowuje między przestrzeniami o tym samym wymiarze, a zarówno ff, jak i jej odwrotność f−1f^{-1} są różniczkowalne. Gęstości przed przekształceniem i po nim, pXp_X i pYp_Y, spełniają pY(y)=pX(f−1(y)) ∣det⁡Jf−1(y)∣p_Y(y)=p_X\bigl(f^{-1}(y)\bigr)\,\bigl\vert\det J_{f^{-1}}(y)\bigr\vert. Odwrotność f−1f^{-1} odtwarza xx z yy. Jej jakobian Jf−1J_{f^{-1}} jest kwadratową macierzą pierwszych pochodnych; wartość bezwzględna jego wyznacznika koryguje lokalną zmianę objętości. Na przykład jeśli y=2xy=2x w jednym wymiarze, gęstość przyjmuje postać pY(y)=pX(y/2)/2p_Y(y)=p_X(y/2)/2: podwojenie szerokości zmniejsza gęstość o połowę. Przepływy normalizujące (normalizing flows) używają takich odwracalnych przekształceń do modelowania gęstości; książka Tianhua Chena, §7.1, wyjaśnia tę metodę.

Cele min–max. W generatywnych sieciach przeciwstawnych (GAN) generator GG tworzy przykłady, a dyskryminator DD próbuje odróżnić je od prawdziwych danych. Cel V(D,G)V(D,G) mierzy sukces dyskryminatora: DD go maksymalizuje, a GG minimalizuje. Cel min⁡Gmax⁡DV(D,G)\min_G\max_DV(D,G) (równanie 1) mówi: dla każdego możliwego generatora rozważ najlepszy przeciw niemu dyskryminator, a potem wybierz generator o najmniejszej wynikowej wartości celu. Trening nie rozwiązuje tej wewnętrznej maksymalizacji dokładnie. Algorithm 1 w artykule na przemian wykonuje kk kroków wznoszenia gradientu dla DD i jeden krok spadku gradientu dla GG; w jego eksperymentach k=1k=1.

Sympleks prawdopodobieństwa. Wektor prawdopodobieństw ma elementy nieujemne, które sumują się do 1. Zbiór wszystkich takich wektorów o KK elementach nazywa się sympleksem prawdopodobieństwa (probability simplex) i zapisuje ΔK−1={p∈RK∣pi≥0, ∑ipi=1}\Delta^{K-1}=\{p\in\mathbb R^K\mid p_i\geq0,\ \sum_ip_i=1\}. Należy do niego każdy wynik softmaxu. Tu Δ\Delta nazywa zbiór, a indeks górny K−1K-1 to jego wymiar, a nie potęga: gdy wybrano K−1K-1 prawdopodobieństw, ostatnie musi dopełnić sumę do 1. Przy dwóch możliwościach każdy rozkład ma postać (a,1−a)(a,1-a) dla 0≤a≤10\leq a\leq1, więc swobodna jest tylko jedna liczba.

Normalizacja. Normalizacja przeskalowuje wartości względem średniej i rozrzutu wybranej grupy. Częsta postać to x^=(x−μ)/σ2+ϵ\hat x=(x-\mu)/\sqrt{\sigma^2+\epsilon}, gdzie μ\mu to średnia, σ2\sigma^2 wariancja, a ϵ\epsilon mała liczba dodatnia, która zapobiega dzieleniu przez zero. Samo równanie nie mówi, które elementy służą do obliczenia średniej i wariancji. Dla batcha wektorów cech normalizacja batcha (batch normalization) liczy je osobno dla każdej cechy po przykładach. Normalizacja warstwy (layer normalization) w Transformerze liczy je osobno dla każdego tokena po jego cechach. Porównując implementacje, sprawdź określone osie.

Źródła i wersje

Numery sekcji i równań odnoszą się do tu podlinkowanych wersji.

  1. Tianhua Chen. The Little Book of Generative AI Foundations: An Intuitive Mathematical Primer. 2026. Wersja 2; §2.4 i §3.2 omawiają nierówność Jensena i ELBO, §5.1 i §6.4 szum w czasie ciągłym.
  2. Vaswani et al. Attention Is All You Need. 2017. Wersja 7, §3.2.1, równanie (1) i przypis 4.
  3. Dai et al. DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models. 2024. Drobnoziarnista segmentacja ekspertów i liczba kombinacji, §3.1; ablacja, §4.4 i Figure 3.
  4. Shao et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. 2024. Wersja 3, §1.1, §4.1.1, równania (1)–(4) i Algorithm 1.
  5. DeepSeek-AI. DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. 2024. Wersja 5, §2.1.1–2.1.3, równania (9)–(19) i Appendix C.
  6. DeepSeek-AI. DeepSeek-V3 Technical Report. 2024–2025. Wersja 2, §2.1.2, równania (12)–(18).
  7. DeepSeek-AI. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. 2025. Wersja 1: §2.2.1, równania (1)–(3). Wersja 2, 2026: §2.1 i Supplementary A.3.
  8. DeepSeek-AI. DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence. 2026. Wersja 1: §2.2, równania (1)–(8); §5.1.2, równanie (29).
  9. Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. 2023–2024. Wersja 3, §4, równanie (7).
  10. Gu et al. MiniLLM: Knowledge Distillation of Large Language Models. 2023–2024. Wersja 4, §2.1, równanie (1) oraz §2.2, równania (2) i (7).
  11. Yu et al. DAPO: An Open-Source LLM Reinforcement Learning System at Scale. 2025. Wersja 2, §3.2–3.3, równania (11)–(12).
  12. Gu and Dao. Mamba: Linear-Time Sequence Modeling with Selective State Spaces. 2023–2024.
  13. Yang et al. Gated Delta Networks: Improving Mamba2 with Delta Rule. 2024–2025. Wersja 3, §3.1, równanie (10) oraz §3.3–3.4.
  14. Ho, Jain and Abbeel. Denoising Diffusion Probabilistic Models. 2020. Wersja 2, §2, równania (4)–(5); §3.2, równanie (12); §3.4, równanie (14) oraz Algorithms 1–2.
  15. Goodfellow et al. Generative Adversarial Nets. 2014. Równanie (1) i Algorithm 1.
  16. Chen et al. Evaluating Large Language Models Trained on Code. 2021. Wersja 2, §2.1, równanie (1) i Figure 3.
  17. Hugging Face TRL. GRPOTrainer i GRPOConfig przy commicie c6eac19, październik 2026.
  18. Stanford CS229. Probability Theory Review i Linear Algebra Review and Reference.
  19. Dive into Deep Learning. Preliminaries.
  20. Britz, Goldie, Luong and Le. Massive Exploration of Neural Machine Translation Architectures. 2017. Wersja 2, Table 5; cytowane w Attention Is All You Need w porównaniu uwagi iloczynu skalarnego z addytywną.