## Attention

*Jak model czyta i przewiduje*

*Ostatnia zmiana: 28 września 2026*

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 ludzku:** Czytają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.

*Interaktywny widżet na stronie: Kliknij token i zobacz, na które wcześniejsze tokeny patrzy. Wagi w jednym wierszu zawsze sumują się do 100%.*

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

*Interaktywny widżet na stronie: 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.*

### 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ę

**Pytanie:** Jak działa attention i czemu długi kontekst jest drogi?

**Krótka odpowiedź:** 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.

### Pytania pogłębiające

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

### Źródła

- [Vaswani i in.: Attention Is All You Need (2017)](https://arxiv.org/abs/1706.03762)
- [Su i in.: RoFormer, czyli RoPE (2021)](https://arxiv.org/abs/2104.09864)
- [Dao i in.: FlashAttention (2022)](https://arxiv.org/abs/2205.14135)
- [DeepSeek: premiera V4, sparse attention i kontekst 1M (2026)](https://api-docs.deepseek.com/news/news260424/)
- [Transformer Explainer: interaktywny GPT-2 w przeglądarce (Georgia Tech)](https://poloclub.github.io/transformer-explainer/)

Strona interaktywna: https://howaiworks.dev/pl/attention/
