Перейти к содержимому
ПереводыИсследователи и авторы

Lil’Log: семейство трансформеров 2.0

Конспект обзора Лилиан Венг (2023): основы трансформера и позиционные кодирования (синусы, относительные, RoPE, ALiBi), длинный контекст через память и рекуррентность, адаптивные вычисления, разреженное, хеширующее и линейное внимание, трансформеры в RL — с картой «что из этого живо в LLM 2026 года».

  • Пост — каталог модификаций трансформера до начала 2023 года, сгруппированный по задаче, которую решает каждая: позиции, длинный контекст, адаптивные вычисления, эффективное внимание, применение в RL.
  • Корень почти всех проблем — квадратичная цена внимания: время O(L2d)O(L^2 d) и память O(L2)O(L^2) по длине LL.
  • Позиционные кодирования прошли путь от синусов, прибавляемых ко входу, к схемам, которые меняют сами оценки внимания в каждом слое: относительные позиции, ротационные позиционные эмбеддингиротационные позиционные эмбеддинги (RoPE)EN rotary position embedding (RoPE)RoPE предложен в Китае (Су Цзяньлинь и соавторы, компания Zhuiyi). Сейчас используется почти во всех LLM., ALiBiALiBi (линейные смещения внимания)EN Attention with Linear Biases (ALiBi)К оценке внимания прибавляется штраф, линейно растущий с расстоянием, свой наклон у каждой головы (Press и др., 2021). Использовался в BLOOM и MPT; позже уступил RoPE..
  • Длинный контекст пробовали получать четырьмя путями: кэш прошлых сегментов (Transformer-XL), внешняя память с поиском ближайших соседей (kNN-LM, Memorizing Transformer), штраф за расстояние (ALiBi) и рекуррентность (Universal Transformer).
  • Эффективное внимание — три семейства: фиксированные разреженные шаблоны (локальное окно, шаг, глобальные токены), внимание по содержимому (хеширование, кластеризация) и низкоранговые/ядерные приближения (Linformer, Performer).
  • Из всего каталога в больших LLM 2026 года выжили немногие идеи — RoPE, скользящее окно, разреженность «по содержимому» и линейное внимание в гибридах; карта ниже показывает, где они в курсе.

Первую часть («Основы трансформера») читайте как повторение после уроков 4.4.2, 4.4.3, 4.5.1 и 4.5.2 «Позиционное кодирование». Остальное — справочник к ступени 5: разделы «Длинный контекст» и «Эффективное внимание» — к урокам 5.5.2 «Разреженное внимание» и 5.5.3 «Линейное внимание».

Помните о дате: пост написан в январе 2023 года. В нём нет того, что стало стандартом позже: внимание с группами запросоввнимание с группами запросов (GQA)EN grouped-query attention (GQA)Головы запросов делятся на G групп, у каждой группы своя пара K/V. G = H — это MHA, G = 1 — MQA. Стандарт Llama 3 и Qwen (Ainslie и др., 2023). и многоголовое латентное вниманиемногоголовое латентное внимание (MLA)EN multi-head latent attention (MLA)Предложено DeepSeek в DeepSeek-V2 (2024). (уроки 5.2.1–5.2.2), FlashAttention (5.7.2), интерполяции RoPE для длинного контекста (5.5.1), смесь экспертовсмесь экспертов (MoE)EN mixture of experts (MoE) в современном виде (5.3). Новичку можно пропустить разделы про Compressive Transformer, SPALM, Depth-Adaptive Transformer, ETC и Routing Transformer.

Венг начинает с таблицы обозначений: dd — размер модели, hh — число голов, LL — длина сегмента, Q\mathbf{Q}, K\mathbf{K}, V\mathbf{V} — запросы, ключи и значения (XWq\mathbf{X}\mathbf{W}^q и т. д.), A\mathbf{A} — матрица внимания L×LL \times L. Затем — коротко:

  • Внимание — взвешенное среднее значений с весами, которые сеть учит; самовнимание — внимание частей одного примера друг к другу. Само по себе оно не знает порядка элементов: это операция над множеством.
  • Масштабированное скалярное внимание: attn(Q,K,V)=softmax(QK⊤/dk) V\mathrm{attn}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \mathrm{softmax}(\mathbf{Q}\mathbf{K}^\top/\sqrt{d_k})\,\mathbf{V}. Через SiS_i Венг обозначает множество ключей, на которые смотрит ii-й запрос, — это обозначение пригодится для разреженного внимания: в полном внимании SiS_i — все позиции, в разреженном — их часть.
  • Многоголовое внимание: hh голов в подпространствах размера d/hd/h, конкатенация, выходная проекция Wo\mathbf{W}^o.
  • Кодировщик–декодер: стопка одинаковых блоков (самовнимание + поточечный FFN, вокруг каждого — residual и LayerNorm); в декодере ещё маска будущего и перекрёстное внимание к кодировщику.
ВидИдеяГде в курсе
синусоидальноек эмбеддингу прибавляется вектор синусов и косинусов с длинами волн от 2π2\pi до 10000⋅2π10000 \cdot 2\pi4.5.2
обучаемое абсолютноеу каждой позиции свой обучаемый вектор (иногда — свой в каждом слое)4.5.2
относительное (Shaw и др., 2018)обучаемые векторы для смещения j−ij - i, обрезанного до ±k\pm k; так модель обобщается на невиданные длины4.5.2
Transformer-XLоценку qikjq_i k_j раскладывают на четыре слагаемых «содержимое/позиция» и заменяют абсолютные позиции относительными ri−jr_{i-j} плюс два обучаемых вектора uu, vv—
RoPE (Su и др., 2021)запрос и ключ поворачивают на угол, пропорциональный позиции; в скалярном произведении остаётся только разность позиций4.5.2, 5.5.1
ALiBi (Press и др., 2022)к оценке прибавляют штраф, линейный по расстоянию, с разным наклоном в каждой голове4.5.2

Ключевое свойство RoPE: (Riq)⊤(Rjk)=q⊤Rj−i k(R_i q)^\top (R_j k) = q^\top R_{j-i}\, k — поворот на ii и на jj вместе дают поворот на разность. Венг подчёркивает, что по сути это те же синусоиды, только записанные как матрица поворота и применённые в каждом слое к Q\mathbf{Q} и K\mathbf{K}, а не один раз ко входу.

Длина входа на инференсе ограничена длиной, на которой модель обучали, а наивное удлинение упирается в квадратичную цену. Венг выделяет четыре подхода.

Память контекста. Transformer-XL (Dai и др., 2019) решает проблему «нарезки на сегменты»: без неё модель не видит ничего за границей сегмента, плохо предсказывает первые токены каждого сегмента и при сдвиге окна на один токен пересчитывает всё заново. Решение — хранить скрытые состояния предыдущего сегмента (без градиента) и подавать их как дополнительные ключи и значения; поэтому и понадобилось относительное кодирование позиций. Compressive Transformer (Rae и др., 2019) добавляет второй уровень памяти: старые активации не выбрасываются, а сжимаются (свёрткой, пулингом и т. п.), и для обучения сжатия есть две вспомогательные потери.

Внешняя недифференцируемая память. kNN-LM (Khandelwal и др., 2020) смешивает предсказание обычной LM с предсказанием поиска ближайших соседей по огромной базе «контекст → следующий токен». SPALM совмещает кэш в стиле Transformer-XL (краткосрочная память) и kNN-базу (долгосрочная). Memorizing Transformer (Wu и др., 2022) ставит ближе к верху декодера слой внимания, который ищет kk ближайших пар ключ–значение во внешнем FIFO-кэше и смешивает результат с обычным локальным вниманием через обучаемый гейт. Связь с курсом: это предки RAG (генерация с дополнением извлечёнными даннымигенерация с дополнением извлечёнными данными (RAG)EN retrieval-augmented generation (RAG), ступень 8.2) — только поиск здесь встроен внутрь модели.

Штраф за расстояние. DA-Transformer и ALiBi явно добавляют к оценке внимания функцию расстояния между запросом и ключом. В ALiBi это softmax(qiK⊤+αh⋅[0,−1,−2,…,−(i−1)])\mathrm{softmax}(q_i \mathbf{K}^\top + \alpha_h \cdot [0, -1, -2, \ldots, -(i-1)]) — сильное предпочтение недавнего. Венг приводит результат авторов: модель на 1,3 млрд параметров, обученная на длине 1024, работала на инференсе с длиной около 2048.

Рекуррентность. Universal Transformer (Dehghani и др., 2019) применяет один и тот же блок много раз (веса общие), а число повторов для каждого токена выбирает механизм адаптивного времени вычислений — тот самый ACT из статьи Distill о дополненных RNN.

Идея раздела: не всем токенам и не всем головам нужен одинаковый объём вычислений.

  • Адаптивная длина внимания (Sukhbaatar и др., 2019): у каждой головы своя обучаемая длина окна, с мягкой «рампой»-маской на краю, чтобы она была дифференцируемой. Оказалось, что нижним слоям хватает коротких окон, а длинные нужны лишь части голов верхних слоёв.
  • Адаптивная глубина — Depth-Adaptive Transformer (Elbayad и др., 2020) и CALM (Schuster и др., 2022): к слоям приделаны классификаторы «раннего выхода», и простые токены покидают сеть раньше. Порог уверенности надо калибровать: CALM подбирает его статистической процедурой Learn then Test, чтобы качество гарантированно не упало ниже заданного.

Самый длинный раздел. Схема ниже — наша, она группирует то, что описывает Венг.

flowchart TD
E["Как удешевить внимание O(L²)"] --> F["Фиксированные разреженные шаблоны"]
E --> C["Разреженность по содержимому"]
E --> R["Низкий ранг / ядра"]
F --> F1["Локальное окно: Image Transformer"]
F --> F2["Шаг и блоки: Sparse Transformer, Blockwise"]
F --> F3["Окно + глобальные токены: ETC, Longformer, Big Bird"]
C --> C1["LSH-хеширование: Reformer"]
C --> C2["k-means кластеры: Routing Transformer"]
R --> R1["Проекция длины L→k: Linformer"]
R --> R2["Случайные признаки вместо softmax: RFA, Performer"]
Карта раздела «Эффективное внимание» (наша схема).

Фиксированные шаблоны.

  • Локальное окно (Image Transformer, Parmar и др., 2018): каждый токен смотрит только на соседей в одномерном или двумерном блоке — цена растёт линейно.
  • Шаг (Sparse Transformer, Child и др., 2019): «факторизованное» внимание из двух видов голов — локальной и «через каждые L\sqrt{L} позиций»; за два шага информация доходит от любой позиции к любой. Это позволило обучать сети на последовательностях до 16 384 элементов. Blockwise Attention (Qiu и др., 2019) разбивает матрицу внимания на блоки и оставляет лишь их часть.
  • Локальное + глобальное (ETC, Longformer, Big Bird): скользящее окно плюс несколько выделенных токенов (например, [CLS]), которые видят всё и видны всем. Longformer добавляет «прореженные» (dilated) окна и растит окно от нижних слоёв к верхним; Big Bird вместо прореживания добавляет случайные связи — случайный граф хорошо передаёт информацию.

Внимание по содержимому.

  • Reformer (Kitaev и др., 2020): после softmax важны только самые большие оценки, поэтому для каждого запроса ищут ближайшие ключи хешированием, чувствительным к близости (LSH; локально-чувствительное хешированиелокально-чувствительное хеширование (LSH)EN locality-sensitive hashing (LSH)): h(x)=arg⁡max⁡([xR;−xR])h(x) = \arg\max([xR; -xR]) со случайной матрицей RR. Похожие векторы попадают в одну корзину, внимание считают внутри корзин — O(Llog⁡L)O(L \log L). Второй приём — обратимые residual-слои: активации можно восстановить из следующего слоя и не хранить.
  • Routing Transformer (Roy и др., 2021): то же, но корзины — кластеры онлайн-k-means.

Низкий ранг и ядра.

  • Linformer (Wang и др., 2020): проецирует ключи и значения по длине из LL в k≪Lk \ll L строк — линейная сложность.
  • RFA (Peng и др., 2021) и Performer (Choromanski и др., 2021): приближают exp⁡(q⊤k)\exp(q^\top k) скалярным произведением случайных признаков ϕ(q)⊤ϕ(k)\phi(q)^\top \phi(k) (теорема Rahimi и Recht, 2007). Тогда можно сначала перемножить ϕ(K)⊤V\phi(\mathbf{K})^\top \mathbf{V} и получить линейную по LL цену, а в причинном случае — рекуррентное обновление состояния. Performer берёт положительные ортогональные случайные признаки, чтобы уменьшить ошибку.

Что из этого живо в 2026 году (наша сводка по курсу, не из поста):

Идея из постаЧто с ней сталоУрок
локальное окно + «стоки» вниманияскользящее окно в части слоёв современных LLM5.5.2
разреженность по содержимомувыбор top-k блоков обученным «индексатором» (NSA, DSA в DeepSeek)5.5.2
ядерное/линейное вниманиелинейное внимание с гейтами и дельта-правилом в гибридных моделях5.5.3
RoPEстандарт; для длинного контекста — интерполяции (NTK, YaRN)4.5.2, 5.5.1
ALiBiвстречается реже, вытеснен RoPE4.5.2
Reformer, Linformer, Performerв больших LLM почти не используются: проиграли плотному вниманию с FlashAttention5.7.2

5. Трансформеры для обучения с подкреплением

Заголовок раздела «5. Трансформеры для обучения с подкреплением»
  • GTrXL (Parisotto и др., 2019): Transformer-XL, который стабильно учится в RL, если вынести LayerNorm на вход подблоков и заменить residual-сложение гейтом в стиле GRU.
  • Decision Transformer (Chen и др., 2021): RL как условное моделирование последовательности. Траекторию записывают тройками (желаемая будущая отдача, состояние, действие) и обучают трансформер предсказывать действие. На инференсе задают высокую желаемую отдачу — и модель действует «как в хороших эпизодах». Это офлайн-RL: модель учится по фиксированному набору траекторий.

Проверьте два свойства из раздела о позициях: у RoPE скалярное произведение зависит только от разности позиций, а ALiBi — это просто матрица штрафов, прибавляемая к оценкам.

import numpy as np
def rope(x, pos, base=10000):
"""Поворачивает пары координат вектора x на углы pos·θ_k (RoPE)."""
d = x.shape[-1]
theta = base ** (-np.arange(0, d, 2) / d) # θ_k = 10000^(-2k/d)
ang = pos * theta
x1, x2 = x[0::2], x[1::2] # пары (x_0, x_1), (x_2, x_3), ...
out = np.empty_like(x)
out[0::2] = x1 * np.cos(ang) - x2 * np.sin(ang)
out[1::2] = x1 * np.sin(ang) + x2 * np.cos(ang)
return out
rng = np.random.default_rng(0)
q, k = rng.normal(size=8), rng.normal(size=8)
for i, j in [(5, 3), (105, 103), (1000, 998)]: # везде расстояние i − j = 2
print(i, j, round(rope(q, i) @ rope(k, j), 6)) # скалярное произведение одно и то же
# ALiBi: штраф за расстояние, у каждой головы свой наклон
L, heads = 5, 8
slopes = 2.0 ** (-np.arange(1, heads + 1)) # 1/2, 1/4, ..., 1/256
dist = np.arange(L)[None, :] - np.arange(L)[:, None] # j − i
bias_head0 = slopes[0] * np.minimum(dist, 0) # только прошлое: 0, −0.5, −1, ...
print(bias_head0)

Ожидаемый вывод:

5 3 -1.763129
105 103 -1.763129
1000 998 -1.763129
[[ 0. 0. 0. 0. 0. ]
[-0.5 0. 0. 0. 0. ]
[-1. -0.5 0. 0. 0. ]
[-1.5 -1. -0.5 0. 0. ]
[-2. -1.5 -1. -0.5 0. ]]

Наклоны 2−1,2−2,…,2−82^{-1}, 2^{-2}, \ldots, 2^{-8} для 8 голов — схема из статьи ALiBi. Верхний треугольник в реальной модели всё равно закрыт причинной маской, поэтому мы оставили там нули.

Дальше:

  1. Нарисуйте (matplotlib.imshow) маски для локального окна, «шага» Sparse Transformer и схемы Longformer при L=32L = 32 и сравните долю ненулевых элементов с полной матрицей.
  2. Реализуйте «внимание через случайные признаки» по формулам раздела RFA и сравните его результат с точным softmax для L=64L = 64, d=16d = 16 при разном числе признаков.
  3. Сделайте практику уроков 5.5.2 и 5.5.3, где эти идеи доведены до современных вариантов.
ENRU
scaled dot-product attentionмасштабированное скалярное внимание
multi-head self-attentionмногоголовое самовнимание
positional encoding: sinusoidal, learned, relativeпозиционное кодирование: синусоидальное, обучаемое, относительное
rotary position embedding (RoPE)вращательное позиционное кодирование (RoPE)
attention with linear biases (ALiBi)внимание с линейными штрафами (ALiBi)
context segmentationнарезка контекста на сегменты
external memory, kNNвнешняя память, поиск ближайших соседей
adaptive attention span, early exitадаптивная длина внимания, ранний выход
sparse / strided / dilated attentionразреженное / с шагом / прореженное внимание
global tokensглобальные токены
locality-sensitive hashing (LSH)хеширование, чувствительное к близости
reversible residual layerобратимый residual-слой
low-rank attention, random featuresнизкоранговое внимание, случайные признаки
decision transformer, return-to-goDecision Transformer, оставшаяся отдача