FAISS — это библиотека с открытым исходным кодом, разработанная Facebook AI Research (FAIR), которая предоставляет эффективные алгоритмы поиска сходства и кластеризации для многомерных векторов. Название «FAISS» расшифровывается как «Поиск подобия искусственного интеллекта в Facebook». Он специально разработан для обработки крупномасштабных наборов данных и широко используется в различных приложениях, включая поиск изображений и текста, рекомендательные системы и задачи компьютерного зрения.

Ключевая особенность

⭐ Быстрый поиск сходства: FAISS предлагает оптимизированные алгоритмы для эффективного поиска сходства. Он поддерживает как точный, так и приблизительный поиск ближайшего соседа, позволяя пользователям выбирать между точностью поиска и вычислительной эффективностью.

⭐ Структуры индексации: FAISS реализует несколько структур индексации для ускорения поиска ближайшего соседа. Наиболее часто используемыми структурами индексов в FAISS являются индексы инвертированного файла (IVF) и квантования продукта (PQ), которые предназначены для эффективной обработки многомерных векторов.

⭐ Поддержка графических процессоров: FAISS использует вычислительную мощность графических процессоров для ускорения операций поиска сходства. Используя графические процессоры, FAISS может добиться значительного ускорения по сравнению с реализациями на базе ЦП, особенно для крупномасштабных наборов данных.

⭐ Интеграция с платформами глубокого обучения: FAISS обеспечивает интеграцию с популярными платформами глубокого обучения, такими как PyTorch и TensorFlow. Это позволяет легко интегрировать поиск сходства на основе FAISS в существующие конвейеры глубокого обучения.

⭐ Расширяемость: FAISS спроектирован как модульный и расширяемый, что позволяет пользователям настраивать и расширять его функциональные возможности в соответствии со своими конкретными требованиями. Он предоставляет гибкий API, который поддерживает различные методы индексации, показатели расстояния и параметры поиска.

⭐ Поддержка сообщества: FAISS имеет активное сообщество пользователей и разработчиков, которые активно участвуют в его развитии и оказывают поддержку. Это проект с открытым исходным кодом, размещенный на GitHub, что делает его доступным для более широкого сообщества для внесения вклада и улучшений.

Шаги для поиска похожего вектора встраивания изображения

Давайте используем прецедент поиска похожих векторов вложения для изображения Ари.

Вот общие шаги:

⭐ Подготовка набора данных. Во-первых, у вас должен быть набор изображений и соответствующих им векторов встраивания. Эти векторы встраивания обычно получаются путем пропускания изображений через предварительно обученную модель глубокого обучения, такую ​​как сверточная нейронная сеть (CNN), которая извлекает значимые признаки из изображений.

⭐ Создание индекса. После того, как у вас есть набор данных и векторы встраивания, вам необходимо создать индекс с помощью FAISS. Индекс — это структура данных, которая упорядочивает векторы таким образом, чтобы облегчить эффективный поиск сходства. FAISS предоставляет различные структуры индексов, но в этом примере мы будем использовать индекс Inverted File (IVF).

⭐ Добавление векторов в индекс: вы добавляете векторы встраивания вашего набора данных в индекс, используя функцию «добавить», предоставляемую FAISS. На этом шаге создается структура индекса на основе заданных векторов, что ускоряет последующие операции поиска.

⭐ Выполнение поиска по сходству: Теперь, когда индекс готов, вы можете выполнить поиск по сходству, чтобы найти наиболее похожие векторы на изображение Ари. Вы начинаете с получения вектора встраивания для изображения Ари, используя ту же предварительно обученную модель, которую вы использовали для набора данных.

⭐ Запрос к индексу: используя вектор встраивания Ari, вы передаете его функции «поиска» индекса в FAISS. Эта функция эффективно находит ближайших соседей (похожих векторов) к вектору запроса на основе заданной метрики расстояния.

⭐ Анализ результатов: FAISS возвращает ближайших соседей вместе с их расстояниями до вектора запроса. Вы можете проанализировать эти результаты, чтобы определить изображения, наиболее похожие на Ari, на основе их векторов встраивания. Расстояния могут служить мерой сходства, причем меньшие расстояния указывают на более близкое сходство.

Выполняя эти шаги, вы можете использовать FAISS для эффективного поиска похожих векторов встраивания для изображения Ари. Этот процесс может применяться к широкому спектру приложений, таких как поиск изображений на основе контента, системы рекомендаций и многое другое.

Пример

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

Во-вторых, давайте получим векторы встраивания для каждого изображения и сохраним их все.

После того, как мы получим эти вложения, мы должны построить индекс. Я бы построил индекс для первой коллекции вложений.

После создания индекса давайте проверим! Я бы взял первый вектор встраивания второй коллекции вложений в качестве вектора запроса. labels2 имеет соответствующие метки. Поскольку мы берем 0-й элемент, метка будет labels2[0].

При поиске возвращаются два значения массива. Первый массив (D) содержит расстояния, а второй массив (I) содержит положения векторов вложения, которые оказались настолько близкими. Первое значение в каждом считается очень близким к запросу. Давайте проверим, равны ли labels1[I[0][0]] labels2[0] или нет.

Правда они…

Типы индексов

FAISS предоставляет различные типы индексов, которые можно использовать для различных сценариев поиска сходства. Вот несколько часто используемых типов индексов в FAISS:

⭐ IndexFlatL2 : этот тип индекса реализует метод грубой силы для поиска подобия с использованием метрики расстояния L2 (евклидова). Он сравнивает вектор запроса со всеми векторами в индексе, чтобы найти ближайших соседей. IndexFlatL2 прост и удобен в использовании, но для больших наборов данных может требовать больших вычислительных ресурсов.

⭐ IndexIVFFlat: индекс инвертированного файла (IVF) предназначен для приблизительного поиска ближайшего соседа. Он делит векторное пространство на несколько ячеек и присваивает этим ячейкам векторы. IndexIVFFlat использует инвертированную файловую структуру для эффективного хранения этих назначений. При поиске просматривается только подмножество ячеек, что значительно ускоряет процесс поиска.

⭐ IndexHNSWFlat : индекс Hierarchical Navigable Small World (HNSW) — это индекс на основе графа, который организует векторы иерархическим образом. Он строит граф, в котором каждый вектор связан с другими векторами в зависимости от их близости. Такая структура индекса обеспечивает эффективный и масштабируемый приблизительный поиск ближайшего соседа.

⭐ IndexLSH: индекс локального хеширования (LSH) подходит для очень многомерных векторов. Он использует методы хэширования для сопоставления похожих векторов с теми же или соседними сегментами. Во время поиска проверяются только соответствующие корзины, что сокращает пространство поиска. IndexLSH обеспечивает приблизительный поиск ближайшего соседа с компромиссом между точностью и скоростью.

Это всего лишь несколько примеров типов индексов, доступных в Faiss. В зависимости от вашего конкретного варианта использования мы можем выбрать подходящий тип индекса и настроить его параметры для достижения желаемого баланса между точностью поиска и эффективностью вычислений.

Реализация всех

Давайте проверим, какой из них хорошо работает для этого варианта использования.

Под капотом

  • Многопоточность для использования нескольких ядер и выполнения параллельного поиска на нескольких графических процессорах.
  • Библиотеки BLAS для эффективных вычислений точных расстояний с помощью матричного умножения. Эффективная реализация грубой силы не может быть оптимальной без использования BLAS. BLAS/LAPACK — единственная обязательная программная зависимость FAISS.
  • Машинная SIMD векторизация и подсчет количества элементов используются для ускорения вычислений расстояний для изолированных векторов.

МЕРСИ