• Русский
  • За пределами классического трансформера

    Трансформер из главы 6 тянет на себе языковые модели с 2017 года, но у него две дорогие привычки. Каждый новый токен читает ключи и значения всех предыдущих токенов, и эти ключи и значения копятся в KV-кэше, который растёт вместе с диалогом. А ещё он пишет текст строго по одному токену за проход.

    Большая часть новых архитектур борется с одной из этих привычек. В этой главе — главные идеи: сжать кэш, заменить внимание памятью фиксированного размера, смешать одно с другим, писать много токенов сразу и кормить модель тем, что вообще не является текстом.

    Многоголовое латентное внимание: сжать кэш

    В главе 10 было два способа уменьшить KV-кэш: дать нескольким головам запросов общую голову ключей и значений (GQA) или одну на всех (MQA). Общие головы экономят память, но теряют часть того, что могли бы выразить отдельные головы.

    Многоголовое латентное внимание (MLA), появившееся в DeepSeek-V2 в 2024 году, не делит, а сжимает. Для каждого токена модель считает один маленький латентный вектор cc («латентный» значит скрытый: это сжатая сводка, которой модель пользуется внутри себя) и кэширует только его. Когда вниманию нужны ключи и значения, они восстанавливаются из латента для каждой головы умножением на матрицу, которая снова увеличивает вектор (повышающая проекция):

    ct=Wdown ht,kt(i)=WK(i) ct,vt(i)=WV(i) ctc_t = W_{\text{down}}\, h_t, \qquad k_t^{(i)} = W_{K}^{(i)}\, c_t, \qquad v_t^{(i)} = W_{V}^{(i)}\, c_t

    Здесь hth_t — скрытый вектор токена, WdownW_\text{down} сжимает его в латент, а у каждой головы ii есть свои матрицы WK(i)W_K^{(i)} и WV(i)W_V^{(i)}, чтобы восстановить её ключ и значение. Выигрыш виден по размерам. В модели с рисунка ниже, близкой к DeepSeek-V3, обычное многоголовое внимание хранит 2 × 128 голов × 128 чисел = 32 768 чисел на токен в каждом слое. MLA хранит латент из 512 чисел плюс позиционный ключ из 64: 576 чисел, примерно в 57 раз меньше.

    Восстанавливать каждый ключ каждой головы на каждом шаге было бы медленно, но это и не нужно. Ключ используется только в скалярном произведении с запросом, а q⋅(WKc)=(WK⊤q)⋅cq \cdot (W_K c) = (W_K^\top q) \cdot c: достаточно один раз умножить запрос на WK⊤W_K^\top, и его можно сравнивать прямо с латентом из кэша. Матрица значений так же «вклеивается» в матрицу выхода. Поворотные позиции (глава 4) такую склейку не переживают, поэтому MLA хранит для каждого токена ещё небольшой отдельный ключ только для позиции.

    Рисунок 14.1 · Что лежит в KV-кэше
    токенcлатент · в кэшеK, V · восстанавливается на лету
    Хранится на токен в каждом слое: 576 чисел
    один квадрат = 256 чисел

    Храним один маленький латентный вектор (плюс короткий позиционный ключ). Ключи и значения для всех 128 голов восстанавливаются из него по мере надобности.

    KV-кэш одного диалога на 128k токенов

    Условная модель, близкая к DeepSeek-V3: 61 слой, 128 голов × 128 измерений, 16-битные числа.

    Переключайте тип внимания и длину контекста. Квадраты показывают, сколько чисел каждый токен оставляет в каждом слое; полосы — итог для одного диалога. По размеру MLA оказывается между GQA и MQA, но сохраняет отдельный взгляд для каждой головы.

    С такими настройками диалогу на 128 тысяч токенов нужно примерно 490 ГБ кэша при обычном многоголовом внимании, около 31 ГБ с GQA и меньше 9 ГБ с MLA. От этой разницы зависит, сколько пользователей одновременно выдержит один GPU-сервер.

    Модели пространства состояний: память, которая не растёт

    Внимание хранит всё: чтобы выдать токен номер 100 000, оно оглядывается на 99 999 записей в кэше. Рекуррентная сеть поступает наоборот. Она сжимает прошлое в состояние фиксированного размера и обновляет его один раз на каждый токен. Память и работа на токен остаются постоянными, какой бы длинный ни был текст.

    Классические RNN (рекуррентные нейросети — та самая пошаговая схема, описанная выше) проиграли трансформерам по двум причинам: их нельзя было обучать параллельно, и они слишком много забывали. Современные модели пространства состояний (SSM), например Mamba (2023), исправляют и то и другое.

    • Избирательное обновление. Каждый шаг выглядит так: ht=Aˉt⊙ht−1+Bˉt xt,yt=Ct hth_t = \bar{A}_t \odot h_{t-1} + \bar{B}_t\, x_t, \qquad y_t = C_t\, h_t Здесь hth_t — состояние после токена tt (короткий список чисел), xtx_t — вход от токена, ⊙\odot перемножает два списка поэлементно, а yty_t, выход слоя, считывается из состояния через CtC_t. Затухание Aˉt\bar{A}_t и сила записи Bˉt\bar{B}_t зависят от текущего токена. Если состояние — одно число и Aˉ=0,9\bar{A} = 0{,}9, каждый шаг сохраняет 90% того, что было, и после 10 служебных слов от старого воспоминания остаётся 0,910≈0,350{,}9^{10} \approx 0{,}35. Важное слово может получить Aˉ≈0\bar{A} \approx 0 и большое Bˉ\bar{B}: забыть эту ячейку и записать на её место новое слово. В Mamba оба коэффициента получаются из одного числа, зависящего от токена, — шага Δ: большое Δ значит «больше забыть и больше записать».
    • Параллельное обучение. Каждый шаг — это аффинное отображение h↦a h+uh \mapsto a\,h + u (умножить на число и прибавить число). Если сделать h↦a1h+u1h \mapsto a_1 h + u_1, а затем h↦a2h+u2h \mapsto a_2 h + u_2, получится h↦(a2a1) h+(a2u1+u2)h \mapsto (a_2 a_1)\,h + (a_2 u_1 + u_2) — снова одно умножение и одно сложение. Значит, соседние шаги можно сливать парами, все одновременно, затем пары пар и так далее. Поэтому шаги можно группировать в любом порядке без изменения результата (ассоциативность), и благодаря этому параллельное сканирование обрабатывает всю обучающую последовательность примерно за log⁡2n\log_2 n раундов вместо nn последовательных шагов.
    Рисунок 14.2 · Растущий кэш против фиксированного состояния
    Кот,·которого·гнала·собака,·залез·на·высокое·дерево·и·тихо·сидел·на·верхушке.

    Внимание: KV-кэш

    KVКот
    1 запись K/V · этот токен читает 1 запись из кэша

    Модель пространства состояний: фиксированное состояние

    -0.87-0.83-0.76-0.67-0.57-0.49-0.38-0.28
    8 чисел — всегда · этот токен читает одно состояние
    Память по мере роста текста
    токены →KVSSM

    При обучении все 16 токенов видны сразу: параллельное сканирование проходит рекуррентность за 4 раунда (log₂ 16).

    1/16

    Обе модели читают первый токен. Модель с вниманием сохраняет его ключ и значение; SSM записывает его в своё маленькое состояние.

    Нажмите «пуск». Слева каждый токен добавляет строку ключа и значения, которую должны читать все следующие токены. Справа настоящая (крошечная) избирательная SSM обновляет своё состояние из 8 чисел: знаменательные слова получают большое Δ и сильно его меняют, служебные почти не трогают. График показывает память по мере роста текста.

    Линейное внимание приходит туда же с другой стороны. Уберите из внимания softmax — и выход для запроса qq становится равен ∑i(q⋅ki) vi=q⊤(∑ikivi⊤)\sum_i (q \cdot k_i)\, v_i = q^\top \big(\sum_i k_i v_i^\top\big). Сумма в скобках не зависит от запроса, поэтому её можно хранить как одну накапливаемую матрицу и обновлять раз на токен: St=St−1+ktvt⊤S_t = S_{t-1} + k_t v_t^\top. Снова состояние фиксированного размера. Цена в том, что без softmax внимание уже не может резко сосредоточиться на нескольких токенах; новые варианты отчасти возвращают это с помощью вентилей. Mamba-2, RWKV, RetNet и Gated DeltaNet — всё это вариации на тему «качество как у внимания при памяти как у рекуррентной сети». Mamba-2 вообще построена на наблюдении, что структурированная SSM и одна из форм линейного внимания вычисляют одно и то же.

    Подвох — в слове фиксированный. Состояние из нескольких тысяч чисел на слой не может хранить 100-страничный документ дословно. Чистые SSM хорошо улавливают суть, но хуже справляются с точным воспоминанием: скопировать номер телефона из далёкого прошлого или найти иголку в длинном контексте.

    Гибриды: достаточно нескольких слоёв внимания

    Поэтому большинство новых моделей для длинного контекста оставляют немного внимания. В гибридном стеке большинство слоёв дешёвые (рекуррентные, линейные или со скользящим окном), а полное внимание тратится только на несколько. Jamba от AI21 (2024) использовала один слой внимания на каждые семь слоёв Mamba; несколько моделей 2025 года от NVIDIA, Qwen и MiniMax используют похожие пропорции с разными дешёвыми слоями. Модели Gemma от Google в том же духе чередуют локальное внимание со скользящим окном и редкие глобальные слои.

    Рисунок 14.3 · Смешиваем типы слоёв
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    рекуррентный / линейный
    рекуррентный / линейный
    рекуррентный / линейный
    полное внимание
    полное внимание рекуррентный / линейный
    6 из 24 слоёв используют внимание
    Память на одну последовательность25%
    Работа на каждый новый токен25%
    Точное воспоминание далёкой деталилучше всего

    Относительные условные числа. Память и работа посчитаны по числу слоёв; точность воспоминания — качественный итог опубликованных результатов.

    Выберите состав и длину контекста. Растущий KV-кэш есть только у фиолетовых слоёв с полным вниманием, поэтому память и работа на токен падают почти пропорционально тому, сколько их убрать. Если оставить хотя бы несколько, возвращается почти вся точность воспоминаний.

    Больше одного токена за проход

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

    • Предсказание нескольких токенов (MTP). Дополнительные выходные головы, обученные вместе с обычной, предсказывают токены на позициях t+2t+2, t+3t+3, … из того же скрытого состояния (внутреннего вектора модели на этой позиции). Такое обучение помогает модели планировать наперёд, а при генерации дополнительные головы становятся встроенной черновой моделью: следующий проход проверяет их догадки и оставляет совпавшие. Так, с одним дополнительным модулем MTP, обучена DeepSeek-V3.
    • Диффузионные языковые модели. Вместо письма слева направо начинаем с ответа фиксированной длины, целиком состоящего из токенов [MASK]. Каждый шаг предсказывает все замаскированные позиции сразу и фиксирует самые уверенные — примерно так, как диффузионные модели изображений проявляют картинку из шума. Исследовательские модели вроде LLaDA и коммерческие вроде Mercury от Inception показывают, что так можно получить сравнимое качество за гораздо меньшее число проходов.
    Рисунок 14.4 · Три способа написать предложение
    0 проходов модели
    1/13

    Авторегрессионное декодирование: один проход — один токен, строго слева направо.

    Проходов модели, чтобы написать 12 токенов
    Переключайте режимы и нажимайте «пуск». Авторегрессии нужен один проход на токен. Предсказание нескольких токенов делает черновик на два токена вперёд и подтверждает его следующим проходом; неверная догадка заменяется. Диффузия сначала заполняет самые простые позиции, и здесь ей хватает четырёх проходов. Число проходов условное.

    Диффузия не бесплатна: каждый проход обрабатывает весь ответ фиксированной длины, длину надо выбрать заранее, а параллельная фиксация токенов может давать нестыковки, которых модель «слева направо» избежала бы. Что победит на самых больших масштабах — диффузия или авторегрессия — пока открытый вопрос.

    Не только текст: картинки и звук как токены

    Трансформеру всё равно, что означают его токены, — важно лишь, чтобы каждый пришёл в виде вектора. В этом и весь секрет мультимодальных моделей.

    • Изображения. Визуальный трансформер (ViT) режет картинку на сетку квадратных патчей, обычно по 14 или 16 пикселей, вытягивает каждый патч в строку и умножает на обученную матрицу. Каждый патч становится одним вектором — таким же токеном, как остальные.
    • Звук. Речь либо кодируется в векторы аудиоэнкодером — сетью, превращающей звук в векторы (подход, который популяризировал Whisper), либо превращается нейрокодеком (сетью, сжимающей звук в короткую последовательность кодов) в дискретные аудиотокены — обычно несколько десятков токенов на секунду звука. Такие токены можно и генерировать — так модели отвечают голосом.
    Рисунок 14.5 · Картинка превращается в токены
    Что·на·этой·картинке?
    1/4

    Картинка 16×16. Настоящая модель видит что-то вроде 1024×1024 пикселей.

    Пройдите по шагам. Картинка режется на 16 патчей, патчи встают в одну последовательность с текстом, а линейный слой (одно умножение на матрицу) превращает каждый в вектор. Векторы здесь получены фиксированной случайной матрицей вместо обученной.

    Есть два распространённых способа построить такую модель:

    ПодходКак устроенПримеры
    АдаптерБерём обученный визуальный энкодер (сеть, превращающую картинку в векторы, например CLIP) и обученную LLM и учим небольшой проектор — маленькую сеть, которая переводит признаки картинки в пространство эмбеддингов LLM.LLaVA и многие открытые визуально-языковые модели
    НативныйОдна модель с самого начала учится на перемешанных токенах текста, изображений и звука и часто не только читает, но и генерирует картинки и речь.Chameleon от Meta; большинство передовых ассистентов описываются как нативно мультимодальные

    Картинки дороги: одно изображение высокого разрешения может превратиться в тысячи токенов, поэтому визуальные модели объединяют или усредняют соседние патчи, прежде чем отдать их языковой модели. Эта цена ведёт прямо к главам о длинном контексте и кэшировании.

    Что дальше

    Ни одна из этих идей не отменяет основу, которую вы видели в этом учебнике: токены становятся векторами, слои смешивают информацию между позициями, обучение идёт по градиенту. Меняется лишь то, как смешиваются позиции и сколько токенов выходит за проход. Другой большой фронтир — вовсе не архитектура, а то, как модель тратит вычисления во время ответа: рассуждения, обученные с подкреплением, и работа с длинным контекстом, полным инструментов, файлов и памяти.

    Итоги

    • MLA хранит в кэше маленький латентный вектор на токен и восстанавливает из него ключи и значения для каждой головы — кэш получается намного меньше, чем с GQA.
    • Модели пространства состояний и линейное внимание заменяют растущий кэш состоянием фиксированного размера: постоянная память на токен, но более слабое точное воспоминание.
    • Гибриды оставляют несколько слоёв полного внимания среди множества дешёвых и получают лучшее от обоих миров.
    • Предсказание нескольких токенов и диффузия пишут несколько токенов за один проход.
    • Мультимодальные модели превращают патчи картинок и звук в токены, и один и тот же трансформер читает их все.