Comments 22
Насколько я помню, обычно эмбеддинги разреженные, поэтому для понижения их размерности используют не PCA
, а методы, хорошо умеющие в разреженные матрицы, например TruncatedSVD
. А t-SNE
вообще очень ресурсозатратный, его обычно только когда нужно на плоскости нарисовать разделение кластеров используют.
Насколько я понимаю SVD для этого сценария действительно больше и лучше подходит чем PCA. Особенно если пространство формируется из статистики пользователей-покупок-поведения.
А может проще искать по БД с продуктами и тегами, их описывающими? Как раз Панама и была бы найдена по тегу "Лето". Теги можно присваивать и с помощью ИИ по наименованию товара, текстовому описанию и картинке (распознаванию объектов на картинке).
А может проще искать по БД с продуктами и тегами, их описывающими?
Пару лет назад я бы использовал именно такое решение для поиска.
Но познакомившись с векторизацией и семантическим поиском, считаю, что каждой задаче свое решение.
Если в пользовательском интерфейсе можно предоставить пользователю список тегов, то реляционная база с тегами, возможно, самое простое и шустрое решение. Если же пользователь описывает запрос своими словами, то подключается семантический поиск по смыслу. И в этом случае векторизация более подходит.
Да, семантический поиск это сила. Хотел бы дополнить - в статье указывается про тематический поиск - скажем по ключевому слову лето найти товары типа платья и т.п.
Для этого, из того что я понял хорошо подходит не столько семантический поиск а именно SVD (Singular Value Desomposition). Допустим есть таблица в которой столбцы - это покупатели а строки - это товары. SVD может представить эту матрицу таким образом (найдя наиболее влиятельные сингулярные значения ) что она будет в некотором смысле определять скрытые факторы(абстракция, но можно представить как группы покупателей и группы товаров или , ключевые слова поиска).
Это даст возможность группировать товары не столько по сематнике сколько по поведению покупателей (скажем, если покупатели купившие один товар часто покупают другой и т.п.)
Тогда их нужно будет регулярно обновлять и индексировать, а также использовать нечёткий поиск.
Имхо, не лучший вариант.
Я один не увидел, как для конкретных в данном случае товаров строятся их вектора? И как строится само "векторное" пространство?
В случае именно товаров, насколько мне известно, бывают различные подходы. При этом формирование векторного пространства можно условно разделить на два принципиально разных подхода - когда измерения имеют четкий физический смысл (например, цена или размер) и когда они полностью абстрактные. Например, часть измерений этого пространства может быть взята напрямую из многомерных характеристик товаров (цена, категория, размер, цвет и т.п.). Другая часть может использовать текстовые описания товаров - это аналог BERT и в этом случае измерения фиксированы, но начальные значения векторов в этих измерениях формируются случайно. Еще одна часть, например, может строиться на основе изображений товаров (CNN подход). Ну и, пожалуй самый важный с точки зрения продавца товара - это поведенческий подход для формирования пространства, когда векторы товаров изначально распределяются случайным образом, но в процессе работы системы они перегруппировываются на основе поведения покупателей (рядом оказываются товары, которые часто покупаются вместе). Все эти подходы обычно используются в комбинации, с разными весами в зависимости от конкретной задачи.
Можно так же заметить, что в абстрактных пространства , скажем, для поведенческого подхода можно использовать методы типа SVD (Singular Value Decomposition) а для контекстуальных вещей типа BERT используются уже нейронные сети.
Конечно же , можно навернуть сверху на это все PCA для снижения размерности пространств
векторы товаров изначально распределяются случайным образом
Но для этого хотя бы надо как-то размерность пространства задать?
Конечно, но это я думаю детали. То, что я читал по этому поводу ситуация такая - в LLM там бывает до нескольких тысяч, в BERT там до трех сотен. А в случае с SVD там вообще сотней обходятся. Но я это все прочитал в статьях, поскольку мой практический опыт использования абстрактных пространств ограничен OCR приложениями. Там это делалось для минимизации размерности (методом PCA) бинаризованного и преобразованного с помощью преобразования Адамара изображения символа в классификаторах. На этом мой практический опыт закончен, все остальное я прочитал из статей. Однако, индексацию векторных пространств я осваивал еще на алгоритмах QuadTree (сортировка на плоскости для ГИС ) и OctTree (квантизация цветовых RGB палитр ) - там пространства не абстрактные.
Кстати, насколько я понимаю упомянутый в статье ANN - это развитие методов из OctTree / QuadTree для пространств большей размерности.
Статья на ностальгию пробила - занимался я этим всем аж 25 лет назад :D
я тоже не увидел.
Вначале приводится пример про поиск по слову "лето", а потом база с векторами поиск по вектору. Прямо как классический переход от "Hello world" к написанию обработки трехмерной графики.
И здесь нет ошибок в написании, поэтому нечёткий поиск (fuzzy search) не поможет. База данных не находит эти товары, потому что не понимает, что они в более общем смысле относятся к «лету».
Векторная база на этих данных тоже не сможет. Сравнения поиска на строках и поиска на обогащенный данных выглядит как манипуляция и подрывает доверие к остальной информации.
Если делать это как в статье показано с простыми векторами [0.2, 0.3, 0.8], такой поиск действительно не сработает. Насколько я понимаю, в статье совсем не упомянуто что то вроде
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
То есть загрузка эмбеддингов - вообще про нее ничего не говорится, интересно почему.
Что-то хабр в последнее время стал часто публиковать вот такие поверхностные материалы. Жаль
Наверное конкретно для задачи поиска по словам имеет смысл упомянуть ElasticSearch/OpenSearch, как довольно широко используемые решения.
Antirez сейчас пилит такую штуку для Redis.
Пример некорректный. Нормальные покупатели не ищут по слову лето. Наоборот обычно покупатели ищут что-то конкретное, а уже задача маркетологов "менять сезон в магазине" и показывать рекомендации, что офлайн, что онлайн.
Статья интересная и помогает начать капать в нужную сторону. Но подробного объяснения некоторых тем нет. Пример на питоне только для маленькой базы данных с простым перебором. Про алгоритм сравнения расстояния через косинус угла вообще непонятно! В общем я бы хотел увидеть статью, в которой тему раскроют шире и глубже.
О векторных базах данных простым языком