Добро пожаловать вмоя маленькая станцияповернись~~
задний план
FaissЭто механизм поиска векторов Facebook с открытым исходным кодом, который используется для поиска N векторов, наиболее похожих на определенный вектор.
Первый выпуск Faiss был выпущен 23.02.2018, но его автор Matthijs уже опубликовал статью в 2011 году, прежде чем присоединиться к Facebook.статья о поиске ближайшего соседа, Faiss основан на идее этой статьи. После прочтения этой статьи метод индексации Файсса стал ясен.
описание проблемы
Учитывая D-мерный вектори коллекция, необходимо найтиk ближайших соседей с кратчайшим расстоянием.
Взяв в качестве примера евклидово расстояние, его можно выразить как:
В нашем приложении
размер проблемы
Давайте попробуем провести исчерпывающий поиск самым грубым способом, чтобы увидеть, насколько сложно это решение.
- Построить матрицу расстояний: каждые два вектораиФормула для расчета расстояния:, потраченное время равно, матрица расстояний содержитэлементов, общее время равно
- Найдите k ближайших соседей по матрице расстояний.Если используется алгоритм минимальной кучи, временная сложность равна
Выбирать
получить
- Матрица расстояний содержит 400T элементов, предполагая, что каждое расстояние представляет собой число с плавающей запятой, занимающее 32 бита и занимающее не менее 1600 ТБ пространства.
- Временная сложность построения матрицы расстояний порядка величины
- Временная сложность нахождения k ближайших соседей по матрице расстояний порядка величины
Ближайшие соседи Офлайн
Вообще говоря, набор векторов обновляется каждый день, в это время вы можете попытаться сохранить k ближайших соседей, соответствующих каждому вектору напрямую.
- Построение матрицы расстояний + время поиска N k ближайших соседей равно
- Создание ближайшего соседа в автономном табличном пространстве
в нашем сценарии получить
- Порядок времени, отнимающий много времени для поиска N k ближайших соседей, следующий:
- Место для хранения(удалить после построения) + 320G (при условии, что каждый индекс представлен целым числом, а дробь - числом с плавающей запятой)
Время на поиск k ближайших соседей: O(1)
Векторное квантование
В нашем сценарии наиболее точное расстояние на самом деле не требуется, что допускает некоторую ошибку. В этом случае мы можем ввести методы векторного квантования, чтобы значительно уменьшить количество векторов.
Так называемое векторное квантование заключается в преобразовании исходного бесконечного пространстваотображать в конечный набор векторовв, из нихявляется натуральным числом. изменить это св коллекциюФункция обозначается как,но, что в теории информации называетсядля кодовой книги.
Конечно, функция отображения здесь не указана произвольно, и необходимо соблюдать принцип минимальной ошибки.Один из способов - установить функцию оптимизации на минимальную квадратичную ошибку
Эй, оказывается, это целевая функция метода k-средних! Таким образом, мы можем использовать k-средние как способ найти лучшую кодовую книгу.
Теперь давайте проанализируем пространственную и временную сложность векторного квантования.
Предположим, мы сопоставляем исходные векторы 2000 Вт с набором размером 20 Вт (в среднем каждая центральная точка представляет 100 векторов, что приводит к большой ошибке)
- Матрица расстояний: нужно только хранить корреспонденциюРасстояние между векторами, занимаемое пространство равно, в этом случае
- Отношение отображения , если вектор идентифицируется как int, общееОЗУ
- Временная сложность: временная сложность алгоритма k-средних составляет,в— количество итераций, N — количество векторов исходного пространства, k — количество центральных точек, а D — размерность вектора. В этом примере временная сложность, увеличение количества итераций до 25 уже достигло порядка перебора методом перебора.Пока количество итераций немного увеличивается, временная сложность будет выше.
Квантование продукта PQ (квантование продукта)
Часто распределение между разными частями нашего вектора различно.
Тогда вектор можно разделить наСуществуют разные части, и для каждой части выполняется векторное квантование.Предполагая среднее деление, размерность каждой части составляет
вектор, который можно разбить на m групп векторов, кодовая книга для каждой группы, соответствующий квантователь обозначается как,. Тогда окончательная глобальная кодовая книга, от которого происходит название квантования произведения.
Взяв в качестве примера m=4, чтобы достичь уровня 20 Вт в предыдущем разделе,Вам нужно всего лишь достичь 22, и вам нужно всего лишь достичь 67, чтобы восстановить уровень 2000 Вт.
кВ качестве примера возьмем случай достижения порядка 2000 Вт, количество центральных точек кодовой книги в каждой групперавно 67, теперь давайте проанализируем соответствующую пространственную и временную сложность
- Матрица расстояний между центральными точками: примечаниеза, размер матрицы расстояний. Если расстояние представлено числом с плавающей запятой, матрица расстояний в этом примере составляет около 70M.
- Отношение отображения , если вектор идентифицируется как int, общееОЗУ
- Временная сложность кластеризации: временная сложность алгоритма k-средних по-прежнему, в этом примере необходимо выполнить k-средних для m групп соответственно, а общая временная сложность равна, в этом случае, что на 3 порядка меньше, чем в предыдущем примере
- Временная сложность матрицы расстояний: произведение размерности D на количество элементов матрицы расстояний, т.е.,о
Существенная причина, по которой квантование произведения значительно сокращает занимаемое пространство, заключается в том, что выраженное векторное пространство равно, но занимает дисковое пространство
Эмпирическое значение, приведенное в статье, равно,, соответствующий размер векторного пространства равензаписаться на прием
Вычисление расстояния в сценарии квантования
В сценарии без квантизации расчет расстояния рассчитывается напрямую для двух точек.
Но в случае квантования расстояние между x и y нужно вычислять не напрямую, а через центральную точку. Существует два варианта этого подхода:
SDC
SDC (вычисление симметричного расстояния): расстояние между двумя векторами измеряется расстоянием между центральными точками двух векторов. Ошибка меньше или равна расстоянию от x до центральной точки + расстоянию от y до центральной точки.
В сценарии PQ расстояние SDC выражается как:
Поскольку расстояние между центральными векторами было сохранено (см. предыдущий раздел), для расчета расстояния между x и y вам нужно только просмотреть таблицу Размер таблицы составляет около 70M, и она принимает порядки величин. вычислить матрицу расстояний.
Если вы не хотите занимать пространство матрицы расстояний, временная сложность равна, о
ADC
ADC (асимметричное вычисление расстояния): расстояние между x и y измеряется расстоянием между центральными точками, в которых расположены x и y. Используйте свойства треугольников: разница между двумя сторонами меньше, чем между третьей стороной, поэтому ошибка должна быть меньше или равна расстоянию между y и центральной точкой
)В сценарии PQ расстояние АЦП выражается как:
Пусть i-й элемент вектора x равен,но
В этом сценарии, если вы хотите получить расстояние, просматривая таблицу, размер матрицы расстояний в процессе подготовки данных составляет около(каждый вектор должен вычислять расстояние от каждого вектора центра в m группах), трудоемкий порядок величины
Если он рассчитывается напрямую, сложность такая же, как и у версии SDC без просмотра таблицы., о
Если используется стратегия поиска по таблице, АЦП платит больше памяти в случае более высокой точности.
IVFADC
В предыдущем разделе время прямого вычисления в основном тратилось на сравнение со всеми центральными векторами. Естественный подход состоит в том, чтобы сначала найти приблизительный узел-кандидат в центр и избежать вычислений с большим количеством точек, которые просто не могут быть их ближайшими соседями.
Грубое квантование + остаточное квантование
Поэтому Маттис предложил в статье процесс грубого квантования + остаточное квантование. В частности, сначала необходимо создать набор данных размером(Предположим, что значение равно 1000) небольшая кодовая книга, квантователь обозначается как, поэтому каждый вектор будет иметь невязку. Исходный вектор может иметь особенно большую разность/дисбаланс распределения, но эту проблему можно значительно облегчить, обработав результаты по остаточному принципу.
Правильно сноваИспользуя шаг PQ, поскольку«Энергия» относительно исходного вектора ниже, поэтому моделирование можно выполнить более точно с помощью шага PQ. Обозначим квантователь шага PQ как, то y проходит черезПредставлять. В этом случае расстояние между двумя векторами x, yможно аппроксимировать как
Помните размер кодовой книги для остаточного квантования как(Возьмите 64 в качестве примера), если вы хотитеРассчитано заранее, то есть рассчитано заранее для каждого x и всех центральных вектороврасстояние, а временная сложность, пример в этой статье, пространственная сложность, пример в этой статье: 20G*4B=80GB.
структура индекса
С помощью инвертированного индекса можно значительно повысить эффективность поиска.
используется в диссертацииПеревернутый индекс для хранения приблизительной центральной точкисписок соответствующих векторов. Каждый вектор представлен в следующем формате, где id — это идентификатор индекса вектора, а code — это соответствующий список индексов центральной точки PQ. Количество центральных точек для каждой группы в PQ равно, тебе нужнобит, чтобы указать, какая центральная точка, в общей сложностибиты
При поиске вы можетеФункция получает все векторы из соответствующего кластера
процесс индексации
- квантователемвекторсопоставить с
- Рассчитать остатки
- остатокколичественно, который содержит m групп
- построитьзапись и добавить вСоответствующий инвертированный список
процесс поиска
Во многих случаях ближайший сосед не обязательно находится в текущем кластере, поэтому необходимо искать не только текущий кластер, но и соседние кластеры.
- рассчитатьБлижайший к входному параметру xцентральная точка,
- Если центральную точку все еще нужно обработать, удалите центральную точку., и вычислить соответствующий. В противном случае перейдите к шагу 6
- рассчитатьРасстояние от центральной точки в каждой группе,
- Поскольку соответствующий индекс в том же инвертированном индексеиодинаковы, поэтому расстояние между x и y нужно смотреть только на остаточное расстояние. так какРасстояние до каждой центральной точки было рассчитано, поэтому для каждого вектора нужно просмотреть таблицу только m раз. О (м)
- Вернуться к шагу 2
- Используйте min-heap, чтобы получить K векторов с наименьшим расстоянием, поскольку ожидаемое количество элементов для каждого инвертированного индекса равно, так долго
Длительность всего процесса поиска составляет:
Экспериментальный эффект
оптимизация
- При остаточном квантовании остатки от разных векторов к их соответствующим центрам объединяются для квантования, что фактически подразумевает предположение, что распределения в разных кластерах одинаковы. Это предположение вносит определенную ошибку, но в противном случае объем памяти будет увеличиваться.раз
- Различные группировки векторов могут привести к очень разным результатам. Эксперименты в статье показывают, что по сравнению со случайной группировкой связанные поля должны быть помещены в одну и ту же группу, что может повысить точность в 2-3 раза в некоторых сценариях. Перед индексированием векторы могут быть организованы в подходящем порядке с помощью некоторых методов анализа подобия.
- Если для него выбрано значение 1, это приведет к поиску только вектора в текущем кластере, и результат может быть намного хуже, чем SDC. Рекомендация автора в статье – принять, но в разных сценариях сначала нужно выполнить тесты, чтобы достичь баланса между объемом памяти и потреблением времени.
Суммировать
По сути, Файсс кодирует вектор как комбинацию конечного числа векторов, преобразуя вычисление расстояния между векторами в расстояние между конечным числом векторов, которое можно вычислить заранее.
Ключ к упрощению расчета:
- Вектор-кандидат сводится к вектору окрестности
- Выразительная сила, вызванная квантованием продукта, подскочила:
- Матрица расстояний результата квантования произведения предварительно вычисляется, так что вычисление расстояний становится операцией поиска в таблице. (квантование продукта поддерживает допустимые требования к пространству для матрицы расстояний)
Например: Следующие векторы 12, 13 ![пример_1]Боюсь 1-solve.byte IMG.com/to S-talent-i-he 2…)
Сначала выполните грубый расчет кластеризации на них
Обнаружено, что их идентификаторы кластеров равны 1
Затем разделите на три группы, чтобы вычислить остатки
Квантование продукта остатков
Тогда расстояния векторов 12 и 13 могут быть получены непосредственно путем накопления трех наборов произведений для количественной оценки векторных расстояний, в которых векторные расстояния рассчитываются заранее.
использованная литература:«Квантование произведения для поиска ближайшего соседа»: Lear.in ria LP ES. положить в /pubs/2011/J…