Ускорение генерации кандидатов в рекомендательных системах с использованием Milvus в сочетании с PaddlePaddle
Если у вас есть опыт разработки рекомендательной системы, вы, вероятно, сталкивались по крайней мере с одной из следующих проблем:
- Система работает крайне медленно при возврате результатов из-за огромного объема наборов данных.
- Недавно добавленные данные не могут обрабатываться в реальном времени для поиска или запроса.
- Развертывание рекомендательной системы представляет собой сложную задачу.
Эта статья призвана решить упомянутые выше проблемы и предоставить вам некоторые идеи, представив проект рекомендательной системы товаров, который использует Milvus, векторную базу данных с открытым исходным кодом, в сочетании с PaddlePaddle, платформой глубокого обучения.
В этой статье кратко описывается минимальный рабочий процесс рекомендательной системы. Затем она переходит к представлению основных компонентов и деталей реализации этого проекта.
Базовый рабочий процесс рекомендательной системы
Прежде чем углубляться в сам проект, давайте сначала рассмотрим базовый рабочий процесс рекомендательной системы. Рекомендательная система может возвращать персонализированные результаты в соответствии с уникальными интересами и потребностями пользователя. Чтобы делать такие персонализированные рекомендации, система проходит два этапа: генерация кандидатов и ранжирование.
Figure 1.
Первый этап — генерация кандидатов, которая возвращает наиболее релевантные или похожие данные, например товар или видео, соответствующие профилю пользователя. Во время генерации кандидатов система сравнивает характеристики пользователя с данными, хранящимися в ее базе данных, и извлекает похожие элементы. Затем во время ранжирования система оценивает и переупорядочивает извлеченные данные. Наконец, результаты, находящиеся в верхней части списка, показываются пользователям.
В нашем случае рекомендательной системы товаров она сначала сравнивает профиль пользователя с характеристиками товаров на складе, чтобы отфильтровать список товаров, удовлетворяющих потребностям пользователя. Затем система оценивает товары на основе их сходства с профилем пользователя, ранжирует их и в итоге возвращает пользователю 10 лучших товаров.
Figure 2.
Архитектура системы
Рекомендательная система товаров в этом проекте использует три компонента: MIND, PaddleRec и Milvus.
MIND
MIND, сокращение от "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", — это алгоритм, разработанный Alibaba Group. До появления MIND большинство распространенных AI-моделей для рекомендаций использовали один вектор для представления разнообразных интересов пользователя. Однако одного вектора далеко недостаточно, чтобы точно представить интересы пользователя. Поэтому был предложен алгоритм MIND, который преобразует множественные интересы пользователя в несколько векторов.
В частности, MIND использует multi-interest network с динамической маршрутизацией для обработки нескольких интересов одного пользователя на этапе генерации кандидатов. Multi-interest network — это слой извлечения множества интересов, построенный на механизме capsule routing. Его можно использовать для объединения прошлых действий пользователя с его или ее множественными интересами, чтобы создать точный профиль пользователя.
Следующая диаграмма иллюстрирует структуру сети MIND.
Figure 3.
Чтобы представить характеристики пользователей, MIND принимает действия пользователей и интересы пользователей в качестве входных данных, а затем передает их в embedding layer для генерации пользовательских векторов, включая векторы интересов пользователя и векторы поведения пользователя. Затем векторы поведения пользователя подаются в слой multi-interest extractor для генерации interest capsules пользователей. После конкатенации interest capsules пользователя с embeddings поведения пользователя и использования нескольких слоев ReLU для их преобразования MIND выводит несколько векторов представления пользователя. В этом проекте определено, что MIND в конечном итоге будет выводить четыре вектора представления пользователя.
С другой стороны, признаки продукта проходят через слой эмбеддингов и преобразуются в разреженные векторы товаров. Затем каждый вектор товара проходит через слой пулинга, чтобы стать плотным вектором.
Когда все данные преобразованы в векторы, вводится дополнительный слой внимания, учитывающий метки, чтобы направлять процесс обучения.
PaddleRec
PaddleRec — это крупномасштабная библиотека поисковых моделей для рекомендаций. Она является частью экосистемы Baidu PaddlePaddle. PaddleRec стремится предоставить разработчикам интегрированное решение для простого и быстрого создания рекомендательной системы.
Рисунок 4.
Как упоминалось во вступительном абзаце, инженерам, разрабатывающим рекомендательные системы, часто приходится сталкиваться с проблемами плохого удобства использования и сложного развертывания системы. Однако PaddleRec может помочь разработчикам в следующих аспектах:
Простота использования: PaddleRec — это библиотека с открытым исходным кодом, которая инкапсулирует различные популярные в отрасли модели, включая модели для генерации кандидатов, ранжирования, повторного ранжирования, многозадачности и многое другое. С PaddleRec вы можете мгновенно протестировать эффективность модели и повысить ее результативность за счет итераций. PaddleRec предлагает вам простой способ обучать модели для распределенных систем с отличной производительностью. Она оптимизирована для крупномасштабной обработки данных разреженных векторов. Вы можете легко масштабировать PaddleRec горизонтально и ускорять скорость ее вычислений. Поэтому вы можете быстро создавать среды обучения в Kubernetes с использованием PaddleRec.
Поддержка развертывания: PaddleRec предоставляет решения для онлайн-развертывания своих моделей. Модели готовы к использованию сразу после обучения, отличаясь гибкостью и высокой доступностью.
Milvus
Milvus — это векторная база данных с облачно-ориентированной архитектурой. Она имеет открытый исходный код на GitHub и может использоваться для хранения, индексирования и управления массивными векторами эмбеддингов, сгенерированными глубокими нейронными сетями и другими моделями машинного обучения (ML). Milvus инкапсулирует несколько первоклассных библиотек поиска приближенных ближайших соседей (ANN), включая Faiss, NMSLIB и Annoy. Вы также можете масштабировать Milvus в соответствии со своими потребностями. Сервис Milvus обладает высокой доступностью и поддерживает унифицированную пакетную и потоковую обработку. Milvus стремится упростить процесс управления неструктурированными данными и обеспечить единообразный пользовательский опыт в различных средах развертывания. Он имеет следующие функции:
Высокая производительность при выполнении векторного поиска по массивным наборам данных.
Сообщество, ориентированное на разработчиков, которое предлагает поддержку нескольких языков и цепочки инструментов.
Облачная масштабируемость и высокая надежность даже в случае сбоя.
Гибридный поиск, достигаемый сочетанием скалярной фильтрации с поиском по векторному сходству.
Milvus используется для поиска векторного сходства и управления векторами в этом проекте, поскольку он может решить проблему частых обновлений данных, сохраняя при этом стабильность системы.
Реализация системы
Чтобы создать рекомендательную систему продуктов в этом проекте, необходимо выполнить следующие шаги:
- Обработка данных
- Обучение модели
- Тестирование модели
- Генерация кандидатов товаров
- Хранение данных: векторы товаров получаются с помощью обученной модели и сохраняются в Milvus.
- Поиск данных: четыре пользовательских вектора, сгенерированные MIND, передаются в Milvus для поиска векторного сходства.
- Ранжирование данных: каждый из четырех векторов имеет свои собственные
top_kпохожих векторов товаров, и четыре набора векторовtop_kранжируются, чтобы вернуть итоговый список изtop_kнаиболее похожих векторов.
Исходный код этого проекта размещен на платформе Baidu AI Studio. Следующий раздел представляет собой подробное объяснение исходного кода для этого проекта.
Шаг 1. Обработка данных
Исходный набор данных взят из набора данных книг Amazon, предоставленного ComiRec. Однако в этом проекте используются данные, загруженные из PaddleRec и обработанные им. Подробнее см. AmazonBook dataset в проекте PaddleRec.
Ожидается, что набор данных для обучения будет иметь следующий формат, где каждый столбец представляет:
Uid: ID пользователя.item_id: ID товара, по которому кликнул пользователь.Time: Временная метка или порядок клика.
Ожидается, что набор данных для тестирования будет иметь следующий формат, где каждый столбец представляет:
Uid: ID пользователя.hist_item: ID товара в историческом поведении кликов пользователя. Если существует несколькоhist_item, они отсортированы согласно временной метке.eval_item: Фактическая последовательность, в которой пользователь кликает по товарам.
Шаг 2. Обучение модели
Обучение модели использует обработанные данные из предыдущего шага и применяет модель генерации кандидатов, MIND, построенную на PaddleRec.
1. Входные данные модели
В dygraph_model.py выполните следующий код, чтобы обработать данные и преобразовать их во входные данные модели. Этот процесс сортирует товары, по которым кликнул один и тот же пользователь в исходных данных, согласно временной метке и объединяет их для формирования последовательности. Затем случайным образом выберите item``_``id из последовательности в качестве target_item и извлеките 10 товаров перед target_item в качестве hist_item для входных данных модели. Если последовательность недостаточно длинная, ее можно задать как 0. seq_len должен быть фактической длиной последовательности hist_item.
def create_feeds_train(self, batch_data):
hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
target_item = paddle.to_tensor(batch_data[1], dtype="int64")
seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
return [hist_item, target_item, seq_len]
Обратитесь к скрипту /home/aistudio/recommend/model/mind/mind_reader.py для кода чтения исходного набора данных.
2. Сетевая архитектура модели
Следующий код является фрагментом net.py. class Mind_Capsual_Layer определяет слой извлечения множественных интересов, построенный на механизме маршрутизации interest capsule. Функция label_aware_attention() реализует технику label-aware attention в алгоритме MIND. Функция forward() в class MindLayer моделирует характеристики пользователя и генерирует соответствующие весовые векторы.
class Mind_Capsual_Layer(nn.Layer):
def __init__(self):
super(Mind_Capsual_Layer, self).__init__()
self.iters = iters
self.input_units = input_units
self.output_units = output_units
self.maxlen = maxlen
self.init_std = init_std
self.k_max = k_max
self.batch_size = batch_size
# B2I routing
self.routing_logits = self.create_parameter(
shape=[1, self.k_max, self.maxlen],
attr=paddle.ParamAttr(
name="routing_logits", trainable=False),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
# bilinear mapping
self.bilinear_mapping_matrix = self.create_parameter(
shape=[self.input_units, self.output_units],
attr=paddle.ParamAttr(
name="bilinear_mapping_matrix", trainable=True),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
class MindLayer(nn.Layer):
def label_aware_attention(self, keys, query):
weight = paddle.sum(keys * query, axis=-1, keepdim=True)
weight = paddle.pow(weight, self.pow_p) # [x,k_max,1]
weight = F.softmax(weight, axis=1)
output = paddle.sum(keys * weight, axis=1)
return output, weight
def forward(self, hist_item, seqlen, labels=None):
hit_item_emb = self.item_emb(hist_item) # [B, seqlen, embed_dim]
user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
if not self.training:
return user_cap, cap_weights
target_emb = self.item_emb(labels)
user_emb, W = self.label_aware_attention(user_cap, target_emb)
return self.sampled_softmax(
user_emb, labels, self.item_emb.weight,
self.embedding_bias), W, user_cap, cap_weights, cap_mask
Обратитесь к скрипту /home/aistudio/recommend/model/mind/net.py для конкретной структуры сети MIND.
3. Оптимизация модели
В этом проекте в качестве оптимизатора модели используется алгоритм Adam.
def create_optimizer(self, dy_model, config):
lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
optimizer = paddle.optimizer.Adam(
learning_rate=lr, parameters=dy_model.parameters())
return optimizer
Кроме того, PaddleRec записывает гиперпараметры в config.yaml, поэтому вам нужно только изменить этот файл, чтобы увидеть наглядное сравнение эффективности двух моделей для повышения эффективности модели. При обучении модели слабый эффект модели может быть результатом недообучения или переобучения модели. Поэтому вы можете улучшить его, изменив количество эпох обучения. В этом проекте вам нужно только изменить параметр epochs в config.yaml, чтобы найти идеальное количество эпох обучения. Кроме того, вы также можете изменить оптимизатор модели, optimizer.class, или learning_rate для отладки. Ниже показана часть параметров в config.yaml.
runner:
use_gpu: True
use_auc: False
train_batch_size: 128
epochs: 20
print_interval: 10
model_save_path: "output_model_mind"
# hyper parameters of user-defined network
hyper_parameters:
# optimizer config
optimizer:
class: Adam
learning_rate: 0.005
Обратитесь к скрипту /home/aistudio/recommend/model/mind/dygraph_model.py для подробной реализации.
4. Обучение модели
Выполните следующую команду, чтобы начать обучение модели.
python -u trainer.py -m mind/config.yaml
Обратитесь к /home/aistudio/recommend/model/trainer.py для проекта обучения модели.
Шаг 3. Тестирование модели
На этом шаге используется тестовый набор данных для проверки производительности, например показателя recall обученной модели.
Во время тестирования модели все векторы товаров загружаются из модели, а затем импортируются в Milvus, векторную базу данных с открытым исходным кодом. Прочитайте тестовый набор данных с помощью скрипта /home/aistudio/recommend/model/mind/mind_infer_reader.py. Загрузите модель из предыдущего шага и подайте тестовый набор данных в модель, чтобы получить четыре вектора интересов пользователя. Найдите в Milvus 50 векторов товаров, наиболее похожих на четыре вектора интересов. Вы можете рекомендовать пользователям возвращенные результаты.
Выполните следующую команду, чтобы протестировать модель.
python -u infer.py -m mind/config.yaml -top_n 50
Во время тестирования модели система предоставляет несколько показателей для оценки эффективности модели, таких как Recall@50, NDCG@50 и HitRate@50. В этой статье рассматривается только изменение одного параметра. Однако в вашем собственном сценарии применения вам нужно обучать больше эпох для лучшего эффекта модели. Вы также можете повысить эффективность модели, используя разные оптимизаторы, задавая разные learning rates и увеличивая количество раундов тестирования. Рекомендуется сохранить несколько моделей с разными эффектами, а затем выбрать ту, которая показывает лучшую производительность и лучше всего подходит для вашего приложения.
Шаг 4. Генерация кандидатов товарных позиций
Чтобы создать сервис генерации кандидатов товаров, этот проект использует обученную модель из предыдущих шагов в сочетании с Milvus. Во время генерации кандидатов FASTAPI используется для предоставления интерфейса. Когда сервис запускается, вы можете напрямую выполнять команды в терминале через curl.
Выполните следующую команду, чтобы сгенерировать предварительных кандидатов.
uvicorn main:app
Сервис предоставляет четыре типа интерфейсов:
- Insert : Выполните следующую команду, чтобы прочитать векторы товаров из вашей модели и вставить их в коллекцию в Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/insert_data' \
-H 'accept: application/json' \
-d ''
- Сгенерировать предварительных кандидатов: Введите последовательность, в которой пользователь нажимает на продукты, и определите следующий продукт, на который пользователь может нажать. Вы также можете генерировать кандидатов продуктовых товаров пакетами для нескольких пользователей за один раз.
hist_itemв следующей команде — это двумерный вектор, и каждая строка представляет собой последовательность продуктов, на которые пользователь нажимал в прошлом. Вы можете определить длину последовательности. Возвращаемые результаты также являются наборами двумерных векторов, каждая строка представляет возвращаемыеitem idдля пользователей.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/recall' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"top_k": 50,
"hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
- Запросить общее количество продуктовых товаров: Выполните следующую команду, чтобы вернуть общее количество векторов товаров, хранящихся в базе данных Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/count' \
-H 'accept: application/json' \
-d ''
- Удалить: Выполните следующую команду, чтобы удалить все данные, хранящиеся в базе данных Milvus .
curl -X 'POST' \
'http://127.0.0.1:8000/qa/drop' \
-H 'accept: application/json' \
-d ''
Если вы запускаете сервис генерации кандидатов на своем локальном сервере, вы также можете получить доступ к указанным выше интерфейсам по адресу 127.0.0.1:8000/docs. Вы можете поэкспериментировать, нажав на четыре интерфейса и введя значение параметров. Затем нажмите "Try it out", чтобы получить результат рекомендации.
Рисунок 5.
Рисунок 6.
Краткое резюме
Эта статья в основном посвящена первому этапу генерации кандидатов при создании рекомендательной системы. Она также предлагает решение для ускорения этого процесса путем объединения Milvus с алгоритмом MIND и PaddleRec и, таким образом, рассматривает проблему, обозначенную во вступительном абзаце.
Что делать, если система работает чрезвычайно медленно при возврате результатов из-за огромного объема наборов данных? Milvus, векторная база данных с открытым исходным кодом, предназначена для молниеносно быстрого поиска по сходству в плотных векторных наборах данных, содержащих миллионы, миллиарды или даже триллионы векторов.
Что делать, если новые вставленные данные не могут обрабатываться в реальном времени для поиска или запроса? Вы можете использовать Milvus, поскольку он поддерживает унифицированную пакетную и потоковую обработку и позволяет искать и запрашивать вновь вставленные данные в реальном времени. Кроме того, модель MIND способна преобразовывать новое поведение пользователя в реальном времени и мгновенно вставлять пользовательские векторы в Milvus.
Что делать, если сложное развертывание кажется слишком пугающим? PaddleRec, мощная библиотека, принадлежащая экосистеме PaddlePaddle, может предоставить вам интегрированное решение для развертывания вашей рекомендательной системы или других приложений простым и быстрым способом.
Об авторе
Юньмэй Ли, инженер по данным в Zilliz, окончила Хуачжунский университет науки и технологии по специальности «компьютерные науки». После присоединения к Zilliz она занимается поиском решений для проекта с открытым исходным кодом Milvus и помогает пользователям применять Milvus в реальных сценариях. Ее основное внимание сосредоточено на NLP и рекомендательных системах, и она хотела бы еще больше углубить свою специализацию в этих двух областях. Она любит проводить время в одиночестве и читать.
Ищете дополнительные ресурсы?
- Больше пользовательских кейсов по созданию рекомендательной системы:
- Создание персонализированной системы рекомендаций товаров с Vipshop при помощи Milvus
- Создание приложения для планирования гардероба и образов с Milvus
- Создание интеллектуальной системы рекомендаций новостей внутри приложения Sohu News
- Коллаборативная фильтрация на основе объектов для музыкальной рекомендательной системы
- Создаем с Milvus: рекомендация новостей на базе AI внутри мобильного браузера Xiaomi
- Больше проектов Milvus в сотрудничестве с другими сообществами:
- Взаимодействуйте с нашим open-source-сообществом:
Читать далее

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.



