Модуль V·Статья I·~3 мин чтения

Механизм внимания и архитектура трансформера

Трансформеры и большие языковые модели

Превратить статью в подкаст

Выберите голоса, формат и длину — AI запишет аудио

Механизм внимания и архитектура трансформера

Трансформер (Vaswani et al., «Attention Is All You Need», 2017) — революционная архитектура, устранившая рекуррентность в обработке последовательностей. Self-attention позволяет каждому элементу взаимодействовать с любым другим напрямую, без рекуррентных узких мест. Трансформеры сейчас доминируют в NLP, зрении, белковой биологии и аудио.

Механизм внимания (Attention)

Интуиция: При переводе «The animal didn't cross the street because it was too tired» → нужно понять, что «it» = «animal». RNN «забывает» дальние зависимости. Attention позволяет явно «смотреть» на нужные позиции при генерации каждого токена.

Scaled Dot-Product Attention:

Attention(Q, K, V) = softmax(QKᵀ/√d_k) · V

Q (queries) ∈ ℝ^{n×d_k}: «что ищем». K (keys) ∈ ℝ^{m×d_k}: «что предлагают» все позиции. V (values) ∈ ℝ^{m×d_v}: «что берём» из выбранных позиций.

Шаги: (1) QKᵀ ∈ ℝ^{n×m}: скалярные произведения каждой пары запрос-ключ. Элемент [i,j]: насколько позиция j «отвечает» на запрос позиции i. (2) /√d_k: масштабирование предотвращает слишком большие значения при высоком d_k (иначе softmax насыщается). (3) softmax: нормировка в распределение (строки суммируются в 1). (4) ·V: взвешенная сумма значений.

Сложность: O(n²·d_k) по памяти и времени — квадратично по длине последовательности.

Multi-Head Attention

Один mechanism внимания видит один аспект. Multi-head: h голов, каждая с разными проекциями (W^Q_i, W^K_i, W^V_i):

MultiHead(Q,K,V) = Concat(head₁,...,headₕ) W^O headᵢ = Attention(QW^Q_i, KW^K_i, VW^V_i)

d_k = d_v = d_model/h. Головы специализируются: одна — на синтаксических зависимостях, другая — на семантической близости, третья — на кореференции. W^O ∈ ℝ^{hd_v × d_model} — проекция конкатенации.

Архитектура трансформера

Positional Encoding: Self-attention инвариантен к перестановке позиций — нет встроенного понятия «порядка». PE(pos, 2i) = sin(pos/10000^{2i/d_model}), PE(pos, 2i+1) = cos(...). Добавляем к эмбеддингам токенов. Learnable PE (BERT): позиционные эмбеддинги обучаются.

Encoder слой: Входные токены → Add(x, MHA(x, x, x)) → LayerNorm → Add(·, FFN(·)) → LayerNorm. FFN = max(0, xW₁ + b₁)W₂ + b₂ (d_ff = 4·d_model). Residual connections + LayerNorm = стабильное обучение.

Decoder слой: Masked self-attention (не видит будущих токенов) + Cross-attention (Q из decoder, K,V из encoder) + FFN. Маскирование для авторегрессивной генерации: при генерации токена t не должен «видеть» токены t+1,...

Pre-training/Fine-tuning: BERT: Masked LM + NSP → fine-tune на NLU задачах (QA, NER, entailment). GPT: LM (next token prediction) → few-shot и zero-shot.

Эффективные альтернативы

Flash Attention (Dao et al., 2022): Не материализует матрицу внимания n×n. Вычисляет тайлами, используя online softmax. 3–6× ускорение, 10–20× меньше памяти (HBM). Позволяет 100K+ контекстное окно.

Sparse Attention (Longformer): Локальное окно ±w + несколько глобальных токенов. O(n·w) вместо O(n²). Efficient для длинных документов.

Grouped Query Attention (GQA, Ainslie et al., 2023): Несколько Q-голов делят K,V. Уменьшает KV-кэш при инференсе. LLaMA-2-70B: 8 KV-голов на 64 Q-головы.

RoPE (Rotary Position Embedding): Позиции кодируются через поворот Q и K: Q(pos) = R(pos)·Q, K(pos) = R(pos)·K. Скалярное произведение Q·K зависит только от (pos₁−pos₂) — относительная позиция. Лучше экстраполируется на длинные контексты.

Численный пример

Трансформер для MT (русский → английский): n=20 токенов, d_model=512, h=8, N=6 слоёв. Параметров: 6×(4·512² + 2·512·2048) = 6×(1.05M + 2.1M) ≈ 19M. KV-cache при инференсе (one token at time): 6 слоёв × 2 (K,V) × 8 голов × d_k = 6×2×512 = 6144 floats per token. При 1000 токенов: 6144×1000×4 байта = 24 МБ (небольшая модель).

Attention паттерны (визуализация): голова 1 — местные грамматические зависимости (прилагательное→существительное). Голова 5 — глобальные семантические (subject→predicate).

Задание: Реализуйте упрощённый трансформер с нуля (PyTorch): Encoder-only, 2 слоя, 4 головы, d_model=64. Задача: sentiment classification IMDB (25K reviews). (1) Токенизация BPE (tokenizers library, vocab=5000). (2) Обучите с нуля на 5000 примеров. (3) Сравните с BERT fine-tune на тех же данных (трансформеры = universal language understanding?). (4) Визуализируйте матрицы внимания для 5 примеров — какие слова «смотрят» на «not», «terrible», «excellent»?

§ Акт · что дальше