Krok 1: Wejście X ∈ R^(n×d_model) jest projektowane h razy przez wyuczalne macierze W^Q_i, W^K_i, W^V_i ∈ R^(d_model × d_k) (gdzie zazwyczaj d_k = d_v = d_model / h), produkując h trójek (Q_i, K_i, V_i). Krok 2: Każda głowa niezależnie liczy head_i = SoftMax(Q_i K_i^T / √d_k) V_i — to standardowy Scaled Dot-Product Attention w niższej wymiarowości. Krok 3: Wyjścia wszystkich głów są konkatenowane wzdłuż wymiaru cech: Concat(head_1, …, head_h) ∈ R^(n × h·d_v = d_model). Krok 4: Konkatenowany wynik przechodzi przez końcową macierz projekcji W^O ∈ R^(d_model × d_model), produkując ostateczne wyjście MHA(Q, K, V) = Concat(head_1, …, head_h) W^O. W oryginalnym Transformerze h=8, d_model=512, d_k=d_v=64.
Pojedyncza głowa Scaled Dot-Product Attention uśrednia wszystkie zależności w jeden wektor — model musi kompromisem dzielić ograniczoną pojemność reprezentacji między różne typy relacji (gramatyczne, semantyczne, koreferencje, długodystansowe). MHA rozwiązuje to dzieląc d_model na h równoległych podprzestrzeni, w których każda głowa może niezależnie specjalizować się w innym wzorcu uwagi.
Trzy zestawy wyuczalnych macierzy wagowych W^Q_i, W^K_i, W^V_i ∈ R^(d_model × d_k) dla każdej z h głów. Projektują wspólne wejście do h niezależnych podprzestrzeni.
h niezależnych instancji Scaled Dot-Product Attention działających równolegle. Każda głowa może wyuczyć się innego wzorca uwagi (składnia, semantyka, koreferencje, pozycje sąsiednie).
Oficjalna
Wyjścia wszystkich h głów (każde ∈ R^(n×d_v)) są łączone wzdłuż wymiaru cech do tensora R^(n × h·d_v).
Wyuczalna macierz W^O ∈ R^(d_model × d_model) miksująca informacje między głowami i dopasowująca wymiarowość do reszty sieci.
Bez dzielenia iloczynów skalarnych Q K^T przez √d_k przy większych wymiarach softmax przechodzi w skrajne wartości, gradienty zanikają i model nie uczy się.
Brak lub niepoprawna maska górno-trójkątna w dekoderze pozwala modelowi „widzieć przyszłość” podczas trenowania — perplexity wygląda dobrze, ale generacja jest zepsuta.
Zamieszanie kolejności wymiarów (batch, heads, seq, d_k) vs (batch, seq, heads, d_k) przy reshape/transpose prowadzi do mieszania informacji między pozycjami a głowami.
Ponowne liczenie K, V dla wszystkich poprzednich tokenów przy każdym nowym tokenie autoregresyjnym daje O(n³) zamiast O(n²) i degraduje throughput LLM 10–100×.
Vaswani et al. definiują MHA z h=8 głowami i d_k=64 jako kluczowy element architektury Transformer, zastępując rekurencję pełną równoległością.
Google (BERT) i OpenAI (GPT-1) udowadniają, że MHA skaluje się do setek milionów parametrów i dominuje benchmarki NLP.
Noam Shazeer („Fast Transformer Decoding”) proponuje MQA — jeden wspólny K, V dla wszystkich głów Q, redukując KV cache i przyspieszając inferencję.
Tri Dao et al. wprowadzają FlashAttention — exact MHA z tilingiem w SRAM, eliminując materializację macierzy n×n w HBM. 2–4× szybciej, mniejsze zużycie pamięci.
Ainslie et al. proponują GQA — kompromis między MHA a MQA, grupy głów Q dzielą K, V. Adoptowane przez LLaMA 2, Mistral, LLaMA 3 jako standard dla LLM ery 2023+.
Złożoność czasowa: O(n² · d_model). Złożoność przestrzenna: O(n² + n · d_model).
Macierz wag uwagi n×n musi być w pełni materializowana (lub strumieniowana jak w FlashAttention) — to dominuje koszt zarówno czasu jak i pamięci HBM przy długich sekwencjach.
Każda głowa aktywuje się dla każdego tokena — w przeciwieństwie do sparse attention czy MoE wszystkie ścieżki obliczeniowe są zawsze używane.
Wszystkie h głów oraz wszystkie pozycje w sekwencji liczone są równolegle. To kluczowa różnica względem RNN i powód masowej skalowalności Transformera na GPU/TPU.
Liczba równoległych głów uwagi. Musi dzielić d_model. Więcej głów = bardziej zróżnicowane wzorce uwagi, ale mniejsza wymiarowość d_k każdej głowy.
Wymiar Q, K, V dla pojedynczej głowy. Konwencjonalnie d_k = d_model / h, ale to nie jest wymóg — można rozdzielić niezależnie.
Maskowanie pozycji niedozwolonych: causal (dekoder, GPT), full (enkoder, BERT), padding mask, custom (sliding window).
Operacje GEMM (Q K^T i Attention·V) idealnie pasują do Tensor Cores; wszystkie h głów liczone w równoległych blokach.
Systolic array TPU jest zoptymalizowany pod gęste mnożenia macierzy — bezpośrednio wykorzystywany przez Transformery na TPU (BERT, T5, PaLM).
Wykonalne na CPU, ale O(n²) bez wsparcia sprzętowego daje niską przepustowość — używane głównie w inferencji małych modeli.