self-attention
Механизм attention, где Q, K, V берутся из одной и той же последовательности — каждый токен «смотрит» на все остальные.
Что такое self-attention
Self-attention (или intra-attention) — разновидность attention, где запрос (Q), ключи (K) и значения (V) вычисляются из одной и той же входной последовательности. Это позволяет каждому токену «обратить внимание» на любой другой токен той же последовательности.
Это принципиальное отличие от cross-attention (используемого в encoder-decoder архитектурах), где Q берётся из одной последовательности (например, перевод), а K и V — из другой (исходный текст).
Как работает self-attention
Input: X ∈ R^(seq_len × d_model)
Q = X × W_Q # Что я ищу?
K = X × W_K # Что у меня есть?
V = X × W_V # Что я отдаю?
Attention weights = softmax(QK^T / √d_k)
Output = Attention weights × V
Каждый токен получает взвешенную сумму всех других токенов, где веса определяются «релевантностью» (скалярным произведением Q и K).
Causal (masked) self-attention в decoder
В decoder-only LLM (GPT, Llama) используется causal attention с маской: токен i может «видеть» только токены 0..i, но не будущие i+1..n. Это гарантирует, что модель не «подглядывает» в будущее при обучении.
Маска:
T1 T2 T3 T4
T1 ✓ ✗ ✗ ✗
T2 ✓ ✓ ✗ ✗
T3 ✓ ✓ ✓ ✗
T4 ✓ ✓ ✓ ✓
Вычислительная сложность
Self-attention имеет квадратичную сложность O(n²) по длине последовательности: нужно вычислить всё матрицы взаимодействий токенов. При seq_len=128K это становится дорого — отсюда Flash Attention и другие оптимизации.
Связанные термины
- attention — общий механизм
- multi-head attention — несколько параллельных self-attention
- GQA — экономичный вариант self-attention
- KV-cache — кеширование K, V при autoregressive inference
Готовы запустить GPU-задачу?
Запустить GPU-сервер