EnglishРусский Map

Квантование со случайным поворотом

title
Квантование со случайным поворотом
type
concept
summary
Поворот векторов случайным ортогональным преобразованием и квантование по единой кодовой книге: выбросы исчезают, метаданные блоков не нужны
tags
llm, quantization, kv-cache
created
2026-05-13
updated
2026-05-13
lang
ru
source_updated
2026-05-13
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

Семейство схем квантования, сжимающих многомерные векторы (записи KV-cache, эмбеддинги, ключи внимания) до 2-4 бит на координату без калибровочного набора, поблочных коэффициентов масштабирования и обучения. Сама схема:

  1. Применить к входному вектору равномерно случайное ортогональное преобразование Π.
  2. Квантовать каждую повёрнутую координату независимо по фиксированной кодовой книге, рассчитанной один раз для маргинального распределения после поворота.
  3. На этапе декодирования деквантовать и применить Π⊤ для восстановления приближения исходного вектора.

Главное свойство здесь в том, что кодовая книга на шаге 2 одинакова для любых входных данных. Практические альтернативы квантования (GPTQ, AWQ, KIVI, KVQuant) хранят масштаб и нулевую точку для каждого блока в полной точности, так как в реальных эмбеддингах есть каналы-выбросы: фиксированная сетка либо обрезает их, либо тратит на них разрешение впустую. Случайный поворот растворяет выбросы: после поворота каждая координата любого входного вектора подчиняется одному и тому же известному распределению.

Почему поворот работает

Равномерно случайный поворот в d измерениях переводит любой вектор $\mathbf{x}$ в равномерно распределённую точку на сфере радиуса $|\mathbf{x}|$. В силу вращательной симметрии и условия единичной сферы $\sum_i X_i^2 = 1$, каждая координата точки на единичной сфере имеет:

  • математическое ожидание 0
  • стандартное отклонение $1/\sqrt{d}$
  • известную маргинальную плотность бета-распределения: $f_X(x) = \dfrac{\Gamma(d/2)}{\sqrt{\pi},\Gamma((d-1)/2)},(1-x^2)^{(d-3)/2}$

С ростом d эта бета-плотность сходится к $\mathcal{N}(0,,1/d)$. При d = 1000 стандартное отклонение любой отдельной координаты составляет ~0.032, а маргинальное распределение визуально неотличимо от нормального уже при d ≈ 30. Это концентрация меры - основной факт, на котором строится схема.

На практике в качестве поворота используют рандомизированное преобразование Адамара (Randomized Hadamard Transform): оно вычисляется за время $O(d \log d)$ и аппроксимирует равномерное ортогональное преобразование достаточно точно для теоретического анализа.

История развития

Конструкция появлялась по частям:

  • DRIVE (Vargaftik et al., NeurIPS 2021) - однобитная оценка среднего в федеративном обучении. Отправитель выполняет поворот и передаёт знаки повёрнутых координат плюс скалярный коэффициент масштаба. Две формулы масштаба: $S = |R(x)|_1 / d$ (смещённая, оптимальная по MSE) и $S = |x|_2^2 / |R(x)|_1$ (несмещённая).
  • EDEN (Vargaftik et al., ICML 2022) - обобщает DRIVE на b бит на координату. Нормализует повёрнутый вектор так, чтобы каждая координата приближённо следовала $\mathcal{N}(0,1)$, затем квантует с помощью кодовой книги Ллойда - Макса, рассчитанной один раз для стандартного нормального распределения. 1-битная кодовая книга: ${\pm\sqrt{2/\pi}} \approx {\pm 0.798}$; 2-битная: ${\pm 0.453, \pm 1.510}$.
  • RaBitQ (Gao & Long, SIGMOD 2024) - независимо развивает идею "поворот, затем знак" в литературе по поиску ближайших соседей (ANN). Расширенная статья (Gao et al., 2024) доказывает асимптотическую оптимальность относительно границы Алона - Клартэга для квантования скалярного произведения.
  • QJL (Zandieh et al., 2024) - однобитная конструкция в стиле DRIVE, применённая к сжатию ключей внимания с устранением смещения через остатки.
  • TurboQuant (Zandieh et al., 2025) - EDEN с постоянным коэффициентом масштаба на вектор, цепочкой остатков (смещённое квантование на b−1 бит + несмещённое на 1 бит) и адаптацией под сжатие KV-cache.

Связь между линейкой DRIVE/EDEN и линейкой RaBitQ остаётся предметом открытой дискуссии (arXiv 2604.18555 и 2604.19528, обе 2026 года).

Наглядный разбор схемы от arkaung см. на странице interactive-turboquant.

Три декодера, один поворот

Поворот служит общим энкодером. Декодер же меняется в зависимости от задачи:

  • Декодер среднего (DRIVE) - хранятся знаки + скаляр; восстанавливается $\hat{\mathbf{x}} = S , \Pi^\top \mathrm{sign}(\Pi \mathbf{x})$, несмещённая оценка $\mathbf{x}$.
  • Декодер скалярного произведения (RaBitQ, QJL) - хранятся знаки + норма; $\widehat{\langle q, x\rangle}$ восстанавливается из $\langle \Pi q, \mathrm{sign}(\Pi x)\rangle$ с нормирующим скаляром. Подходит для поиска ближайших соседей и сжатия ключей внимания.
  • MSE-декодер (EDEN, TurboQuant) - каждая координата $(\Pi x)_i$ привязывается к ближайшему из $2^b$ центроидов Ллойда - Макса; $\tilde{\mathbf{x}}$ восстанавливается применением $\Pi^\top$. Подходит для сжатия KV-cache.

Эмпирические результаты на KV-cache

Полнота в тесте Needle-in-a-Haystack на Llama-3.1-8B-Instruct при 4-кратном сжатии памяти (статья по TurboQuant, рис. 4):

Метод NiaH
Полный кэш (FP16) 0.997
KIVI (целочисленный с поблочными масштабами) 0.981
PolarQuant 0.995
TurboQuant 0.997

TurboQuant не уступает по полноте полной точности при 4-кратном сжатии. На LongBench-V1 TurboQuant при 3.5 битах на канал повторяет средний результат полной точности (50.06), а при 2.5 битах на канал (сжатие в 6.4 раза) отстаёт от полной точности менее чем на ~1%.

Баланс между смещённостью и несмещённостью

Оптимальные по MSE квантователи хранят условное среднее каждой ячейки кодовой книги, которое по модулю меньше её крайних значений. Восстановленные векторы получаются сжатыми относительно исходных, поэтому их скалярные произведения оказываются меньше истинных. Если требуются несмещённые скалярные произведения (как в большинстве задач поиска), приходится либо аналитически корректировать это сжатие (TurboQuant-prod), либо использовать цепочку остатков: квантовать на b−1 бит смещённой кодовой книгой MSE, а затем квантовать остаток на 1 бит несмещённым знаковым кодом (§7-8 статьи по TurboQuant).

Практическое применение в llama.cpp

Форк llama-cpp-turboquant предоставляет кодовые книги TurboQuant как типы KV-cache: --cache-type-k turbo4 --cache-type-v turbo3. Именно это используется в сборке с GTX 1070 8GB из обсуждения на Reddit, чтобы уместить 128K контекста в 8 ГБ VRAM: объём KV-cache при 131K падает до ~590 МБ по сравнению с ~720 МБ у q4_0.

Стандартный llama.cpp поставляет типы KV-cache q4_0 / q8_0 / f16. TurboQuant обеспечивает более высокое качество при том же расходе байтов; ik_llama добавляет похожее квантование Q6-KV через другую кодовую базу.

Ссылки

  • interactive-turboquant - наглядный интерактивный разбор от arkaung
  • llm-quantization - обзор семейств квантования
  • kv-cache-sizing - q8_0 против q4_0 и turbo4; распределение бюджета памяти
  • reddit-qwen3-6-mtp-12gb - практическое применение turbo4/turbo3
  • mixture-of-experts - другой аспект квантования (чувствительность роутера), не связанный с этой веткой