W standardowym self-attention macierz attention ma kształt [T, T] — każdy query i może wziąć dowolny key j w przedziale [0, T-1] (lub [0, i] w wariancie kauzalnym). W SWA każdy query i może wziąć keys tylko z okna [i-W+1, i] (kauzalnie) lub [i-W/2, i+W/2] (symetrycznie). Pozostałe pozycje są maskowane (logit = -∞ przed softmaxem), co zeruje ich udział. Efektywny receptive field rośnie liniowo z głębokością: po L warstwach każdy token „widzi" w przybliżeniu L · W tokenów wstecz — dla Mistral 7B (L=32, W=4096) to 131 072 tokenów efektywnego kontekstu mimo że pojedyncza warstwa patrzy na 4096. Implementacyjnie SWA jest fuzowane z FlashAttention — nigdy nie materializuje pełnej macierzy [T,T], tylko macierze [T, W]. W KV cache trzymane są jedynie ostatnie W tokenów dla każdej warstwy (Mistral) lub ostatnie min(T, W) (Longformer dla bidirectional). To redukuje pamięć KV cache liniowo z T do liniowo z min(T, W).
Standardowe self-attention skaluje się kwadratowo z długością sekwencji T: koszt obliczeniowy O(T²·d), pamięć aktywacji O(T²). Dla T = 32k–128k wymagań pamięciowych i obliczeniowych nie da się zrealizować na pojedynczym GPU. Jednocześnie większość tokenów w typowych długich tekstach silnie zależy od kilkuset sąsiadów, a nie od wszystkich pozostałych. SWA wykorzystuje tę obserwację: zamiast modelować attention między wszystkimi parami, ogranicza je do lokalnego okna i pozwala informacjom propagować się dalej przez głębokość modelu.
Deterministyczna maska binarna definiująca, które pary (query, key) są dozwolone. Stosowana przed softmaxem (logit poza oknem = -∞).
Oficjalna
Bufor KV utrzymujący tylko ostatnie W tokenów per warstwa. Nowe tokeny nadpisują najstarsze zgodnie z polityką rotacji (FIFO). Kluczowy dla utrzymania pamięci O(W) zamiast O(T).
Oficjalna
Wybrane tokeny ([CLS], tokeny pytania w QA, tokeny tematu) mogą mieć attention na całą sekwencję i być widoczne dla wszystkich innych. Wzbogaca globalną spójność kosztem O(g·T) na te tokeny.
Oficjalna
Naiwna implementacja SWA buduje pełną macierz [T, T] i zeruje pozycje poza oknem. Niweluje całą oszczędność pamięciową — wciąż O(T²). To częsty błąd w prostych implementacjach.
W SWA wystarczy trzymać KV tylko dla ostatnich W tokenów na warstwę — nie dla całej historii. Trzymanie pełnego KV niweluje główną korzyść pamięciową SWA (np. dla Mistral 7B przy T=32k vs W=4096 to różnica ~8×).
Receptive field L·W jest GÓRNYM ograniczeniem teoretycznym, nie gwarancją. Praktyczna zdolność do precyzyjnego pobierania faktu z odległej pozycji (NIAH) jest zwykle istotnie gorsza niż w modelu z full attention o porównywalnej długości kontekstu.
W encoderach long-document (Longformer dla QA, klasyfikacji) bez global attention na kluczowe tokeny ([CLS], tokeny pytania) jakość spada — lokalne okno nie wystarczy, by zebrać globalną reprezentację.
OpenAI publikuje Sparse Transformer — pierwszą szeroko cytowaną pracę o sparsyfikacji attention przez deterministyczne maski (lokalne + strided). Bezpośredni prekursor SWA.
Beltagy, Peters, Cohan (AI2) publikują Longformer. Wprowadzają pełną formalizację SWA dla encoderów long-document oraz wariant „SWA + global attention" na wybrane tokeny. Pierwszy long-context encoder o jakości porównywalnej z BERT-em na krótkich zadaniach.
Google publikuje BigBird — sparse attention łączące okno lokalne (SWA), random attention i global tokens. Pokazuje teoretycznie, że taka kombinacja zachowuje pełną ekspresywność standardowego Transformera.
Mistral AI wypuszcza Mistral 7B z kauzalnym SWA o W=4096 we wszystkich warstwach. Pierwszy szeroko adoptowany open-source LLM oparty wyłącznie o SWA. Pokazuje, że receptive field L·W (32 × 4096 = 131k) wystarcza dla wysokiej jakości long-context.
FlashAttention v2 / v3 natywnie wspierają sliding window — fuzowane kernele SWA, które nigdy nie materializują pełnej macierzy [T, T]. Praktyczny standard implementacji.
Google DeepMind wprowadza w Gemma 2/3 architekturę naprzemienną: część warstw to SWA, część pełne attention. Argumentacja: SWA zapewnia tanio lokalną spójność, full attention raz na kilka warstw odzyskuje globalne zależności.
Złożoność czasowa: O(T · W · d) per warstwa (zamiast O(T² · d) w full attention). Złożoność przestrzenna: O(W · d) per warstwa (KV cache) + O(T · W · d) aktywacji w fuzowanej impl..
Główne ograniczenie SWA to liniowy wzrost receptive field z głębokością. Aby model „widział" T tokenów, potrzebuje co najmniej ceil(T/W) warstw. Dla bardzo długich kontekstów (T = 1M+) sama głębokość modelu zaczyna być limitem — stąd wariant hybrydowy z full attention.
Liczba tokenów widocznych dla każdego query. Najważniejszy parametr SWA — kompromis między efektywnym kontekstem (L·W) a kosztem (O(T·W·d)).
W modelach autoregresywnych (LLM) okno jest kauzalne ([i-W+1, i]). W encoderach (Longformer, BERT-like) okno jest symetryczne ([i-W/2, i+W/2]).
Czy wszystkie warstwy są SWA (Mistral), czy SWA jest przeplatane z warstwami pełnego attention (Gemma 2/3). Wariant przeplatany odzyskuje część globalnej spójności kosztem dodatkowej pamięci/computa.
Wybrane tokeny (np. [CLS], pytanie w QA) mogą mieć attention na całą sekwencję i być widoczne dla wszystkich pozostałych — wariant Longformer „SWA + global". Wzbogaca globalną spójność.
Wariant „dilated SWA" — okno z odstępami (jak dilated convolution). Pozwala zwiększyć receptive field bez powiększania W. Stosowany sporadycznie, głównie w encoderach.
SWA to sparse attention z deterministyczną, geometryczną sparsity (nie strukturalną uczoną jak Mixture-of-Experts). Wewnątrz okna attention jest gęste, poza oknem zero. Tryb „dense" jako secondary, bo wiele modeli (Gemma 2/3, Mistral) miesza warstwy SWA z warstwami pełnego attention.
Brak routingu uczonego — sparsyfikacja jest statyczna (geometryczna maska okna).
SWA modyfikuje wyłącznie maskę attention — pozostaje w pełni równoległa w obrębie warstwy. Implementacje fuzowane (FlashAttention with sliding window) korzystają z bloków [T, W] zamiast [T, T], co dodatkowo poprawia wykorzystanie pamięci podręcznej GPU.
SWA jest projektowane pod fuzowane kernele GPU (FlashAttention z `window_size`). Lokalne bloki [T, W] doskonale mieszczą się w SRAM tensor cores, dając znaczne przyspieszenie względem dense attention.
Sama idea (deterministyczna maska okna) działa na każdym hardware obsługującym standardowe attention. Realna korzyść pamięciowa zależy jednak od fuzowanego kernela.
llama.cpp implementuje SWA na CPU AVX — działa, choć skala wykorzystania w produkcji jest dużo mniejsza niż na GPU.