ML Fundamentals

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-сервер