Strona główna / Rozdział 1 · Jak model czyta i przewiduje
Ostatnia zmiana · 5 min czytania
Attention
Attention to jedyne miejsce w transformerze, w którym tokeny wymieniają informacje: każdy token patrzy na wszystkie wcześniejsze i bierze od nich ważoną mieszankę treści. Od tego mechanizmu zależy koszt długiego kontekstu.
Po ludzkuCzytając „był głodny”, cofasz wzrok do słowa „Kot”, żeby wiedzieć, o kim mowa. Attention to takie cofanie wzroku, tylko robione przy każdym słowie i do wszystkich poprzednich naraz.
Kliknij token i zobacz, na które wcześniejsze tokeny patrzy. Wagi w jednym wierszu zawsze sumują się do 100%
Wiersz to token, który patrzy, kolumna to token, na który patrzy. Zakreskowana połowa to przyszłość zasłonięta maską. Prawdziwe wagi jednej głowy małego otwartego modelu Qwen3-0.6B-Base (warstwa 10, głowa 3, licząc od 0), z tokenem startu dodanym na początku. Polskie słowa model tnie na kilka tokenów, więc ich wagi są zsumowane.
Mechanizm: Q, K, V
- Każdy token rzutuje swój wektor na trzy: zapytanie Q (czego szukam), klucz K (po czym można mnie znaleźć) i wartość V (co przekażę). Wagi to
softmax(Q·Kᵀ/√d): iloczyn skalarny mierzy dopasowanie, dzielenie przez pierwiastek z wymiaru głowy chroni softmax przed nasyceniem, a softmax daje wagi sumujące się do 1. Wynik to ważona suma V. W przykładzie „był” daje dalekiemu słowu „Kot” prawie tyle uwagi co sąsiedniemu „bo”: waga zależy od dopasowania Q do K, nie od odległości. - Maska przyczynowa: token widzi tylko siebie i tokeny wcześniejsze. Dzięki temu trening uczy przewidywania na wszystkich pozycjach tekstu naraz, a przy generowaniu K i V starych tokenów się nie zmieniają, więc można je trzymać w KV cache’u (zobacz „Pętla generowania i KV cache”).
- Wiele głów: w Llama 3 70B wektor 8192 liczb jest rzutowany na 64 głowy zapytań po 128 wymiarów (i 8 głów kluczy i wartości). Każda głowa widzi cały wektor przez własną projekcję i szuka niezależnie od pozostałych, a macierz wyjściowa skleja wyniki. Nieliczne głowy da się nazwać, np. kopiującą wzorzec, który już wystąpił w tekście; większości nie.
- Sama operacja attention ignoruje kolejność: bez maski przyczynowej i bez informacji o pozycji „2 − 1” i „1 − 2” wyglądałyby tak samo. Już sama maska pozwala modelowi odtworzyć pozycje (token może policzyć, ilu ma poprzedników), a Llama 4 ma część warstw w ogóle bez kodowania pozycji. Większość modeli i tak dodaje RoPE, które obraca pary współrzędnych Q i K o kąt proporcjonalny do pozycji, więc iloczyn Q·K zależy od odległości między tokenami. Kontekst wydłuża się po treningu zwykle przez przeskalowanie RoPE i krótkie dotrenowanie na długich tekstach.
Wydłużaj kontekst i porównaj trzy liczby: pary rosną kwadratowo, KV cache liniowo, a attention przejmuje większość obliczeń dopiero przy bardzo długim prompcie
Szacunek dla Llama 3.1 70B (80 warstw, 64 głowy zapytań, 8 głów KV, wymiar głowy 128). Attention z maską kosztuje ok. 2 × n × 8192 operacji na token na warstwę, reszta warstwy ok. 1,7 mld. KV cache w BF16 to 0,33 MB na token. Okno Llamy 3.1 kończy się na 128 tys. tokenów, więc 1 mln to ten sam wzór poza jej zasięgiem.
Ile kosztuje attention
- Prefill liczy n²/2 par w każdej głowie każdej warstwy. Reszta warstwy, czyli projekcje i MLP, rośnie jednak liniowo i przy krótkim kontekście dominuje: w Llama 3.1 70B attention dogania ją dopiero przy ok. 100 tys. tokenów. Dziesięć razy dłuższy prompt kosztuje więc od 10 do 100 razy więcej obliczeń, zależnie od długości.
- Przy generowaniu nowy token porównuje jedno Q ze wszystkimi K w cache’u, więc obliczenia na token rosną liniowo. Boli pamięć: KV cache rośnie liniowo z długością (43 GB na 128 tys. tokenów w Llama 3.1 70B) i to on ogranicza, ile rozmów zmieści się na karcie.
- FlashAttention liczy dokładnie ten sam wynik, ale kafelkami w szybkiej pamięci SRAM, bez zapisywania macierzy n × n do pamięci karty. Pamięć staje się liniowa, a obliczenia kilka razy szybsze, choć liczba operacji nie spada (w treningu wręcz rośnie, bo przebieg wstecz liczy attention ponownie).
- KV cache można zmniejszyć w samej architekturze: GQA daje jedną parę K, V na grupę głów zapytań (Llama 3 70B: 8 zamiast 64), MLA z DeepSeek zapisuje jeden skompresowany wektor, a okno przesuwne ogranicza część warstw do najnowszych tokenów (Gemma 3: 1024, gpt-oss: 128).
Granice długiego kontekstu
- Softmax zawsze rozdziela 100% uwagi, więc głowa nie może „na nic nie patrzeć”. Modele uczą się zrzucać nadmiar na pierwsze tokeny (attention sinks, Xiao i in., 2023), w widżecie wyżej – na token startu. Dlatego obcięcie początku kontekstu, np. w prostym oknie przesuwnym, psuje model, nawet gdy początek nie niósł ważnej treści.
- Zmieszczenie tekstu w oknie nie znaczy, że model go dobrze wykorzysta. Informację ze środka długiego kontekstu modele wykorzystują gorzej niż z początku i końca (Liu i in., „Lost in the Middle”, 2023). Co wkładać do kontekstu i gdzie, omawia „Context engineering i pamięć”.
Sprawdź się
Jak działa attention i czemu długi kontekst jest drogi?
Każdy token rzutuje swój wektor na zapytanie, klucz i wartość. Wagi to softmax z iloczynów Q·K podzielonych przez √d, a wynik to ważona suma wartości. Maska przyczynowa zasłania przyszłość, a wiele głów robi to równolegle. W prefillu liczba par rośnie z kwadratem długości, ale w modelu 70B attention zaczyna dominować w obliczeniach dopiero przy ok. 100 tys. tokenów. Przy generowaniu bardziej boli pamięć: KV cache rośnie liniowo, ok. 0,33 MB na token w Llama 3 70B (BF16), i ogranicza batch. Pomagają FlashAttention, GQA lub MLA i okno przesuwne.
In English
Each token projects its vector into a query, a key and a value. The weights are a softmax over Q·K dot products divided by √d, and the output is a weighted sum of the values. A causal mask hides the future, and many heads do this in parallel. In prefill the number of pairs grows quadratically with length, but in a 70B model attention only starts to dominate compute at around 100k tokens. During generation memory hurts more: the KV cache grows linearly, about 0.33 MB per token in Llama 3 70B (BF16), and limits the batch. FlashAttention, GQA or MLA, and sliding windows help.
Pytania pogłębiające (4)
- Czemu dzielimy przez √d?
- Iloczyn skalarny wektorów o losowych składowych ma wariancję rosnącą z wymiarem. Bez skalowania logity są duże, softmax staje się prawie zero-jedynkowy, a gradienty zanikają.
- Czym różnią się MHA, MQA i GQA?
- Liczbą głów kluczy i wartości. MHA ma ich tyle co zapytań, MQA jedną wspólną, GQA po jednej na grupę (Llama 3 70B: 8 na 64 głowy zapytań, czyli 8 razy mniejszy KV cache). MLA z DeepSeek zapisuje zamiast K i V jeden skompresowany wektor. Mniej KV to większe batche i dłuższy kontekst. MQA i GQA płacą za to niewielką stratą jakości, a według DeepSeek MLA dorównuje pełnemu MHA, a nawet je przewyższa.
- Co robi FlashAttention?
- Liczy dokładnie to samo attention, ale kafelkami mieszczącymi się w szybkiej pamięci karty, bez zapisywania całej macierzy n × n. Wynik ten sam, pamięć liniowa zamiast kwadratowej i mniej transferów, więc szybciej. Liczby operacji nie zmniejsza.
- Jak modele obsługują milion tokenów?
- Łączą pełne attention z tańszymi wariantami albo je nimi zastępują: oknem przesuwnym, attention rzadkim (sparse attention), w którym każdy token patrzy tylko na top-k wcześniejszych tokenów wybranych przez mały, szybki moduł oceniający (DeepSeek V4 łączy je z kompresją KV cache’u i obsługuje milion tokenów), attention liniowym albo warstwami typu Mamba ze stałym stanem. Do tego GQA lub MLA i przeskalowane RoPE. Zmieszczenie miliona tokenów to nie to samo co dobre ich wykorzystanie, więc jakość na długim kontekście mierz na własnym zadaniu.