Accélérer la génération de candidats dans les systèmes de recommandation en utilisant Milvus associé à PaddlePaddle
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
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
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
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
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 :
- Traitement des données
- Entraînement du modèle
- Test du modèle
- Génération de candidats à l'achat d'un produit
- Stockage des données : les vecteurs d'articles sont obtenus grâce au modèle entraîné et sont stockés dans Milvus.
- Recherche de données : quatre vecteurs d'utilisateurs générés par MIND sont introduits dans Milvus pour la recherche de similitudes vectorielles.
- Classement des données : chacun des quatre vecteurs a ses propres vecteurs d'éléments similaires
top_k
, et quatre ensembles de vecteurstop_k
sont classés pour produire une liste finale des vecteurs les plus similairestop_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 plusieurshist_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 lesitem id
s 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
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 ?
- Plus de cas d'utilisation sur la construction d'un système de recommandation :
- Construire un système de recommandation de produits personnalisé avec Vipshop avec Milvus
- Création d'une application de planification de garde-robe et de tenues avec Milvus
- Création d'un système intelligent de recommandation de nouvelles dans l'application Sohu News
- Filtrage collaboratif basé sur les éléments pour un système de recommandation musicale
- Réaliser avec Milvus : Recommandation de nouvelles alimentée par l'IA dans le navigateur mobile de Xiaomi
- Autres projets Milvus en collaboration avec d'autres communautés :
- Participez à notre communauté open-source :
- Le flux de travail de base d'un système de recommandation
- Architecture du système
- Mise en œuvre du système
- Récapitulatif
- A propos de l'auteur
- Vous cherchez d'autres ressources ?
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word