Модуль II·Статья III·~3 мин чтения
Трансформеры и архитектуры на внимании
Математические основы Deep Learning
Превратить статью в подкаст
Выберите голоса, формат и длину — AI запишет аудио
Механизм внимания и трансформеры
Трансформер (Vaswani et al., «Attention Is All You Need», 2017) — революционная архитектура, устранившая рекуррентность в обработке последовательностей. Механизм self-attention позволяет каждому элементу последовательности взаимодействовать с любым другим за один шаг, открыв путь к масштабированию моделей до сотен миллиардов параметров.
Scaled Dot-Product Attention
Ключевая операция трансформера. Три матрицы: Q (queries) ∈ ℝ^{n×d_k}, K (keys) ∈ ℝ^{n×d_k}, V (values) ∈ ℝ^{n×d_v}.
Attention(Q, K, V) = softmax(QKᵀ/√d_k) · V
Пошаговая интерпретация:
- QKᵀ — матрица скалярных произведений всех пар запрос-ключ: насколько «совместим» каждый запрос с каждым ключом. Элемент [i,j] — релевантность позиции j для позиции i.
- /√d_k — масштабирование для предотвращения насыщения softmax (при больших d_k произведения становятся большими → softmax концентрируется на одной позиции → исчезающий градиент).
- softmax(...) — нормировка в вероятности: строки суммируются в 1 — «распределение внимания» над позициями.
- · V — взвешенная сумма значений: выход = смесь значений всех позиций с весами внимания.
Для одного токена «The cat sat»: запрос «sat» смотрит на ключи «The»(0.1), «cat»(0.8), «sat»(0.1) — механизм внимания нашёл, что «сидел» → кот.
Multi-Head Attention
Один механизм внимания видит только один тип взаимодействий. Multi-head Attention использует h параллельных «голов» с разными проекциями:
MultiHead(Q, K, V) = Concat(head₁,...,headₕ) Wᴼ headᵢ = Attention(QWᵢᴾ, KWᵢᴷ, VWᵢᵛ)
Каждая голова обучается «смотреть» на свой аспект: одна голова — синтаксические зависимости (подлежащее-сказуемое), другая — кореференцию («она» → «Мария»), третья — семантическую близость. Размер каждой головы: d_k = d_model/h, сохраняя суммарную вычислительную сложность.
Архитектура трансформера
Positional Encoding: Self-attention инвариантен к перестановке позиций (нет встроенного понятия «порядка»). Добавляем позиционное кодирование к эмбеддингам:
PE(pos, 2i) = sin(pos/10000^{2i/d_model}) PE(pos, 2i+1) = cos(pos/10000^{2i/d_model})
Идея: разные частоты для разных измерений → каждая позиция имеет уникальный «fingerprint».
Encoder слой: Input → MHA → Add&Norm → FFN → Add&Norm. FFN = max(0, xW₁ + b₁)W₂ + b₂ (dim_ff = 4 × d_model). Add&Norm: остаточные связи + LayerNorm.
Decoder слой: Дополнительно Cross-Attention (Q из decoder, K,V из encoder output) — позволяет декодеру «смотреть» на входную последовательность. Маскированный self-attention: предотвращает «заглядывание вперёд» при авторегрессивной генерации.
Сложность self-attention: O(n²·d_model) по времени и памяти (матрица n×n). Для длинных документов (n > 4096) — узкое место.
Улучшения для эффективности
Flash Attention (Dao et al., 2022): не материализует матрицу n×n в памяти. Вычисляет тайлами, используя онлайн-softmax. Результат: 3–6× ускорение, 10–20× меньше памяти. Позволяет обрабатывать контекст 100K+ токенов.
Sparse Attention (Longformer): каждый токен «смотрит» только на локальное окно ± w + несколько глобальных токенов. Сложность O(n·w + n·g). Для длинных документов существенное ускорение.
Grouped Query Attention (GQA, Ainslie et al., 2023): несколько голов Q делят одну пару K,V. Уменьшает KV-кэш при инференсе — ключевой боттлнек при большом batch size. Используется в LLaMA-2, Mistral.
RoPE (Rotary Position Embedding): позиции кодируются через поворот векторов Q,K: Q(pos)·K(pos') зависит только от (pos−pos'). Лучшая экстраполяция на длинные контексты по сравнению с абсолютным PE.
Законы масштабирования
Kaplan et al. (OpenAI, 2020): Loss ∝ N^{-0.076} (vs параметры), Loss ∝ D^{-0.095} (vs данные). Предсказуемое улучшение при масштабировании.
Chinchilla (Hoffmann, DeepMind, 2022): оптимально N ∝ D (токены ≈ параметры). GPT-3 (175B, 300B токенов) «недообучен»: модель 70B на 1.4T токенов (Chinchilla) превзошла его.
Численный пример
Вычислим attention для последовательности длины 3, d_k = 2: Q = [[1,0],[0,1],[1,1]], K = [[1,0],[0,1],[1,1]], V = [[1,0],[0,1],[1,1]]. QKᵀ = [[1,0,1],[0,1,1],[1,1,2]]. После /√2 и softmax строки: [0.42, 0.21, 0.36], [0.21, 0.42, 0.36], [0.23, 0.23, 0.54]. Позиция 3 («1,1») сильнее всего «притягивает» внимание — как семантически «богатый» токен.
Задание: Реализуйте с нуля (PyTorch без nn.MultiheadAttention): Scaled Dot-Product Attention, Multi-Head Attention, Encoder слой (MHA + FFN + LayerNorm + residual). Обучите 2-слойный трансформер-энкодер на задаче классификации тональности (IMDB, 2000 примеров). Визуализируйте матрицы внимания для 3 примеров — какие слова получают наибольший вес?
§ Акт · что дальше