🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Ускорение генерации кандидатов в рекомендательных системах с помощью Milvus в паре с PaddlePaddle

Ускорение генерации кандидатов в рекомендательных системах с помощью Milvus в паре с PaddlePaddle

  • Scenarios
November 26, 2021
Yunmei

Если у вас есть опыт разработки рекомендательной системы, то вы, скорее всего, стали жертвой хотя бы одной из следующих проблем:

  • Система крайне медленно возвращает результаты из-за огромного количества наборов данных.
  • Вновь вводимые данные не могут быть обработаны в режиме реального времени для поиска или запроса.
  • Развертывание рекомендательной системы сопряжено с большими трудностями.

Цель этой статьи - решить вышеупомянутые проблемы и дать вам некоторые рекомендации, представив проект системы рекомендаций продуктов, в котором используется Milvus, векторная база данных с открытым исходным кодом, в паре с PaddlePaddle, платформой глубокого обучения.

В этой статье мы кратко опишем минимальный рабочий процесс рекомендательной системы. Затем в ней представлены основные компоненты и детали реализации данного проекта.

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

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

2.png 2.png

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

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

3.png 3.png

Архитектура системы

Система рекомендаций товаров в этом проекте использует три компонента: MIND, PaddleRec и Milvus.

MIND

MIND, сокращение от "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", - это алгоритм, разработанный Alibaba Group. До появления MIND большинство распространенных моделей ИИ для рекомендаций использовали один вектор для представления разнообразных интересов пользователя. Однако одного вектора далеко не достаточно для точного представления интересов пользователя. Поэтому был предложен алгоритм MIND, позволяющий превратить множество интересов пользователя в несколько векторов.

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

Следующая диаграмма иллюстрирует сетевую структуру MIND.

4.png 4.png

Чтобы представить черты пользователей, MIND принимает в качестве входных данных поведение и интересы пользователей, а затем передает их в слой встраивания для создания векторов пользователей, включая векторы интересов и поведения пользователей. Затем векторы поведения пользователя подаются в слой экстрактора интересов для создания капсул интересов пользователей. После объединения капсул пользовательских интересов с вкраплениями пользовательского поведения и использования нескольких слоев ReLU для их преобразования MIND выдает несколько векторов пользовательского представления. В данном проекте определено, что в конечном итоге MIND будет выдавать четыре вектора представлений пользователей.

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

Когда все данные преобразуются в векторы, вводится дополнительный слой внимания, учитывающий метки, чтобы направлять процесс обучения.

PaddleRec

PaddleRec - это крупномасштабная библиотека поисковых моделей для рекомендаций. Она является частью экосистемы Baidu PaddlePaddle. Цель PaddleRec - предоставить разработчикам интегрированное решение для быстрого и простого создания рекомендательных систем.

5.png 5.png

Как уже упоминалось во вступительном абзаце, инженерам, разрабатывающим рекомендательные системы, часто приходится сталкиваться с проблемами плохого юзабилити и сложного развертывания системы. Однако PaddleRec может помочь разработчикам в следующих аспектах:

  • Простота использования: PaddleRec - это библиотека с открытым исходным кодом, в которой собраны различные популярные модели, включая модели генерации кандидатов, ранжирования, повторного ранжирования, многозадачности и другие. С помощью PaddleRec вы можете мгновенно проверить эффективность модели и повысить ее эффективность с помощью итераций. PaddleRec предлагает простой способ обучения моделей для распределенных систем с отличной производительностью. Он оптимизирован для крупномасштабной обработки данных с разреженными векторами. Вы можете легко масштабировать PaddleRec по горизонтали и ускорить скорость его вычислений. Поэтому с помощью PaddleRec можно быстро создавать обучающие среды на Kubernetes.

  • Поддержка развертывания: PaddleRec предоставляет решения для развертывания своих моделей в режиме онлайн. Модели сразу готовы к использованию после обучения, что обеспечивает гибкость и высокую доступность.

Milvus

Milvus - это векторная база данных с облачной нативной архитектурой. Она открыта на GitHub и может использоваться для хранения, индексации и управления массивными векторами встраивания, генерируемыми глубокими нейронными сетями и другими моделями машинного обучения (ML). Milvus включает в себя несколько первоклассных библиотек поиска ближайших соседей (ANN), в том числе Faiss, NMSLIB и Annoy. Вы также можете масштабировать Milvus в соответствии с вашими потребностями. Сервис Milvus отличается высокой доступностью и поддерживает унифицированную пакетную и потоковую обработку. Milvus стремится упростить процесс управления неструктурированными данными и обеспечить согласованный пользовательский опыт в различных средах развертывания. Он обладает следующими возможностями:

  • Высокая производительность при проведении векторного поиска в массивных массивах данных.

  • Сообщество разработчиков, ориентированное на разработчиков, предлагает многоязыковую поддержку и инструментарий.

  • Масштабируемость облака и высокая надежность даже в случае сбоев.

  • Гибридный поиск достигается за счет объединения скалярной фильтрации с векторным поиском сходства.

В данном проекте для поиска векторного сходства и управления векторами используется Milvus, поскольку он позволяет решить проблему частого обновления данных, сохраняя при этом стабильность системы.

Реализация системы

Чтобы построить систему рекомендаций товаров в этом проекте, необходимо выполнить следующие шаги:

  1. Обработка данных
  2. обучение модели
  3. тестирование модели
  4. Генерация кандидатов в товарные позиции
    1. Хранение данных: векторы товаров получаются с помощью обученной модели и хранятся в Milvus.
    2. Поиск данных: четыре пользовательских вектора, сгенерированных MIND, подаются в Milvus для поиска векторного сходства.
    3. Ранжирование данных: каждый из четырех векторов имеет свои собственные top_k похожие векторы предметов, и четыре набора top_k векторов ранжируются для получения окончательного списка top_k наиболее похожих векторов.

Исходный код этого проекта размещен на платформе Baidu AI Studio. В следующем разделе приводится подробное описание исходного кода этого проекта.

Шаг 1. Обработка данных

В качестве исходного набора данных используется набор данных книг Amazon, предоставленный компанией ComiRec. Однако в данном проекте используются данные, загруженные и обработанные PaddleRec. Дополнительную информацию см. в разделе " Набор данных AmazonBook " в проекте 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 определяет слой мультиинтересного экстрактора, построенный на механизме маршрутизации капсул интересов. Функция 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

Конкретную структуру сети MIND см. в скрипте /home/aistudio/recommend/model/mind/net.py.

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. Тестирование модели

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

Во время тестирования модели все векторы элементов загружаются из модели, а затем импортируются в Milvus, базу данных векторов с открытым исходным кодом. Прочитайте тестовый набор данных с помощью скрипта /home/aistudio/recommend/model/mind/mind_infer_reader.py. Загрузите модель, созданную на предыдущем шаге, и подайте тестовый набор данных в модель, чтобы получить четыре вектора интересов пользователя. Выполните поиск 50 наиболее похожих векторов элементов на четыре вектора интересов в Milvus. Полученные результаты можно рекомендовать пользователям.

Выполните следующую команду, чтобы протестировать модель.

python -u infer.py -m mind/config.yaml -top_n 50

Во время тестирования модели система предоставляет несколько показателей для оценки ее эффективности, таких как Recall@50, NDCG@50 и HitRate@50. В этой статье рассматривается изменение только одного параметра. Однако в вашем собственном сценарии применения для повышения эффективности модели вам потребуется большее количество эпох обучения. Вы также можете повысить эффективность модели, используя различные оптимизаторы, устанавливая разные скорости обучения и увеличивая количество раундов тестирования. Рекомендуется сохранить несколько моделей с разными эффектами, а затем выбрать ту, которая обладает наилучшей производительностью и лучше всего подходит для вашего приложения.

Шаг 4. Генерация кандидатов в товарные позиции

Для создания сервиса генерации кандидатов на товар в данном проекте используется обученная на предыдущих шагах модель в паре с Milvus. Во время генерации кандидатов используется интерфейс FASTAPI. Когда сервис запускается, вы можете напрямую запускать команды в терминале через curl.

Выполните следующую команду для генерации предварительных кандидатов.

uvicorn main:app

Сервис предоставляет четыре типа интерфейсов:

  • Вставка: Выполните следующую команду, чтобы прочитать векторы элементов из вашей модели и вставить их в коллекцию в Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/insert_data' \
  -H 'accept: application/json' \
  -d ''
  • Генерировать предварительные кандидаты: Введите последовательность, в которой пользователь нажимает на товары, и определите следующий товар, на который пользователь может нажать. Вы также можете генерировать кандидатуры товаров партиями для нескольких пользователей за один раз. hist_item в следующей команде - это двумерный вектор, каждая строка которого представляет собой последовательность товаров, которые пользователь нажимал в прошлом. Вы можете задать длину последовательности. Возвращаемые результаты также являются наборами двумерных векторов, каждая строка которых представляет собой возвращенные item ids для пользователей.
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. Вы можете поиграть, щелкая по четырем интерфейсам и вводя значения параметров. Затем нажмите кнопку "Попробовать", чтобы получить результат рекомендации.

6.png 6.png

7.png 7.png

Обзор

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

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

Что делать, если новые данные не могут быть обработаны в режиме реального времени для поиска или запроса? Вы можете использовать Milvus, поскольку он поддерживает унифицированную пакетную и потоковую обработку и позволяет выполнять поиск и запросы по вновь введенным данным в режиме реального времени. Кроме того, модель MIND способна преобразовывать новое поведение пользователей в режиме реального времени и мгновенно вставлять пользовательские векторы в Milvus.

Что делать, если сложное развертывание слишком пугает? PaddleRec, мощная библиотека, входящая в экосистему PaddlePaddle, может предоставить вам интегрированное решение для простого и быстрого развертывания вашей рекомендательной системы или других приложений.

Об авторе

Юньмэй Ли, инженер по данным Zilliz, окончила Хуачжунский университет науки и технологий по специальности "информатика". С момента прихода в Zilliz она работает над поиском решений для проекта с открытым исходным кодом Milvus и помогает пользователям применять Milvus в реальных сценариях. Ее основное внимание сосредоточено на НЛП и рекомендательных системах, и она хотела бы еще больше углубиться в эти две области. Она любит проводить время в одиночестве и читать.

Ищете другие ресурсы?

Like the article? Spread the word

Продолжить чтение