🧱 01. Архитектура Transformer
📌 1. Почему Transformer
До 2017 года доминировали RNN/LSTM/GRU. Проблемы:
- Последовательная обработка (Sequential processing) — обрабатывают токены по одному, O(n) шагов
- Исчезающие градиенты (Vanishing gradients) — длинные зависимости забываются
- Параллелизм — невозможен на уровне последовательности
Определение
Transformer (Vaswani et al., «Attention Is All You Need», 2017) — архитектура на основе self-attention: каждый токен видит все остальные за O(1) шагов, полный параллелизм по последовательности, прямой путь градиентов к любому токену.
📌 2. Архитектура: Encoder-Decoder
Input → [Tokenize] → [Embedding + Positional] → ENCODER (×N)
↓
Encoded rep.
↓
Output ← [Tokenize⁻¹] ← DECODER (×N) ← [Shifted Output] ← ┘
flowchart LR Input["Input"] --> Tokenize["Tokenize"] Tokenize --> Embed["Embedding + Positional"] Embed --> Encoder["ENCODER ×N"] Encoder --> EncRep["Encoded rep."] EncRep --> Decoder["DECODER ×N"] Shifted["Shifted Output"] --> Decoder Decoder --> Detokenize["Tokenize⁻¹"] Detokenize --> Output["Output"]
🔹 Энкодер (Encoder, BERT-style)
- Вход: вся последовательность токенов
- Multi-Head Self-Attention — каждый токен «смотрит» на все остальные
- Feed-Forward Network (FFN) — два линейных слоя с ReLU/GELU
- Residual connections + LayerNorm — стабилизация обучения
- Выход: contextualized embeddings (каждый токен имеет контекст)
🔹 Декодер (Decoder, GPT-style)
- Вход: сгенерированные токены (auto-regressive)
- Masked Self-Attention — токен видит только предыдущие (causal mask)
- Cross-Attention — смотрит на output энкодера (в encoder-decoder моделях)
- FFN + Residual + LayerNorm
- Выход: распределение вероятностей следующего токена
📌 3. Self-Attention — ядро
На собеседовании
Формула attention — must know:
Attention(Q, K, V) = softmax(Q·Kᵀ / √d_k) · V. Объясните роль Q/K/V и зачем делить на √d_k.
⚙️ Формула
Attention(Q, K, V) = softmax(Q·Kᵀ / √d_k) · V
Где:
- Q (Query) — «что я ищу» — линейная проекция входа: Q = X·W_Q
- K (Key) — «что я предлагаю» — K = X·W_K
- V (Value) — «что я знаю» — V = X·W_V
- d_k — размерность key (для масштабирования, чтобы softmax не насыщался)
- √d_k — стабилизирует градиенты при больших d_k
💡 Интуиция
Каждый токен создаёт 3 вектора: запрос, ключ, значение.
- Q·Kᵀ — «насколько я (токен) релевантен каждому другому токену?»
- softmax — нормализует в веса (сумма = 1)
- ·V — взвешенная сумма значений → новое представление токена с учётом контекста
⚙️ Multi-Head Attention
Вместо одного attention — h параллельных head (обычно 8–96). Каждый head обучается смотреть на разные аспекты (синтаксис, семантика, позиция).
Multi-Head(Q,K,V) = Concat(head_1, ..., head_h) · W_O
где head_i = Attention(Q·W_Q^i, K·W_K^i, V·W_V^i)
Размерность: d_model разделяется на h голов → каждая голова работает с d_model/h.
📌 4. Positional Encoding (позиционное кодирование)
Self-attention не чувствителен к порядку — нужен способ сообщить позицию.
🔹 Синусоидальное (Sinusoidal, оригинальный Transformer)
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
- Каждый токен получает уникальный «позиционный fingerprint»
- Может экстраполировать на позиции длиннее обученных
🔹 Обучаемые позиционные эмбеддинги (Learned Positional Embeddings, GPT, BERT)
- Просто обучаемая матрица [max_len × d_model]
- Проще, но не экстраполирует за max_len
🔹 RoPE (Rotary Position Embedding) — современный стандарт
- Позиция кодируется поворотом векторов Q и K
- Относительная позиция: Q·Kᵀ зависит только от |pos_q - pos_k|
- Лучшая экстраполяция на длинные контексты
- Используется в: Llama, GLM, DeepSeek, Mistral
🔹 ALiBi (Attention with Linear Biases)
- Нет positional encoding — вместо этого bias в attention scores
- bias = -m · |i - j| (штраф за расстояние)
- Тоже экстраполирует хорошо
📌 5. Feed-Forward Network (FFN)
FFN(x) = Linear₂(GELU(Linear₁(x)))
- Расширение: d_model → 4×d_model → d_model
- Иногда больше: d_model → 8×d_model (GLM-5.2 и др.)
- SwiGLU (современный стандарт): FFN(x) = (Swish(x·W₁) ⊙ x·W₃)·W₂
- Использует gating — дополнительный обучаемый «вентиль»
- Лучше обычного FFN при том же количестве параметров
📌 6. LayerNorm и Residual Connections
🔹 Residual (Skip Connection)
output = LayerNorm(x + Sublayer(x))
- Градиент может течь напрямую через сложение
- Позволяет строить глубокие модели (96 слоёв у GPT-3)
- Pre-LN vs Post-LN: Pre-LN (нормализация до sublayer) стабильнее при обучении
🔹 RMSNorm (Root Mean Square Normalization)
- Упрощённый LayerNorm — без вычитания среднего
RMSNorm(x) = x / RMS(x) · γгде RMS(x) = √(mean(x²))- Быстрее, работает не хуже
- Используется в: Llama, GLM, Mistral
📌 7. Современные Decoder-only модели
Почти все production LLM (GPT, Claude, Llama, GLM, DeepSeek) — decoder-only.
Почему не encoder-decoder?
- Проще (один стек слоёв)
- Лучше масштабируется
- Auto-regressive generation = естественно для текста
- Encoder-decoder нужен для seq2seq (перевод, суммаризация) — но decoder-only тоже справляется
⚙️ Типичная архитектура (Llama/GLM-style)
[Token Embedding]
→ [RoPE Positional]
→ ×N:
[RMSNorm] → [Multi-Head Attention (causal)] → [Residual]
[RMSNorm] → [SwiGLU FFN] → [Residual]
→ [RMSNorm]
→ [Linear projection → vocab_size]
→ [Softmax → probabilities]
⚙️ Ключевые гиперпараметры
- d_model — размерность скрытого состояния (4096–16384)
- n_layers — количество слоёв (32–120)
- n_heads — количество attention голов (32–96)
- d_ff — размер FFN (4×–8× d_model)
- vocab_size — размер словаря (32000–256000)
- n_ctx — максимальный контекст (4K–1M)
📌 8. MoE (Mixture of Experts)
Вместо одного FFN — множество FFN (экспертов), router выбирает 1-2 на токен.
Router(x) → top-k experts → sum(expert_i(x) · gate_i)
- Преимущества: больше параметров без роста вычислений (sparse activation)
- DeepSeek-V3: 671B параметров, но только 37B активных на токен
- GLM-5.2: предположительно dense, не MoE
- Trade-off: больше VRAM нужно для всех экспертов, но меньше FLOPs на инференсе
🔹 Expert Routing (маршрутизация экспертов)
- Token routing: каждый токен → top-k экспертов
- Expert load balancing: нужно балансировать нагрузку (иначе одни эксперты перегружены)
- Shared experts: часть экспертов всегда активна (DeepSeek-V3)
📌 9. KV Cache
Важно
KV Cache — главный потребитель памяти при inference. Для Llama-70B с контекстом 128K и fp16 кэш может занимать ~80 GB на один запрос.
При auto-regressive generation каждый новый токен требует пересчёта attention для всех предыдущих. KV Cache — кэширование Key и Value матриц предыдущих токенов.
Без кэша: генерация токена N = O(N²) вычислений attention
С кэшем: генерация токена N = O(N) — только новый токен
💾 Память KV Cache
- Размер: 2 × n_layers × n_heads × d_head × seq_len × batch × dtype_bytes
- Для Llama-70B (80 слоёв, 64 головы, 128 d_head, 128K контекст, fp16):
- 2 × 80 × 64 × 128 × 131072 × 2 = ~80 GB на один запрос!
⚙️ Оптимизации
- PagedAttention (vLLM) — KV Cache в страницах (как virtual memory)
- KV Cache Quantization — int8/int4 вместо fp16
- KV Cache Offloading — в CPU RAM при нехватке GPU
- Sliding Window — кэш только последних N токенов (Mistral)
📌 10. Scaling Laws (законы масштабирования)
Chinchilla (Hoffmann et al., 2022): для оптимального обучения модели с N параметрами нужно ~20N токенов.
- GPT-3 (175B) обучался на 300B токенов — недообучен (должно быть 3.5T)
- Chinchilla (70B) на 1.4T токенов — лучше при меньшем размере
- Современные модели: Llama-3 (70B) на 15T токенов — переобучены по Chinchilla, но это намеренно (лучше inference)
Правило: compute-optimal = 20 tokens per parameter. Но если inference дороже training — можно переобучить.
📌 11. Контекстное окно
💡 Как модели понимают длинные тексты
1. RoPE extrapolation / interpolation
- Interpolation: сжимаем позиции в диапазон [0, max_len]
- Extension (NTK, YaRN): модифицируем частоты RoPE для экстраполяции
- Llama-3, GLM-5.2: используют YaRN или подобное для 128K-1M контекста
2. Sparse Attention
- Не все токены attend на все — только локальное окно + глобальные токены
- Longformer, BigBird — ранние варианты
- Modern: Grouped-Query Attention (GQA) — группы head делят KV
3. Ring Attention / Sequence Parallelism
- Разделение контекста между GPU
- Каждый GPU обрабатывает свой chunk + передаёт KV по кольцу
📌 12. Глоссарий (для собеседований)
| Термин | Значение |
|---|---|
| Авторегрессия (Auto-regressive) | Каждый токен генерируется на основе предыдущих |
| Причинная маска (Causal mask) | Матрица, запрещающая токену видеть будущие токены |
| d_model | Размерность скрытого состояния модели |
| Эмбеддинг (Embedding) | Векторное представление токена |
| FFN | Feed-Forward Network — двухслойная сеть после attention |
| Fine-tuning (дообучение) | Дообучение модели на специфичных данных |
| GQA | Grouped-Query Attention — группы head делят KV (экономия памяти) |
| Inference (инференс) | Использование обученной модели для генерации |
| KV Cache | Кэш Key/Value матриц для ускорения auto-regressive generation |
| Multi-Head (мультиголовое внимание) | Несколько параллельных attention механизмов |
| Pre-training (предобучение) | Обучение на большом корпусе текста |
| RoPE | Rotary Position Embedding — позиционное кодирование поворотом |
| SwiGLU | Gated FFN с Swish активацией — современный стандарт |
| Токен (Token) | Единица текста (~0.75 слова для английского, ~1.6 символа для русского) |