🚀 Essayez Zilliz Cloud, la version entièrement gérée de Milvus, gratuitement—découvrez des performances 10x plus rapides ! Essayez maintenant>>

milvus-logo
LFAI
  • Home
  • Blog
  • Accélérer la génération de candidats dans les systèmes de recommandation en utilisant Milvus associé à PaddlePaddle

Accélérer la génération de candidats dans les systèmes de recommandation en utilisant Milvus associé à PaddlePaddle

  • Scenarios
November 26, 2021
Yunmei

Si vous avez déjà développé un système de recommandation, il est probable que vous ayez été victime d'au moins un des problèmes suivants :

  • Le système est extrêmement lent lorsqu'il renvoie des résultats en raison de l'énorme quantité d'ensembles de données.
  • Les données nouvellement insérées ne peuvent pas être traitées en temps réel pour la recherche ou l'interrogation.
  • Le déploiement du système de recommandation est décourageant.

Cet article vise à aborder les problèmes mentionnés ci-dessus et à vous donner quelques idées en présentant un projet de système de recommandation de produits qui utilise Milvus, une base de données vectorielles open-source, associée à PaddlePaddle, une plateforme d'apprentissage profond.

Cet article décrit brièvement le flux de travail minimal d'un système de recommandation. Il présente ensuite les principaux composants et les détails de la mise en œuvre de ce projet.

Le flux de travail de base d'un système de recommandation

Avant d'entrer dans le vif du sujet, examinons d'abord le processus de base d'un système de recommandation. Un système de recommandation peut renvoyer des résultats personnalisés en fonction des intérêts et des besoins uniques de l'utilisateur. Pour faire de telles recommandations personnalisées, le système passe par deux étapes : la génération de candidats et le classement.

2.png 2.png

La première étape est la génération de candidats, qui renvoie les données les plus pertinentes ou similaires, telles qu'un produit ou une vidéo correspondant au profil de l'utilisateur. Lors de la génération de candidats, le système compare les caractéristiques de l'utilisateur avec les données stockées dans sa base de données et extrait les données similaires. Ensuite, lors du classement, le système note et réorganise les données extraites. Enfin, les résultats situés en haut de la liste sont présentés aux utilisateurs.

Dans le cas d'un système de recommandation de produits, il compare d'abord le profil de l'utilisateur avec les caractéristiques des produits en stock afin de filtrer une liste de produits répondant aux besoins de l'utilisateur. Ensuite, le système évalue les produits en fonction de leur similarité avec le profil de l'utilisateur, les classe et renvoie finalement les 10 meilleurs produits à l'utilisateur.

3.png 3.png

Architecture du système

Le système de recommandation de produits de ce projet utilise trois composants : MIND, PaddleRec et Milvus.

MIND

MIND, abréviation de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", est un algorithme développé par le groupe Alibaba. Avant que MIND ne soit proposé, la plupart des modèles d'IA prédominants pour la recommandation utilisaient un seul vecteur pour représenter les intérêts variés d'un utilisateur. Cependant, un vecteur unique est loin d'être suffisant pour représenter les intérêts exacts d'un utilisateur. C'est pourquoi l'algorithme MIND a été proposé pour transformer les intérêts multiples d'un utilisateur en plusieurs vecteurs.

Plus précisément, MIND adopte un réseau multi-intérêts avec routage dynamique pour traiter les intérêts multiples d'un utilisateur au cours de la phase de génération des candidats. Le réseau multi-intérêts est une couche d'extracteur multi-intérêts construite sur le mécanisme de routage des capsules. Il peut être utilisé pour combiner les comportements antérieurs d'un utilisateur avec ses intérêts multiples, afin de fournir un profil d'utilisateur précis.

Le diagramme suivant illustre la structure du réseau MIND.

4.png 4.png

Pour représenter les caractéristiques des utilisateurs, MIND prend en compte les comportements et les intérêts des utilisateurs, puis les introduit dans la couche d'intégration pour générer des vecteurs d'utilisateurs, notamment des vecteurs d'intérêts et des vecteurs de comportements. Les vecteurs de comportement de l'utilisateur sont ensuite introduits dans la couche d'extraction des intérêts multiples pour générer des capsules d'intérêt de l'utilisateur. Après avoir concaténé les capsules d'intérêt de l'utilisateur avec les embeddings de comportement de l'utilisateur et utilisé plusieurs couches ReLU pour les transformer, MIND produit plusieurs vecteurs de représentation de l'utilisateur. Ce projet a défini que MIND produira finalement quatre vecteurs de représentation de l'utilisateur.

D'autre part, les caractéristiques des produits passent par la couche d'intégration et sont converties en vecteurs d'articles épars. Ensuite, chaque vecteur d'élément passe par une couche de mise en commun pour devenir un vecteur dense.

Lorsque toutes les données sont converties en vecteurs, une couche d'attention supplémentaire tenant compte des étiquettes est introduite pour guider le processus de formation.

PaddleRec

PaddleRec est une bibliothèque de modèles de recherche à grande échelle pour la recommandation. Elle fait partie de l'écosystème Baidu PaddlePaddle. PaddleRec vise à fournir aux développeurs une solution intégrée pour construire un système de recommandation de manière simple et rapide.

5.png 5.png

Comme indiqué dans le premier paragraphe, les ingénieurs qui développent des systèmes de recommandation doivent souvent faire face à des difficultés d'utilisation et à un déploiement compliqué du système. Toutefois, PaddleRec peut aider les développeurs dans les domaines suivants :

  • Facilité d'utilisation : PaddleRec est une bibliothèque open-source qui encapsule divers modèles populaires dans l'industrie, y compris des modèles pour la génération de candidats, le classement, le reranking, le multitasking, et plus encore. Avec PaddleRec, vous pouvez instantanément tester l'efficacité du modèle et l'améliorer par itération. PaddleRec vous offre un moyen simple de former des modèles pour les systèmes distribués avec d'excellentes performances. Il est optimisé pour le traitement de données à grande échelle de vecteurs épars. Vous pouvez facilement faire évoluer PaddleRec horizontalement et accélérer sa vitesse de calcul. Par conséquent, vous pouvez rapidement construire des environnements de formation sur Kubernetes à l'aide de PaddleRec.

  • Support pour le déploiement : PaddleRec fournit des solutions de déploiement en ligne pour ses modèles. Les modèles sont immédiatement prêts à être utilisés après la formation, se caractérisant par leur flexibilité et leur haute disponibilité.

Milvus

Milvus est une base de données vectorielle dotée d'une architecture cloud-native. Elle est open source sur GitHub et peut être utilisée pour stocker, indexer et gérer des vecteurs d'intégration massifs générés par des réseaux neuronaux profonds et d'autres modèles d'apprentissage machine (ML). Milvus encapsule plusieurs bibliothèques de recherche approximative du plus proche voisin (ANN) de première classe, notamment Faiss, NMSLIB et Annoy. Vous pouvez également faire évoluer Milvus en fonction de vos besoins. Le service Milvus est hautement disponible et prend en charge le traitement unifié par lots et par flux. Milvus s'engage à simplifier le processus de gestion des données non structurées et à fournir une expérience utilisateur cohérente dans différents environnements de déploiement. Il présente les caractéristiques suivantes :

  • Des performances élevées lors de la recherche vectorielle sur des ensembles de données massifs.

  • Une communauté de développeurs qui offre un support multilingue et une chaîne d'outils.

  • Évolutivité dans le nuage et grande fiabilité, même en cas d'interruption.

  • Recherche hybride obtenue en associant le filtrage scalaire à la recherche de similarité vectorielle.

Milvus est utilisé pour la recherche de similarité vectorielle et la gestion des vecteurs dans ce projet parce qu'il peut résoudre le problème des mises à jour fréquentes des données tout en maintenant la stabilité du système.

Mise en œuvre du système

Pour construire le système de recommandation de produits de ce projet, vous devez suivre les étapes suivantes :

  1. Traitement des données
  2. Entraînement du modèle
  3. Test du modèle
  4. Génération de candidats à l'achat d'un produit
    1. Stockage des données : les vecteurs d'articles sont obtenus grâce au modèle entraîné et sont stockés dans Milvus.
    2. Recherche de données : quatre vecteurs d'utilisateurs générés par MIND sont introduits dans Milvus pour la recherche de similitudes vectorielles.
    3. Classement des données : chacun des quatre vecteurs a ses propres vecteurs d'éléments similaires top_k, et quatre ensembles de vecteurs top_k sont classés pour produire une liste finale des vecteurs les plus similaires top_k.

Le code source de ce projet est hébergé sur la plateforme Baidu AI Studio. La section suivante explique en détail le code source de ce projet.

Étape 1. Traitement des données

L'ensemble de données original provient de l'ensemble de données de livres Amazon fourni par ComiRec. Cependant, ce projet utilise les données téléchargées et traitées par PaddleRec. Pour plus d'informations, reportez-vous au jeu de données AmazonBook dans le projet PaddleRec.

L'ensemble de données pour la formation devrait se présenter sous le format suivant, chaque colonne représentant :

  • Uid: l'identifiant de l'utilisateur.
  • item_id: ID de l'article sur lequel l'utilisateur a cliqué.
  • Time: L'horodatage ou l'ordre du clic.

L'ensemble de données à tester devrait se présenter sous le format suivant, chaque colonne représentant :

  • Uid: l'identifiant de l'utilisateur.

  • hist_item: l'ID de l'article dans l'historique des clics de l'utilisateur. Lorsqu'il y a plusieurs hist_item, ils sont triés en fonction de l'horodatage.

  • eval_item: La séquence réelle dans laquelle l'utilisateur clique sur les produits.

Étape 2. Formation du modèle

La formation du modèle utilise les données traitées à l'étape précédente et adopte le modèle de génération de candidats, MIND, construit sur PaddleRec.

1. Entrée du modèle

Dans dygraph_model.py, exécutez le code suivant pour traiter les données et les transformer en entrée de modèle. Ce processus trie les éléments cliqués par le même utilisateur dans les données d'origine en fonction de l'horodatage et les combine pour former une séquence. Ensuite, un item``_``id est sélectionné au hasard dans la séquence ( target_item) et les 10 éléments précédant target_item sont extraits ( hist_item ) pour l'entrée du modèle. Si la séquence n'est pas assez longue, elle peut être fixée à 0. seq_len doit correspondre à la longueur réelle de la séquence 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]

Reportez-vous au script /home/aistudio/recommend/model/mind/mind_reader.py pour le code de lecture de l'ensemble de données original.

2. Mise en réseau du modèle

Le code suivant est un extrait de net.py. class Mind_Capsual_Layer définit la couche de l'extracteur d'intérêts multiples construite sur le mécanisme de routage des capsules d'intérêts. La fonction label_aware_attention() met en œuvre la technique d'attention consciente des étiquettes dans l'algorithme MIND. La fonction forward() dans class MindLayer modélise les caractéristiques de l'utilisateur et génère les vecteurs de poids correspondants.

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

Reportez-vous au script /home/aistudio/recommend/model/mind/net.py pour connaître la structure spécifique du réseau MIND.

3. Optimisation du modèle

Ce projet utilise l'algorithme Adam comme optimiseur de modèle.

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

En outre, PaddleRec écrit les hyperparamètres dans config.yaml, il vous suffit donc de modifier ce fichier pour voir une comparaison claire entre l'efficacité des deux modèles afin d'améliorer l'efficacité du modèle. Lors de l'entraînement du modèle, l'effet médiocre du modèle peut résulter d'un sous-ajustement ou d'un surajustement du modèle. Vous pouvez donc l'améliorer en modifiant le nombre de cycles d'entraînement. Dans ce projet, il vous suffit de modifier le paramètre epochs dans config.yaml pour trouver le nombre parfait de cycles d'entraînement. En outre, vous pouvez également modifier l'optimiseur de modèle, optimizer.class,ou learning_rate pour le débogage. Ce qui suit montre une partie des paramètres dans 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

Reportez-vous au script /home/aistudio/recommend/model/mind/dygraph_model.py pour une mise en œuvre détaillée.

4. Entraînement du modèle

Exécutez la commande suivante pour démarrer l'apprentissage du modèle.

python -u trainer.py -m mind/config.yaml

Reportez-vous à /home/aistudio/recommend/model/trainer.py pour le projet de formation au modèle.

Étape 3. Test du modèle

Cette étape utilise un ensemble de données de test pour vérifier les performances, telles que le taux de rappel du modèle formé.

Pendant le test du modèle, tous les vecteurs d'éléments sont chargés à partir du modèle, puis importés dans Milvus, la base de données vectorielle open-source. Lisez l'ensemble de données de test à l'aide du script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Charger le modèle à l'étape précédente et introduire l'ensemble de données de test dans le modèle pour obtenir quatre vecteurs d'intérêt de l'utilisateur. Recherchez les 50 vecteurs d'éléments les plus similaires aux quatre vecteurs d'intérêt dans Milvus. Vous pouvez recommander les résultats obtenus aux utilisateurs.

Exécutez la commande suivante pour tester le modèle.

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

Pendant le test du modèle, le système fournit plusieurs indicateurs pour évaluer l'efficacité du modèle, tels que Recall@50, NDCG@50 et HitRate@50. Cet article ne présente que la modification d'un seul paramètre. Cependant, dans votre propre scénario d'application, vous devez former plus d'époques pour améliorer l'effet du modèle. Vous pouvez également améliorer l'efficacité du modèle en utilisant différents optimiseurs, en définissant différents taux d'apprentissage et en augmentant le nombre de cycles de test. Il est recommandé d'enregistrer plusieurs modèles avec des effets différents, puis de choisir celui qui présente les meilleures performances et qui correspond le mieux à votre application.

Étape 4. Générer des produits candidats

Pour construire le service de génération de candidats produits, ce projet utilise le modèle entraîné dans les étapes précédentes, associé à Milvus. Pendant la génération des candidats, FASTAPI est utilisé pour fournir l'interface. Lorsque le service démarre, vous pouvez directement exécuter des commandes dans le terminal via curl.

Exécutez la commande suivante pour générer des candidats préliminaires.

uvicorn main:app

Le service fournit quatre types d'interfaces :

  • Insérer: Exécutez la commande suivante pour lire les vecteurs d'éléments de votre modèle et les insérer dans une collection dans Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/insert_data' \
  -H 'accept: application/json' \
  -d ''
  • Générer des candidats préliminaires: Saisissez l'ordre dans lequel les produits sont cliqués par l'utilisateur et découvrez le produit suivant sur lequel l'utilisateur peut cliquer. Vous pouvez également générer des produits candidats par lots pour plusieurs utilisateurs à la fois. hist_item dans la commande suivante est un vecteur à deux dimensions, et chaque ligne représente une séquence de produits sur lesquels l'utilisateur a cliqué dans le passé. Vous pouvez définir la longueur de la séquence. Les résultats renvoyés sont également des ensembles de vecteurs bidimensionnels, chaque ligne représentant les item ids renvoyés pour les utilisateurs.
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]]
}'
  • Demander le nombre total d' articles de produits: Exécutez la commande suivante pour obtenir le nombre total de vecteurs d'articles stockés dans la base de données Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/count' \
  -H 'accept: application/json' \
  -d ''
  • Supprimer: Exécutez la commande suivante pour supprimer toutes les données stockées dans la base de données Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/qa/drop' \
  -H 'accept: application/json' \
  -d ''

Si vous exécutez le service de génération de candidats sur votre serveur local, vous pouvez également accéder aux interfaces ci-dessus à l'adresse 127.0.0.1:8000/docs. Vous pouvez jouer en cliquant sur les quatre interfaces et en saisissant la valeur des paramètres. Cliquez ensuite sur "Essayer" pour obtenir le résultat de la recommandation.

6.png 6.png

7.png 7.png

Récapitulatif

Cet article se concentre principalement sur la première étape de la génération de candidats dans la construction d'un système de recommandation. Il fournit également une solution pour accélérer ce processus en combinant Milvus avec l'algorithme MIND et PaddleRec et a donc abordé la question proposée dans le paragraphe d'ouverture.

Que se passe-t-il si le système est extrêmement lent lorsqu'il renvoie des résultats en raison de l'énorme quantité d'ensembles de données ? Milvus, la base de données vectorielles open-source, est conçue pour une recherche de similarités ultra-rapide sur des ensembles de données vectorielles denses contenant des millions, des milliards, voire des trillions de vecteurs.

Que se passe-t-il si les données nouvellement insérées ne peuvent pas être traitées en temps réel pour la recherche ou l'interrogation ? Vous pouvez utiliser Milvus car il prend en charge le traitement unifié par lots et par flux et vous permet de rechercher et d'interroger les données nouvellement insérées en temps réel. En outre, le modèle MIND est capable de convertir le nouveau comportement de l'utilisateur en temps réel et d'insérer les vecteurs de l'utilisateur dans Milvus instantanément.

Et si le déploiement compliqué est trop intimidant ? PaddleRec, une bibliothèque puissante qui appartient à l'écosystème PaddlePaddle, peut vous fournir une solution intégrée pour déployer votre système de recommandation ou d'autres applications de manière simple et rapide.

A propos de l'auteur

Yunmei Li, ingénieur de données chez Zilliz, est diplômée en informatique de l'Université des sciences et technologies de Huazhong. Depuis qu'elle a rejoint Zilliz, elle travaille à l'exploration de solutions pour le projet open source Milvus et aide les utilisateurs à appliquer Milvus dans des scénarios réels. Elle se concentre principalement sur le NLP et les systèmes de recommandation, et elle aimerait approfondir ses connaissances dans ces deux domaines. Elle aime passer du temps seule et lire.

Vous cherchez d'autres ressources ?

Like the article? Spread the word

Continuer à Lire