Иван Плешков представил метод сжатия эмбеддингов, который работает лучше обычного PCA. Проблема классического PCA в том, что он использует линейную проекцию, тогда как векторы нейросетей живут на сфере и имеют нелинейную структуру. Это явление называют конусным эффектом, и линейный декодер не может уловить часть дисперсии, которая находится в нелинейном хвосте. Автор предлагает добавить квадратичный декодер поверх PCA без сложного обучения. Декодер состоит из полиномиального подъёма и линейной регрессии с регуляризацией Ridge, всё решается одной формулой. Здесь не нужно SGD, эпох или подбора гиперпараметров. Достаточно одного вызова np.linalg.solve на статистике корпуса. Конструкция взята из литературы по динамическим системам, где её называют quadratic manifold. Письмо автора объясняет, что он просто столкнулся с этими работами после своих экспериментов, потому что полиномиальный подъём в современном машинном обучении почти не упоминается.
Результаты измерений на задачах BEIR и FiQA впечатляют. Сравнивались четыре варианта: сырые векторы, метод матрёшки, PCA и поли-автоэнкодер. При бюджетe 512 байта на вектор сырые данные дают NDCG@10 0.4525, PCA проигрывает на 3.58 процентных пункта, а поли-автоэнкодер сокращает пропасть почти полностью, теряя всего 0.85 п.п. против сырых данных и выигрывая 2.73 п.п. у PCA. Таблица результатов охватывает модели nomic-v1.5, mxbai-embed-large-v1, bge-base и e5-base. На малом разрешении 128 размерности поли-метод выигрывает от 1 до 4.4 п.п. у сырых данных. Метод матрёшки на моделях, не обученных под матрёшку, показывает NDCG@10 в диапазоне 0.30–0.44, в зависимости от модели и размерности. При этом на модели nomic-v1.5 поли-метод выигрывает у матрёшки на 1.87 п.п. при размере 1024 байта.
Компрессия работает за счёт разложения вектора на латентный код и резидуал. Поли-автоэнкодер убирает анизотропию резидуала, что позволяет использовать квантование TurboQuant. Для Qdrant 1.18 было добавлено расширение turboquant.py с компенсацией анизотропии. Код доступен на GitHub. Если в будущем появится библиотека polynomial, то для этого метода нужно будет только импортировать её. На MacBook Pro M2 120-ядерный процессор справляется с обучением модели за несколько минут.
Есть ограничения: кубическое решение для размерности выше 256 требует около 15 минут, для 384 уже непрактично. Если корпус меняется со временем, метод перестает работать. Также при малом числе примеров (меньше 5M) модель запоминает данные, и улучшение из-за переобучения.
Планы на будущее: проверить на больших корпусах вроде MS MARCO, попробовать степени подъёма выше 2 и гибридные подходы с матрёшкой на сервере и поли-декодером на клиенте.