Pull to refresh

Comments 22

Насколько я помню, обычно эмбеддинги разреженные, поэтому для понижения их размерности используют не PCA, а методы, хорошо умеющие в разреженные матрицы, например TruncatedSVD. А t-SNE вообще очень ресурсозатратный, его обычно только когда нужно на плоскости нарисовать разделение кластеров используют.

Насколько я понимаю SVD для этого сценария действительно больше и лучше подходит чем PCA. Особенно если пространство формируется из статистики пользователей-покупок-поведения.

А вот кстати интересно, насколько быстрее TruncatedSVD на GPU (NVIDIA) чем на обычном CPU? Должно быть намного быстрее. PCA наверное тоже быстрее но не так как SVD как раз изза плотности (неразряженности) матрицы ковариаций. Память GPU становится узким местом.

А может проще искать по БД с продуктами и тегами, их описывающими? Как раз Панама и была бы найдена по тегу "Лето". Теги можно присваивать и с помощью ИИ по наименованию товара, текстовому описанию и картинке (распознаванию объектов на картинке).

А может проще искать по БД с продуктами и тегами, их описывающими?


Пару лет назад я бы использовал именно такое решение для поиска.
Но познакомившись с векторизацией и семантическим поиском, считаю, что каждой задаче свое решение.

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

Да, семантический поиск это сила. Хотел бы дополнить - в статье указывается про тематический поиск - скажем по ключевому слову лето найти товары типа платья и т.п.

Для этого, из того что я понял хорошо подходит не столько семантический поиск а именно SVD (Singular Value Desomposition). Допустим есть таблица в которой столбцы - это покупатели а строки - это товары. SVD может представить эту матрицу таким образом (найдя наиболее влиятельные сингулярные значения ) что она будет в некотором смысле определять скрытые факторы(абстракция, но можно представить как группы покупателей и группы товаров или , ключевые слова поиска).
Это даст возможность группировать товары не столько по сематнике сколько по поведению покупателей (скажем, если покупатели купившие один товар часто покупают другой и т.п.)

Тогда их нужно будет регулярно обновлять и индексировать, а также использовать нечёткий поиск.

Имхо, не лучший вариант.

UFO landed and left these words here

Я один не увидел, как для конкретных в данном случае товаров строятся их вектора? И как строится само "векторное" пространство?

В случае именно товаров, насколько мне известно, бывают различные подходы. При этом формирование векторного пространства можно условно разделить на два принципиально разных подхода - когда измерения имеют четкий физический смысл (например, цена или размер) и когда они полностью абстрактные. Например, часть измерений этого пространства может быть взята напрямую из многомерных характеристик товаров (цена, категория, размер, цвет и т.п.). Другая часть может использовать текстовые описания товаров - это аналог BERT и в этом случае измерения фиксированы, но начальные значения векторов в этих измерениях формируются случайно. Еще одна часть, например, может строиться на основе изображений товаров (CNN подход). Ну и, пожалуй самый важный с точки зрения продавца товара - это поведенческий подход для формирования пространства, когда векторы товаров изначально распределяются случайным образом, но в процессе работы системы они перегруппировываются на основе поведения покупателей (рядом оказываются товары, которые часто покупаются вместе). Все эти подходы обычно используются в комбинации, с разными весами в зависимости от конкретной задачи.

Можно так же заметить, что в абстрактных пространства , скажем, для поведенческого подхода можно использовать методы типа SVD (Singular Value Decomposition) а для контекстуальных вещей типа BERT используются уже нейронные сети.
Конечно же , можно навернуть сверху на это все PCA для снижения размерности пространств

векторы товаров изначально распределяются случайным образом

Но для этого хотя бы надо как-то размерность пространства задать?

Конечно, но это я думаю детали. То, что я читал по этому поводу ситуация такая - в LLM там бывает до нескольких тысяч, в BERT там до трех сотен. А в случае с SVD там вообще сотней обходятся. Но я это все прочитал в статьях, поскольку мой практический опыт использования абстрактных пространств ограничен OCR приложениями. Там это делалось для минимизации размерности (методом PCA) бинаризованного и преобразованного с помощью преобразования Адамара изображения символа в классификаторах. На этом мой практический опыт закончен, все остальное я прочитал из статей. Однако, индексацию векторных пространств я осваивал еще на алгоритмах QuadTree (сортировка на плоскости для ГИС ) и OctTree (квантизация цветовых RGB палитр ) - там пространства не абстрактные.
Кстати, насколько я понимаю упомянутый в статье ANN - это развитие методов из OctTree / QuadTree для пространств большей размерности.
Статья на ностальгию пробила - занимался я этим всем аж 25 лет назад :D

я тоже не увидел.
Вначале приводится пример про поиск по слову "лето", а потом база с векторами поиск по вектору. Прямо как классический переход от "Hello world" к написанию обработки трехмерной графики.

  • "Faiss: библиотека для поиска по сходству, разработанная Facebook."

    Не только библиотека для поиска, результаты можно сохранить на диске: vector_store.save_local("faiss_index")

И здесь нет ошибок в написании, поэтому нечёткий поиск (fuzzy search) не поможет. База данных не находит эти товары, потому что не понимает, что они в более общем смысле относятся к «лету».

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

Если делать это как в статье показано с простыми векторами [0.2, 0.3, 0.8], такой поиск действительно не сработает. Насколько я понимаю, в статье совсем не упомянуто что то вроде

model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')

То есть загрузка эмбеддингов - вообще про нее ничего не говорится, интересно почему.

ИМХО, стоило бы приводить пример из ГИС, там есть условно природный вектор - географические координаты.

Что-то хабр в последнее время стал часто публиковать вот такие поверхностные материалы. Жаль

Наверное конкретно для задачи поиска по словам имеет смысл упомянуть ElasticSearch/OpenSearch, как довольно широко используемые решения.

Antirez сейчас пилит такую штуку для Redis.

Пример некорректный. Нормальные покупатели не ищут по слову лето. Наоборот обычно покупатели ищут что-то конкретное, а уже задача маркетологов "менять сезон в магазине" и показывать рекомендации, что офлайн, что онлайн.

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

Sign up to leave a comment.