IVF_PQ
Индекс IVF_PQ - это основанный на квантовании алгоритм индексации для приближенного поиска ближайших соседей в высокоразмерных пространствах. Хотя IVF_PQ не так быстр, как некоторые методы на основе графов, он часто требует значительно меньше памяти, что делает его практичным выбором для больших наборов данных.
Обзор
IVF_PQ означает Inverted File with Product Quantization- гибридный подход, сочетающий индексирование и сжатие для эффективного векторного поиска и извлечения информации. В нем задействованы два основных компонента: Inverted File (IVF) и Product Quantization (PQ).
ЭКО
ЭКО напоминает создание индекса в книге. Вместо того чтобы сканировать каждую страницу (или, в нашем случае, каждый вектор), вы ищете определенные ключевые слова (кластеры) в индексе, чтобы быстро найти соответствующие страницы (векторы). В нашем сценарии векторы сгруппированы в кластеры, и алгоритм будет искать в нескольких кластерах, которые близки к вектору запроса.
Вот как это работает:
Кластеризация: Ваш набор векторных данных делится на определенное количество кластеров с помощью алгоритма кластеризации, например k-means. Каждый кластер имеет центроид (репрезентативный вектор для кластера).
Назначение: Каждый вектор назначается в кластер, центроид которого находится ближе всего к нему.
Инвертированный индекс: Создается индекс, сопоставляющий центроид каждого кластера со списком векторов, отнесенных к этому кластеру.
Поиск: При поиске ближайших соседей алгоритм поиска сравнивает вектор запроса с центроидами кластеров и выбирает наиболее перспективный кластер (кластеры). Затем поиск сужается до векторов, входящих в эти выбранные кластеры.
Чтобы узнать больше о технических деталях, обратитесь к IVF_FLAT.
PQ
Квантование по продукту (PQ) - это метод сжатия высокоразмерных векторов, который значительно снижает требования к хранению данных и обеспечивает быстрое выполнение операций поиска по сходству.
Процесс PQ включает в себя следующие основные этапы:
Ivf Pq 1
Декомпозиция размерности: Алгоритм начинает с разложения каждого высокоразмерного вектора на
mравных по размеру подвекторов. Это разложение преобразует исходное D-мерное пространство вmдизъюнктивные подпространства, где каждое подпространство содержит D/m измерений. Параметрmуправляет гранулярностью разложения и напрямую влияет на степень сжатия.Генерация кодовой книги подпространства: Внутри каждого подпространства алгоритм применяет кластеризацию k-means для получения набора репрезентативных векторов (центроидов). Эти центроиды в совокупности формируют кодовую книгу для данного подпространства. Количество центроидов в каждой кодовой книге определяется параметром
nbits, где каждая кодовая книга содержит 2nbits центроидов. Например, еслиnbits = 8, то каждая кодовая книга будет содержать 256 центроидов. Каждому центроиду присваивается уникальный индекс с разрядомnbits.Векторное квантование: Для каждого подвектора в исходном векторе PQ определяет ближайший центроид в соответствующем подпространстве, используя определенный тип метрики. Этот процесс эффективно сопоставляет каждый подвектор с ближайшим вектором-представителем в кодовой книге. Вместо того чтобы хранить полные координаты подвектора, сохраняется только индекс соответствующего центроида.
Сжатое представление: Окончательное сжатое представление состоит из индексов
m, по одному из каждого подпространства, которые в совокупности называются PQ-кодами. Такое кодирование позволяет сократить объем памяти с D × 32 бит (в предположении 32-битных чисел с плавающей точкой) до m × n бит, что обеспечивает значительное сжатие при сохранении возможности аппроксимации расстояний между векторами.
Более подробную информацию о настройке и оптимизации параметров см. в разделе Index params.
Рассмотрим вектор с размерностью D = 128, использующий 32-битные числа с плавающей точкой. При параметрах PQ m = 64 (подвекторы) и nbits = 8 (таким образом, k =28 = 256 центроидов на подпространство) мы можем сравнить требования к хранению:
Исходный вектор: 128 измерений × 32 бита = 4 096 бит.
PQ-сжатый вектор: 64 подвектора × 8 бит = 512 бит.
Это означает 8-кратное сокращение требований к хранению.
Вычисление расстояния с помощью PQ
При выполнении поиска по сходству с вектором запроса PQ обеспечивает эффективное вычисление расстояния за счет следующих шагов:
Препроцессирование запроса
Вектор запроса декомпозируется на подвекторы
mв соответствии с оригинальной структурой декомпозиции PQ.Для каждого подвектора запроса и соответствующей ему кодовой книги (содержащей 2nbits центроидов) вычисляются и сохраняются расстояния до всех центроидов.
При этом создается
mтаблиц поиска, где каждая таблица содержит 2nbits расстояний.
Аппроксимация расстояний
Для любого вектора базы данных, представленного PQ-кодами, его приблизительное расстояние до вектора запроса вычисляется следующим образом:
Для каждого из подвекторов
mизвлекаем предварительно вычисленное расстояние из соответствующей таблицы поиска, используя сохраненный индекс центроида.Просуммируйте эти
mрасстояния, чтобы получить приблизительное расстояние, основанное на определенном типе метрики (например, евклидово расстояние).
Ivf Pq 2
IVF + PQ
Индекс IVF_PQ объединяет сильные стороны IVF и PQ для ускорения поиска. Процесс работает в два этапа:
Грубая фильтрация с помощью ЭКО: ЭКО разбивает векторное пространство на кластеры, сокращая область поиска. Вместо того чтобы оценивать весь набор данных, алгоритм фокусируется только на кластерах, наиболее близких к вектору запроса.
Тонкое сравнение с помощью PQ: внутри выбранных кластеров PQ использует сжатые и квантованные представления векторов для быстрого вычисления приблизительных расстояний.
На производительность индекса IVF_PQ существенно влияют параметры, управляющие алгоритмами IVF и PQ. Настройка этих параметров очень важна для достижения оптимальных результатов для конкретного набора данных и приложения. Более подробную информацию об этих параметрах и о том, как их настраивать, можно найти в разделе Index params.
Построение индекса
Чтобы построить индекс IVF_PQ по векторному полю в Milvus, используйте метод add_index(), указав index_type, metric_type и дополнительные параметры для индекса.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_PQ", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"m": 4, # Number of sub-vectors to split eahc vector into
} # Index building params
)
В данной конфигурации:
index_type: Тип индекса, который будет построен. В этом примере задайте значениеIVF_PQ.metric_type: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения:COSINE,L2иIP. Подробнее см. в разделе Типы метрик.params: Дополнительные параметры конфигурации для построения индекса.m: Количество субвекторов, на которые нужно разбить вектор.
Чтобы узнать больше параметров построения, доступных для индекса
IVF_PQ, обратитесь к разделу Параметры построения индекса.
После того как параметры индекса настроены, вы можете создать индекс, используя метод create_index() напрямую или передавая параметры индекса в метод create_collection. Подробности см. в разделе Создание коллекции.
Поиск по индексу
После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
В этой конфигурации:
params: Дополнительные параметры конфигурации для поиска по индексу.nprobe: Количество кластеров для поиска.
Чтобы узнать больше параметров поиска, доступных для индекса
IVF_PQ, обратитесь к разделу Параметры поиска по индексу.
Параметры индекса
В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по нему.
Параметры построения индекса
В следующей таблице перечислены параметры, которые могут быть настроены в params при построении индекса.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса. |
Тип: Integer Диапазон: [1, 65536] Значение по умолчанию: |
Большие значения |
PQ |
|
Количество подвекторов (используемых для квантования), на которые нужно разделить каждый высокоразмерный вектор в процессе квантования. |
Тип: Целое число Диапазон: [1, 65536] Значение по умолчанию: Нет |
Большее значение В большинстве случаев мы рекомендуем задавать значение в этом диапазоне: [D/8, D]. |
|
Количество битов, используемых для представления индекса центроида каждого субвектора в сжатом виде. Оно напрямую определяет размер каждой кодовой книги. Каждая кодовая книга будет содержать 2nbits центроидов. Например, если значение |
Тип: Целое число Диапазон: [1, 24] Значение по умолчанию: |
Большее значение |
Параметры поиска, специфичные для индексов
В следующей таблице перечислены параметры, которые могут быть настроены в search_params.params при поиске по индексу.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров для поиска кандидатов. |
Тип: Целое число Диапазон: [1, nlist]. Значение по умолчанию: |
Большие значения позволяют искать больше кластеров, что улучшает запоминание благодаря расширению области поиска, но ценой увеличения задержки запроса. Установите значение В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, nlist]. |