🛒 Moteur de recommandation — Filtrage collaboratif en direct
Simulateur interactif de système de recommandation : une matrice de notes utilisateur-produit est factorisée en vecteurs de goût latents — observez les recommandations se mettre à jour en temps réel à mesure qu'un utilisateur note davantage de produits.
Le filtrage collaboratif et la factorisation matricielle
Les systèmes de recommandation, comme ceux qui se cachent derrière les boutiques en ligne, les services de streaming et les plateformes d'automatisation marketing, ne savent presque jamais *pourquoi* un client aime un produit — ils ne voient qu'un tableau creux de qui a noté quoi. La factorisation matricielle est la technique qui transforme ce tableau creux en prédictions : elle représente chaque utilisateur et chaque produit comme un court vecteur de « facteurs latents » dans le même espace, appris de manière à ce que le produit scalaire du vecteur d'un utilisateur et du vecteur d'un produit reconstitue les notes réellement observées. Les produits qu'un utilisateur n'a pas encore notés obtiennent un score prédit gratuitement, simplement parce que leur vecteur latent se trouve près des produits que l'utilisateur a déjà bien notés.
Cette simulation entraîne un véritable modèle de factorisation matricielle de rang 2 par descente de gradient stochastique, entièrement dans le navigateur. Dix utilisateurs synthétiques et douze produits génèrent une matrice creuse de notes de 1 à 5 étoiles à partir de facteurs de goût de vérité terrain cachés plus du bruit ; le modèle ne voit jamais ces vecteurs de vérité terrain — il ne voit que les étoiles creuses et doit reconstruire un espace de goût 2D sensé à partir de rien. Cliquez sur un utilisateur pour voir ses notes observées et les recommandations top-N en direct du modèle, puis ajoutez une nouvelle note et regardez quelques pas de gradient supplémentaires tirer le point de cet utilisateur — et sa liste de recommandations — vers une nouvelle position.
Questions fréquentes
Qu'est-ce que le filtrage collaboratif ?
Le filtrage collaboratif prédit ce qu'un utilisateur va aimer à partir des schémas de notation de toute la communauté, et non d'attributs de produit codés à la main. L'idée centrale est que des utilisateurs qui ont été d'accord par le passé (ayant noté les mêmes produits de façon similaire) seront probablement d'accord à nouveau. La factorisation matricielle est la forme moderne du filtrage collaboratif : elle compresse la matrice creuse des notes utilisateur-produit en deux petites matrices denses de vecteurs latents — une ligne par utilisateur, une ligne par produit — dont le produit scalaire reconstitue les notes observées et, surtout, se généralise à celles qui ne le sont pas.
Que représente réellement un facteur latent ?
Un facteur latent est une dimension que le modèle invente pendant l'entraînement pour expliquer les schémas d'accord dans les données de notation — il n'est ni choisi ni étiqueté par un humain. Dans cette simulation, chaque utilisateur et chaque produit se retrouvent avec un vecteur en 2D ; les deux axes pourraient vaguement correspondre à quelque chose comme pratique-contre-ludique ou bon marché-contre-haut de gamme, mais le modèle ne voit jamais ces étiquettes. Il ne voit que des nombres, et la descente de gradient découvre le système de coordonnées qui prédit le mieux les étoiles observées. C'est pourquoi les axes n'ont pas de signification fixe d'un entraînement à l'autre — seules les positions relatives des points entre eux ont un sens.
Qu'est-ce que le problème de démarrage à froid pour les nouveaux utilisateurs ?
Un tout nouvel utilisateur sans aucune note possède un vecteur latent qui n'est que son initialisation aléatoire — il ne porte aucun signal sur ses goûts, donc les prédictions pour lui ne valent pas mieux que la note moyenne globale plus du bruit. C'est le problème de démarrage à froid : le filtrage collaboratif a besoin de quelques interactions observées avant de pouvoir positionner un utilisateur de façon pertinente dans l'espace latent. Dans ce simulateur, vous pouvez l'observer directement — ajoutez une seule note pour un utilisateur et son point saute visiblement vers les produits qu'il a bien notés, et la liste de recommandations se réorganise immédiatement.
Pourquoi la perte n'est-elle calculée que sur les notes observées ?
La matrice de notes est délibérément creuse — chaque utilisateur n'a noté qu'une poignée du catalogue, donc la grande majorité des entrées sont simplement inconnues, pas nulles. Entraîner le modèle à prédire 0 ou une valeur moyenne pour chaque entrée non observée lui enseignerait activement une erreur (que les produits non notés sont détestés). Au lieu de cela, la perte à erreur quadratique ne fait la somme que sur les paires (utilisateur, produit) qui ont réellement une note en étoiles : L = Σ(observées) (r_ui − r̂_ui)². Les gradients ne circulent qu'à travers les cellules avec un retour réel, et les vecteurs latents des paires non notées sont amenés vers des positions sensées uniquement en partageant des lignes et des colonnes avec des cellules observées.
À quoi sert le terme de régularisation ?
L'objectif d'entraînement ajoute λ(‖u‖² + ‖p‖²) à la perte à erreur quadratique, pénalisant les vecteurs latents de grande magnitude. Sans cela, un utilisateur ou un produit avec très peu de notes observées peut dériver vers un vecteur extrême qui s'ajuste presque parfaitement à ces une ou deux données mais prédit de façon erratique pour tout le reste — du surapprentissage classique sur des données creuses. La régularisation ramène les vecteurs vers zéro à moins que les données ne fournissent des preuves répétées solides pour les pousser plus loin — sacrifiant un peu de précision d'entraînement pour une bien meilleure généralisation aux produits non notés dont dépendent réellement les recommandations.
Comment l'ajout d'une nouvelle note modifie-t-il les recommandations en direct ?
Lorsque vous notez un produit pour l'utilisateur sélectionné, ce seul triplet (utilisateur, produit, note) est ajouté à l'ensemble observé et l'optimiseur exécute un nouveau lot de passes SGD concentrées sur les données mises à jour. Comme les vecteurs utilisateur et produit sont des paramètres partagés, quelques pas de gradient supplémentaires suffisent à faire dériver la position latente de l'utilisateur vers des produits aux facteurs similaires — vous pouvez voir le point bouger sur le nuage de points et la liste des top-N prédictions se réorganiser en une seconde, sans réentraînement complet.
Pourquoi utiliser la descente de gradient plutôt que de résoudre directement les facteurs ?
Si chaque entrée de la matrice de notes était observée, la décomposition en valeurs singulières (SVD) pourrait calculer les facteurs optimaux de rang réduit directement sous forme fermée. Mais les matrices de notes réelles sont extrêmement creuses — un utilisateur n'a noté qu'une infime fraction du catalogue — donc la SVD classique n'est pas définie pour les entrées manquantes. La descente de gradient stochastique contourne cela proprement : elle ne touche que les cellules observées, s'adapte à des millions de notes car chaque mise à jour est en O(K) par note, et prend naturellement en charge les mises à jour incrémentales à l'arrivée de nouvelles notes, ce qui est exactement ce sur quoi repose le réentraînement en direct dans cette simulation.
Pourquoi la RMSE plafonne-t-elle au lieu d'atteindre zéro ?
Les notes synthétiques de cette simulation sont générées à partir de facteurs latents de vérité terrain plus du bruit aléatoire, donc même un modèle parfait ne peut pas prédire exactement les étoiles bruitées à chaque fois — il existe un plancher d'erreur irréductible fixé par la variance du bruit. La régularisation sacrifie aussi délibérément un peu de précision sur l'ensemble d'entraînement pour la généralisation, empêchant encore davantage la RMSE d'atteindre zéro. En pratique, c'est sain : un modèle qui ramène la RMSE sur l'ensemble observé à zéro avec seulement deux dimensions latentes et une poignée de notes par utilisateur est presque certainement en train de mémoriser du bruit plutôt que d'apprendre des goûts.
Une matrice de notes utilisateur-produit est factorisée en vecteurs de goût latents — observez les recommandations se mettre à jour en direct à mesure qu'un utilisateur note davantage de produits.
3D · Moteur de rendu Three.js / WebGL · cible 60 FPS · s'exécute entièrement côté client, sans installation