Книга: Инжиниринг искусственного интеллекта
Назад: 4.2 GQA - Grouped Query Attention (Групповое внимание по запросам)
Дальше: 4.7 Квантизация: как сжать модель без убийства качества

4.4 MTP - Multi‑Token Prediction (Предсказание нескольких токенов)

Представьте, что вы собираете гигантский пазл. Обычная генерация - это брать по одной детали, искать ей место, класть, повторять 10 000 раз. MTP - это когда вы прикидываете: «здесь будет небо» - и вставляете сразу пять голубых деталей за один проход. Количество шагов сокращается в разы.



Применительно к модели

Обычный трансформер генерирует текст по одному токену: предсказал слово «И», потом «ван», потом «купил»…

В MTP модель на каждом шаге пытается предсказать сразу несколько будущих токенов (например, 2–5). Это ускоряет генерацию, потому что за один проход делается больше работы. Кроме того, такое обучение заставляет модель строить более долгосрочные планы и лучше понимать структуру текста - ведь ей нужно предусмотреть не только ближайшее слово, но и следующие.



Технический уровень

Модель учится предсказывать не один следующий токен, а несколько. На инференсе это позволяет генерировать блоками, ускоряя процесс на 30–40%. Используется в GigaChat.







MTP ускоряет генерацию, но оставляет неизменной квадратичную сложность внимания: каждый новый токен всё ещё «видит» всю предыдущую историю.

При контексте в миллион токенов это непозволительная роскошь даже с KVCache. Что, если ограничить обзор? В конце концов, читая роман, вы не помните каждое слово с первой страницы - вам достаточно последних абзацев.

Sliding Window Attention - это именно такой «узкий луч фонарика»: токен видит только фиксированное число соседей. Информация распространяется дальше через слои, как слух по цепочке. Это радикально снижает затраты, но требует аккуратности. Как работает этот трюк в Mistral и других моделях?





4.5 Sliding Window Attention (Внимание со скользящим окном)



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





Применительно к модели

В Sliding Window Attention каждый токен «видит» только фиксированное число соседей слева (например, 4096 токенов). Это резко сокращает объём вычислений и памяти, потому что матрица внимания не квадратная (размер контекста × размер контекста), а линейная (размер контекста × размер окна). При этом в глубоких слоях информация может распространяться дальше за счёт стека окон - как если бы вы читали книгу, передавая содержание из главы в главу.





Технический уровень

Каждый токен видит только локальное окно соседей, а не всю историю. Это позволяет моделям (например, Mistral) обрабатывать очень длинные последовательности без квадратичного роста памяти.















Sliding window - частный случай более широкого семейства Sparse Attention.

Мы выбрали окно, но кто сказал, что нужны только соседи? Может, важны ещё и некоторые глобальные токены (например, заголовок документа), или случайные, или те, что идут через равные интервалы?

Разреженное внимание - это искусство выбрать, с кем общаться, чтобы не потерять смысл, но сэкономить ресурсы.

Здесь нет единственного рецепта: Longformer, BigBird, другие архитектуры предлагают свои паттерны.

Инженеру важно понимать компромисс: чем агрессивнее разрежение, тем больше экономия, но и риск «разрыва связей». Разберём основные стратегии.





4.6 Sparse Attention (Разреженное внимание)



Представьте, что вы - охраняющий огромный склад с тысячами стеллажей.





Плотное внимание (обычное полное внимание)





Вы каждую минуту обегаете абсолютно все стеллажи, проверяете каждый ящик, сверяете каждую коробку. Надёжно, но к концу дня вы падаете без ног. Чем больше склад - тем быстрее вы выдохнетесь.





Разреженное внимание (Sparse Attention)





Вы умный охранник. Вы знаете, что:

· Вор может залезть только в первые 10 рядов (локальное окно).

· Самые дорогие товары хранятся на стеллажах 50, 100 и 200 (заранее выбранные "якорные" точки).

· Некоторые проходы вообще пустые - туда можно не ходить.





Вы строите маршрут так, чтобы проверить только самые важные места, остальные пропускаете. Иногда вы заглядываете случайно в другие зоны, но в целом экономите 90% сил. При этом вероятность пропустить вора лишь чуть‑чуть выше, чем при тотальном обходе.





Применительно к модели

В Sparse Attention каждый токен взаимодействует не со всеми предыдущими токенами, а только с некоторыми - по определённым шаблонам (паттернам).





Например:

· Токен смотрит на соседей (локальное окно).

· Смотрит на несколько специальных "глобальных" токенов (как [CLS] в BERT).

· Смотрит на токены через равные промежутки (разреженная решётка).

Это позволяет обрабатывать огромные контексты (миллионы токенов), потому что сложность растёт линейно, а не квадратично.





Разные архитектуры комбинируют эти паттерны по-своему. Например, BigBird использует одновременно локальное окно, случайные токены и глобальные токены, добиваясь того, что любой токен может косвенно взаимодействовать с любым другим через цепочку промежуточных связей. Longformer ограничивается локальным окном и небольшой порцией глобальных токенов, что даёт максимальную экономию, но может терять дальние зависимости. Выбор паттерна - это всегда компромисс между качеством и скоростью.





Для инженера важно





Longformer полагается в основном на локальное окно плюс несколько глобальных токенов (например, [CLS]). Это дает максимальную экономию, но вы должны сами решить, какие токены сделать глобальными. BigBird использует комбинацию локального окна, случайных токенов и глобальных токенов, что сложнее, но гарантирует, что любой токен теоретически может взаимодействовать с любым другим через цепочку связей. Выбор зависит от задачи: нужна ли гарантированная «связность» графа внимания или достаточно локального контекста.





Технический уровень

Не каждый токен взаимодействует с каждым. Внимание вычисляется только на выбранных подмножествах (локальных, случайных, или по обученной схеме). Перспективно для сверхдлинных контекстов.













Мы оптимизировали вычисления: ускорили внимание, уменьшили сложность, сжали кэш. Но модель всё ещё весит гигабайты, а то и десятки гигабайт изза формата чисел с плавающей точкой (FP16, BF16).

А что, если снизить точность весов? Вместо 2 байт на параметр взять 1 байт (INT8) или даже полбайта (INT4)?

Это квантизация - грубый, но эффективный способ ужать модель в 2–4 раза, заплатив небольшим падением качества.

Однако методы разнятся: GPTQ, AWQ, GGUF - под каждое железо свой подход. Главный вопрос: как не убить интеллект модели при таком сжатии? И когда экономия памяти важнее точности?





Назад: 4.2 GQA - Grouped Query Attention (Групповое внимание по запросам)
Дальше: 4.7 Квантизация: как сжать модель без убийства качества