Embedding to wyszukiwanie, nie funkcja
Pierwsza warstwa po tokenizatorze
Tokenizator przekazuje modelowi identyfikatory całkowite: [256, 1842, 7301, ...]. Pierwszą rzeczą, jaką robi transformer, jest zamiana każdego ID na wektor składający się z d_model liczb zmiennoprzecinkowych. Ten wektor istnieje w przestrzeni d_model-wymiarowej (768 wymiarów dla ANDREA-120M).
Warstwa embeddingów to tabela wyszukiwania, a nie funkcja. Wyobraź sobie ogromną macierz:
shape: (V, d_model)
[BLOCK_TYPE SECTION/STEP]
wiersz 0: [e_0_0, e_0_1, ..., e_0_767]
[BLOCK_TYPE SECTION/STEP]
wiersz 1: [e_1_0, e_1_1, ..., e_1_767]
[BLOCK_TYPE SECTION/STEP]
...
[BLOCK_TYPE SECTION/STEP]
wiersz 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
[BLOCK_TYPE SECTION/STEP]
Token ID i wybiera wiersz i. Bezpośredni dostęp do tablicy. Bez operacji arytmetycznych, bez funkcji aktywacji. Tylko indeks.
Trenowalne liczby zmiennoprzecinkowe
Każdy wpis w tej tabeli zaczyna się jako mała losowa liczba zmiennoprzecinkowa (zazwyczaj losowana z rozkładu normalnego przeskalowanego przez 1/sqrt(d_model)). Propagacja wsteczna aktualizuje każdy wiersz za każdym razem, gdy jego token ID pojawia się w partii. Po treningu podobne tokeny (cat, dog, pet) kończą się podobnymi wektorami; niepowiązane tokeny (cat, Tuesday, xylophone) znajdują się daleko od siebie w przestrzeni wektorowej.
ANDREA-120M Koszt osadzenia tokena
| Ilość | Wartość |
|---|---|
| V | 8,449 |
| d_model | 768 |
| Parametry | 6,488,832 |
W samej tabeli osadzeń tokenów znajduje się około 6,5 mln parametrów, co stanowi ok. 5,4 % całkowitej liczby parametrów modelu ANDREA-120M. Każdy slot słownika otrzymuje te 768 liczb zmiennoprzecinkowych.
Wymiarowanie tabel osadzeń
Iloczyny skalarne mierzą podobieństwo
Wektory jako strzałki
Wektor 768-wymiarowy istnieje w przestrzeni, której ludzie nie są w stanie sobie wyobrazić, ale ta sama algebra działa w dowolnym wymiarze. Dwie kluczowe operacje mają znaczenie dla transformerów:
Długość (magnitude – długość strzałki):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Iloczyn skalarny (współbieżność między dwiema strzałkami):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
Co mówi iloczyn skalarny
Dwie własności, które obowiązują w dowolnym wymiarze:
- u · v = ||u|| × ||v|| × cos(theta), gdzie theta to kąt między nimi.
- Wektory wskazujące ten sam kierunek dają duże dodatnie iloczyny skalarne.
- Wektory wskazujące przeciwne kierunki dają duże ujemne iloczyny skalarne.
- Wektory tworzące kąt prosty dają iloczyn skalarny równy zero.
Iloczyn skalarny = nienormalizowana miara podobieństwa. Dwa wytrenowane osadzenia tokenów dla cat i dog mają wysoki iloczyn skalarny, ponieważ propagacja wsteczna zbliżyła je do siebie (oba przewidują konteksty związane ze zwierzętami domowymi). cat i Tuesday są prawie ortogonalne, ponieważ przewidują różne konteksty.
Dlaczego transformatorowi zależy
Aktywność 5 (grow_a_language_model_attention) buduje mechanizm uwagi z iloczynów skalarnych: wektor zapytania iloczyn skalarny z wektorami kluczy daje wyniki, które wskazują, które poprzednie tokeny mają znaczenie przy przewidywaniu kolejnego. Osadzenia i iloczyny skalarne razem przenoszą każdą interakcję wewnątrz transformatora.
Przewidywanie podobieństwa
ANDREA używa wyuczonych osadzeń pozycyjnych
Problem
Osadzenie tokena informuje model, jakie słowo znajduje się w danej pozycji. Nie informuje modelu, gdzie to słowo się znajduje. Bez informacji o pozycji transformer traktuje the cat sat on a mat i mat a on sat cat the identycznie: ten sam zbiór tokenów, bez sygnału kolejności.
W literaturze dotyczącej transformerów istnieją trzy rozwiązania:
Sinusoidalne (Vaswani 2017). Stała formuła matematyczna oparta na sinusach i cosinusach. Pozycja 0 otrzymuje określony wektor 768-wymiarowy; pozycja 1 otrzymuje inny; nigdy nie jest trenowana, nigdy nie jest aktualizowana. Uogólnia się na dowolną pozycję za pomocą formuły.
RoPE (Rotary Position Embedding). Obraca wektory query i key na podstawie pozycji. Używany w LLaMA, Qwen. Brak dodatkowych parametrów; rotacja wbudowana w mechanizm uwagi.
Learned. Oddzielna tabela embeddingów o kształcie (T, d_model), gdzie T to długość kontekstu. Każdy wiersz jest trenowany przez propagację wsteczną, tak jak embeddingi tokenów.
Wybór ANDREA: Learned
ANDREA dziedziczy podejście learned-position po microGPT, które odziedziczyło je po nanoGPT, które z kolei odziedziczyło je po GPT-2. Uzasadnienie:
- Prostota. Brak specjalnej matematyki w mechanizmie uwagi. Tabela pozycji wygląda jak tabela tokenów.
- Zgodność z niestandardowym CUDA. Silnik microgpt_cuda.cu ANDREA obsługuje dwa wyszukiwania embeddingów identycznie; nie są potrzebne jądra sin/cos.
- Wystarczające dla stałego kontekstu. ANDREA ogranicza T do 1024. Wyuczona tabela działa dobrze dla sekwencji o stałej długości.
Koszt osadzania pozycji w ANDREA-120M
| Ilość | Wartość |
|---|---|
| T (kontekst) | 1,024 |
| d_model | 768 |
| Parametry | 786,432 |
0.79M parametrów dla pozycji. Połączenie z osadzeniami tokenów: 6.49M + 0.79M = 7.27M parametrów osadzeń łącznie dla ANDREA-120M.
Jak się łączą
W każdej pozycji t sekwencji wejściowej:
x_t = token_embedding[token_id_t] + position_embedding[t]
Dwa wektory 768-wymiarowe, sumowane elementarnie. Wynik, x_t, trafia do pierwszego bloku transformera. Model nigdy ich już nie rozdziela; uczy się korzystać z połączonego sygnału.
Uczone kontra sinusoidalne
Gdzie znajdują się parametry embeddingu
Pełna warstwa embeddingu ANDREA-120M
| Komponent | Kształt | Parametry |
|---|---|---|
| Tabela osadzeń tokenów | 8,449 × 768 | 6,488,832 |
| Tabela osadzeń pozycji | 1,024 × 768 | 786,432 |
| Razem | 7,275,264 |
Około 7,3 mln parametrów. Całkowita liczba parametrów modelu ANDREA-120M: ~120 mln. Sama warstwa osadzeń: 6%. Pozostałe 94% znajduje się w blokach transformerowych (uwaga + MLP, omówione w aktywnościach 5-7).
Osadzenia niepowiązane vs powiązane
Wiele architektur transformerów (w tym GPT-2) wiąże osadzenie tokenu z końcową projekcją wyjściową: ta sama macierz V × d_model jest używana zarówno na wejściu, jak i na wyjściu (logity nad słownikiem). Wiązanie oszczędza parametry V × d_model i często poprawia jakość.
ANDREA używa niezwiązanych osadzeń: osadzenie wejściowe i projekcja wyjściowa są trenowane jako osobne macierze. Aktywność 7 (grow_a_language_model_transformer_block) omawia warstwę końcową.
Dotychczasowy przebieg propagacji w przód
Wejście: identyfikatory tokenów [256, 1842, 7301, ...] (1024 sztuki). Każdy identyfikator wyszukuje wektor 768-wymiarowy. Każda pozycja wyszukuje wektor 768-wymiarowy. Sumujemy je elementarnie. Wynik: macierz (1024, 768) x zawierająca wektory tokenów i pozycji. x trafia do bloku transformera nr 1.
Aktywność 5 (grow_a_language_model_attention) opisuje, co robi blok 1: skalowany iloczyn skalarny z maską przyczynową i softmax.