Cały mechanizm mieści się w jednej linijce:
Attention(Q, K, V) = softmax( Q·Kᵀ / √d ) · V
Dzielenie przez √d (pierwiastek z długości wektorów) chroni przed zbyt dużymi liczbami, które
sprawiłyby, że softmax wybiera zawsze jeden token. Q, K i V powstają przez pomnożenie wektora tokenu
przez trzy macierze wag W_Q · W_K · W_V — i właśnie te macierze model wyuczył w treningu.
Ponieważ tokeny patrzą na tokeny z tego samego tekstu, mówi się o samouwadze self-attention. Wyniki wszystkich głowic są sklejane i mnożone przez jeszcze jedną macierz, zanim zostaną dodane do strumienia rezydualnego.
Haczyk: każdy token porównuje się z każdym. Przy 1000 tokenach to milion porównań, przy 100 000
— dziesięć miliardów. Dlatego długie konteksty są tak drogie, a inżynierowie wymyślają coraz
sprytniejsze sztuczki (np. FlashAttention, uwaga przesuwna, pamięć podręczna KV).