Суть
Для каждого токена считаются три вектора (умножением его эмбеддинга на обучаемые матрицы W_Q, W_K, W_V):
- Q (Query) — «что я ищу?»
- K (Key) — «что я предлагаю?»
- V (Value) — «что я отдаю?»
Формула: Attention(Q, K, V) = softmax(Q·Kᵀ / √d) · V.
Зачем это нужно
Attention позволяет токену контекстно зависеть от любого другого токена напрямую (а не через цепочку шагов, как в RNN) и считать это для всех токенов параллельно одним матричным умножением. Отсюда — масштабируемость трансформеров.
Как работает
- Скалярные произведения Q каждого токена с K всех остальных → «насколько релевантен».
- Делим на √d (стабильность), применяем softmax → веса важности.
- Взвешенная сумма V-векторов по этим весам → новое представление токена.
- Causal mask (decoder, GPT/Claude): токен N видит только 0..N; «будущее» заменяется на −∞ перед softmax (см. Encoder vs Decoder).
- Multi-Head Attention: вместо одной — несколько голов (8–96), каждая в своём подпространстве (
d_model / num_heads), со своими Q/K/V; результаты конкатенируются через W_O. Головы сами специализируются: previous-token, punctuation, coreference, induction heads (реализуют in-context learning). - GQA (Grouped Query Attention): Q-голов больше, чем K/V-голов → экономия памяти KV Cache.
- Сложность квадратична по длине → дорогой длинный контекст (см. Context Window).
Пример
Q·Kᵀ → /√d → softmax → веса × V → контекстный вектор токена
Связано с
- Transformer — attention как ядро блока
- Embeddings — из них получаются Q/K/V
- KV Cache — кэширование K/V при генерации; GQA уменьшает его
- Context Window — квадратичная сложность attention
Открытые вопросы
- Flash Attention / sparse attention — как меняют сложность на практике
- как «читать» веса attention для интерпретации (mechanistic interpretability)