Диагностика Mock-интервью
Главная · Языковые модели: от n-грамм до трансформера

Современные архитектуры: RoPE, MoE, GQA

Со времён статьи «Attention is All You Need» (2017) скелет трансформера не изменился, но почти каждую деталь заменили на более эффективную. Обзор апгрейдов, которые стоят за Llama, Mixtral и DeepSeek — и которые любят спрашивать на собеседованиях.

Позиции: от синусоид к RoPE

Оригинальный трансформер добавлял к эмбеддингам синусоидальные волны, GPT-2 — обучаемые векторы позиций (learned positional embeddings). У обоих подходов позиция — абсолютная: «ты токен №1337». Но языку важнее относительное: «прилагательное стоит за два токена до существительного».

RoPE (Rotary Position Embedding) решает это красиво: координаты векторов Q и K разбиваются на пары, и каждая пара вращается на угол, пропорциональный позиции токена (у каждой пары — своя частота вращения). Тогда скалярное произведение Q·K зависит только от разности углов, то есть от относительного сдвига между токенами:

Qm·Kn = f(Q, K, n − m) — позиция входит только как сдвиг n − m

Относительные позиции получаются «бесплатно», без дополнительных параметров, а модели проще (хоть и не идеально) экстраполироваться на длины больше обучающих — на RoPE и его растяжках построены все трюки удлинения контекста в Llama-подобных моделях.

Внимание дешевле: GQA и FlashAttention

При генерации модель хранит K и V всех прошлых токенов — KV-cache. С 32 головами и длинным контекстом кэш съедает гигабайты. MQA (multi-query attention) — радикальное лекарство: Q-голов много, а пара K/V — одна на всех; кэш худеет в число-голов раз, но качество проседает. GQA (grouped-query attention) — золотая середина: Q-головы делятся на группы, каждая группа делит одну пару K/V. В Llama-2-70B — 64 Q-головы и 8 KV-групп: кэш в 8 раз меньше почти без потери качества.

FlashAttention — оптимизация другого сорта: математика та же самая, точное внимание без приближений. Меняется порядок вычислений: скоры считаются блоками в быстрой SRAM-памяти GPU, без выгрузки огромной матрицы n×n в медленную HBM. Внимание упирается не во FLOPs, а в чтение-запись памяти (IO-bound), поэтому выигрыш — в разы по скорости и почти линейная память.

MoE: много параметров, мало вычислений

Смесь экспертов (MoE, Mixture of Experts) заменяет один MLP-блок на N параллельных «экспертов» и маленький роутер (router). Для каждого токена роутер считает скоры экспертов, softmax выбирает top-k (обычно 2 из 8), и токен обрабатывают только они; выходы смешиваются с весами роутера. Знаний в модели — на все N экспертов, вычислений на токен — только на k. Mixtral 8×7B: 47 млрд параметров всего, ~13 млрд активных на токен; так же устроены DeepSeek и, по слухам, GPT-4.

Цена: все 47 млрд надо держать в памяти (экономятся FLOPs, не VRAM), а роутер норовит гонять все токены к паре любимых экспертов — приходится добавлять вспомогательный балансирующий лосс (load balancing loss). Плюс шардинг экспертов по устройствам усложняет инфраструктуру.

Из мелочей, ставших стандартом: SwiGLU вместо ReLU-MLP (гейтированная активация, стабильно чуть лучше) и RMSNorm вместо LayerNorm (только нормировка масштаба, без вычитания среднего — проще и быстрее).

💡 Ключевая мысль Почти все апгрейды бьют в одну цель — цену длинного контекста и инференса: RoPE позволяет тянуть длину, GQA сжимает KV-cache, FlashAttention убирает квадратичную память, MoE наращивает знания без роста FLOPs.

Длинный контекст: почему всё ещё больно

Даже со всеми оптимизациями контекст в сотни тысяч токенов дорог по двум причинам: скоры внимания — это по-прежнему O(n²) вычислений на префилле, а KV-cache растёт линейно с длиной и при больших n съедает память GPU быстрее, чем сами веса. Один из ответов — скользящее окно (sliding window attention, Mistral): каждый токен смотрит только на w последних токенов, стоимость становится линейной, а информация издалека всё равно просачивается — через стопку слоёв рецептивное поле растёт как w × число слоёв.

⚠️ Подводный камень FlashAttention часто называют «приближённым вниманием» — это неверно: он считает ровно ту же формулу, просто в другом порядке и без материализации матрицы n×n. И наоборот: MoE часто считают способом сэкономить память — тоже неверно, он экономит FLOPs, а памяти требует под все параметры сразу.
🎤 На собеседовании
  • «Почему RoPE, а не learned embeddings?» — относительные позиции без параметров, лучшая экстраполяция по длине; вращение Q/K оставляет скалярное произведение зависимым только от сдвига.
  • «Что уменьшает GQA и на что это влияет?» — KV-cache (и трафик памяти на декодинге), то есть скорость и стоимость инференса; качество почти не страдает.
  • «MoE — в чём trade-off?» — знаний много при малых FLOPs на токен, но вся модель должна жить в памяти, плюс балансировка роутера и сложный шардинг.
  • «Как модели тянут контекст 128k?» — RoPE-масштабирование, GQA против распухания кэша, FlashAttention против квадратичной памяти, иногда sliding window.