Mechanizm atencji (attention mechanism) to najważniejsza innowacja w historii przetwarzania języka naturalnego. Wprowadzony w artykule „Attention Is All You Need" (Vaswani et al., 2017), stał się fundamentem transformerów — architektury napędzającej ChatGPT, Claude, Gemini i praktycznie każdy nowoczesny model AI. Zrozumienie atencji to klucz do zrozumienia, jak działają LLM.
Intuicja: czytanie ze zrozumieniem
Kiedy czytasz zdanie „Bank nad rzeką był porośnięty mchem", jak rozumiesz słowo „bank"? Patrzysz na kontekst — słowa „rzeką" i „mchem" wskazują na brzeg rzeki, nie instytucję finansową. Twój mózg selektywnie skupia uwagę na najistotniejszych słowach.
Mechanizm atencji robi dokładnie to samo: dla każdego elementu wejścia (tokenu) oblicza, ile uwagi poświęcić każdemu innemu elementowi, budując kontekstową reprezentację.
Dlaczego atencja była potrzebna?
Przed transformerami dominowały sieci rekurencyjne (RNN, LSTM). Przetwarzały tekst sekwencyjnie — token po tokenie, od lewej do prawej. Problem:
- Wąskie gardło pamięci — informacja z początku zdania musi „przeżyć" przejście przez dziesiątki/setki kroków, tracąc szczegóły
- Brak równoległości — każdy krok zależy od poprzedniego, nie można zrównoleglić na GPU
- Trudność z długimi zależnościami — w zdaniu „Kot, który wczoraj bawił się z piłką w ogrodzie pani Kowalskiej, zasnął" podmiot (kot) i orzeczenie (zasnął) są daleko od siebie
Atencja rozwiązuje te problemy: każdy token może „patrzeć" na każdy inny token jednocześnie, niezależnie od odległości.
Self-Attention — krok po kroku
Self-attention (samoatencja) to mechanizm, w którym element sekwencji oblicza relację z każdym innym elementem tej samej sekwencji. Oto jak działa:
Krok 1: Tworzenie wektorów Query, Key, Value
Dla każdego tokenu wejściowego (reprezentowanego jako wektor embeddingu) tworzymy trzy wektory przez mnożenie przez wyuczone macierze:
- Query (Q) — „czego szukam?"
- Key (K) — „co oferuję?"
- Value (V) — „jaką informację niosę?"
Analogia biblioteczna: Q to zapytanie w wyszukiwarce, K to tytuły/tagi książek, V to treść książek. Mechanizm szuka dopasowań Q–K, a następnie zwraca ważoną kombinację V.
Krok 2: Obliczanie wag atencji (Attention Scores)
Dla każdej pary tokenów obliczamy iloczyn skalarny Query jednego tokenu z Key drugiego:
score(i, j) = Q_i · K_j / √d_k
Gdzie d_k to wymiar wektorów Key (dzielenie stabilizuje gradienty — bez niego duże wymiary prowadzą do ekstremalnych wartości).
Wynik: macierz uwag (attention matrix) o wymiarach n × n (n = długość sekwencji).
Krok 3: Normalizacja Softmax
Wagi atencji przechodzą przez Softmax, który przekształca je w rozkład prawdopodobieństwa (wartości ≥ 0, suma = 1 w każdym wierszu):
α_ij = softmax(score(i, j))
Teraz α_ij mówi: „ile uwagi token i poświęca tokenowi j".
Krok 4: Ważona suma wartości
Wyjście dla tokenu i to ważona suma wektorów Value wszystkich tokenów:
output_i = Σⱼ α_ij · V_j
Tokeny, na które zwrócono dużą uwagę (wysoki α), mają duży wpływ na wynik. Tokeny z niskim α są ignorowane.
Formuła zbiorcza
Attention(Q, K, V) = softmax(Q · Kᵀ / √d_k) · V
To cała magia — jedna linijka wzoru leżąca u podstaw rewolucji AI.
Multi-Head Attention
Pojedyncza głowa atencji uczy się jednego „rodzaju" relacji. Ale w języku relacje są wielowymiarowe: syntaktyczne (podmiot–orzeczenie), semantyczne (synonim, antonim), koreferencyjne (zaimek–rzeczownik).
Multi-head attention rozwiązuje to przez uruchomienie wielu głów atencji równolegle, każda z własnymi macierzami Q, K, V:
MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) · W_O
Gdzie headᵢ = Attention(Q · W_Qᵢ, K · W_Kᵢ, V · W_Vᵢ)
Typowy transformer ma 8–128 głów atencji. Każda głowa specjalizuje się w innym aspekcie — np. jedna śledzi relacje syntaktyczne, inna semantyczne, inna pozycyjne.
Masked (Causal) Attention
W modelach generujących tekst (GPT, Claude) token nie powinien „widzieć" przyszłych tokenów — bo w momencie generowania ich jeszcze nie ma. Rozwiązanie: maskowana atencja — macierz uwag jest zamaskowana trójkątną macierzą, zerując wagi dla tokenów leżących „w przyszłości".
To sprawia, że generowanie jest autoregresyjne: model generuje token po tokenie, opierając się wyłącznie na tokenach wcześniejszych.
Enkoder vs. Dekoder
- Enkoder (BERT) — dwukierunkowa atencja, token widzi wszystkie inne tokeny. Idealny do rozumienia tekstu
- Dekoder (GPT, Claude) — jednokierunkowa (maskowana) atencja. Idealny do generowania tekstu
- Enkoder-dekoder (T5, oryginalny transformer) — enkoder rozumie wejście, dekoder generuje wyjście. Cross-attention łączy oba
Cross-Attention
W modelach enkoder-dekoder cross-attention pozwala dekoderowi „patrzeć" na wynik enkodera:
- Q pochodzi z dekodera (bieżący token generowany)
- K i V pochodzą z enkodera (zrozumiany tekst wejściowy)
Kluczowe w tłumaczeniu maszynowym: dekoder generując słowo w polskim, „patrzy" na odpowiednie słowo w angielskim tekście źródłowym.
KV-Cache — optymalizacja inference
Podczas generowania tekstu model oblicza atencję dla każdego nowego tokenu. Ale K i V dla wcześniejszych tokenów się nie zmieniają. KV-cache przechowuje te wartości, unikając redundantnych obliczeń. Bez niego generowanie byłoby O(n²) z każdym nowym tokenem; z KV-cache jest O(n).
To dlatego modele z długim kontekstem wymagają dużo pamięci RAM — KV-cache rośnie liniowo z długością kontekstu.
Flash Attention
Standardowa atencja wymaga macierzy uwag n × n w pamięci — dla kontekstu 100K tokenów to 10 miliardów pozycji. Flash Attention (Tri Dao, 2022) to implementacja atencji, która:
- Nie materializuje pełnej macierzy uwag w pamięci
- Wykorzystuje hierarchię pamięci GPU (SRAM vs. HBM)
- Osiąga 2–4× przyspieszenie bez zmiany wyniku
Flash Attention umożliwił praktyczne użycie kontekstów 100K–1M tokenów.
Atencja poza NLP
Mechanizm atencji okazał się uniwersalny:
- Vision Transformers (ViT) — obrazy dzielone na łatki (patches), przetwarzane jak tokeny tekstu
- AlphaFold — atencja między aminokwasami w łańcuchu białkowym przewiduje strukturę 3D
- DALL-E, Stable Diffusion — cross-attention między tekstem (prompt) a generowanym obrazem
- Perceiver — ujednolicona architektura atencji dla tekstu, obrazów, dźwięku i wideo
- Modele audio — atencja w rozpoznawaniu mowy (Whisper) i generowaniu muzyki
Skalowanie i wyzwania
Złożoność O(n²)
Fundamentalne wyzwanie: self-attention ma złożoność obliczeniową i pamięciową O(n²), gdzie n to długość sekwencji. Podwojenie kontekstu oznacza czterokrotny wzrost kosztów.
Efektywne warianty atencji
Badacze opracowali wiele wariantów redukujących złożoność:
- Sparse Attention — zamiast pełnej macierzy n × n, atencja do podzbioru tokenów
- Linear Attention — aproksymacja softmax eliminująca kwadratową zależność
- Sliding Window Attention (Mistral) — lokalna atencja w oknie + globalna dla wybranych tokenów
- Ring Attention — dystrybucja długich kontekstów na wiele GPU
Podsumowanie
Mechanizm atencji to prawdopodobnie najważniejsza innowacja AI XXI wieku. Formuła softmax(QKᵀ/√d) · V — elegancko prosta — umożliwiła modelom „rozumienie" kontekstu na niespotykaną skalę. Od tokenizacji tekstu przez atencję do generowania odpowiedzi — atencja jest sercem każdego LLM.