Comment nous avons appris à recommander des films et pourquoi vous ne devriez pas vous fier uniquement aux notes



Imaginez que vous vouliez passer la soirée à regarder un film, mais vous ne savez pas lequel choisir. Les utilisateurs de Yandex se retrouvent souvent dans la même situation, donc notre équipe élabore des recommandations qui peuvent être trouvées sur Search et Air. Il semblerait que cela soit compliqué: nous prenons les notes des utilisateurs, avec leur aide, nous entraînons la voiture à trouver des films susceptibles de donner 5 points, nous obtenons une liste de films prête à l'emploi. Mais cette approche ne fonctionne pas. Pourquoi? C’est ce dont je vais vous parler aujourd’hui.

Un peu d'histoire. En 2006, Netflix a lancé le concours d'apprentissage automatique du prix Netflix. Si vous avez soudainement oublié, la société n'a pas encore diffusé sur Internet, mais a loué des films sur DVD. Mais même alors, il était important pour elle de prédire la note de l'utilisateur afin de lui recommander quelque chose. Donc, l'essence de la concurrence: prédire les notes des téléspectateurs est 10% mieux (selon la métrique RMSE) que Cinematch, le système de recommandation Netflix. Ce fut l'une des premières compétitions de masse de ce type. L'intérêt a chauffé un énorme ensemble de données (plus de 100 millions de notes), ainsi qu'un prix de 1 million de dollars.

Le concours s'est terminé en 2009. Les équipes de BellKor Pragmatic Chaos et de l'Ensemble ont atteint la ligne d'arrivée avec le même résultat (RMSE = 0,8567), mais l'Ensemble a pris la deuxième place car il a envoyé la solution 20 minutes plus tard que les concurrents. Les résultats et les travaux peuvent être trouvés ici . Mais la chose la plus intéressante est différente. Si vous croyez aux histoires répétées lors de conférences spécialisées, les algorithmes gagnants ne sont pas apparus en production dans le service de streaming vidéo qui a été lancé bientôt. Je ne peux pas parler des raisons des décisions des autres, mais je vais vous expliquer pourquoi nous avons fait de même.

Évaluation personnelle


Depuis un certain temps maintenant, les utilisateurs de Yandex peuvent évaluer les films qu'ils ont regardés. Et pas seulement chez KinoPoisk, mais aussi dans les résultats de recherche. Au fil du temps, nous avons accumulé des centaines de millions d'estimations de dizaines de millions de personnes. À un moment donné, nous avons décidé d'utiliser ces données pour aider les utilisateurs à comprendre à quel point ils aimeraient un film. En fait, nous avons résolu le même problème qu'au concours du prix Netflix, c'est-à-dire que nous avions prédit quelle note l'utilisateur attribuerait au film. À cette époque, il existait déjà des notations KinoPoisk et IMDB, construites sur la base des notations des personnes. Nous avons construit une note personnelle, nous avons donc décidé d'utiliser une échelle séparée en pourcentage afin d'éviter les similitudes visuelles et la confusion.



Soit dit en passant, la nécessité de corréler l'échelle des points et le pourcentage est un casse-tête distinct et non évident, alors j'en parlerai brièvement. Il semblerait que pour une échelle de 10 points, prenez 10% pour chaque point - et le point est dans le chapeau. Mais non. La raison en est la psychologie et les habitudes. Par exemple, du point de vue des utilisateurs, une note de 8/10 est bien meilleure que 80%. Comment corréler cela? Avec le crowdsourcing! Et c'est ce que nous avons fait: nous avons lancé la tâche à Tolok, dans laquelle les tireurs décrivaient les attentes des films avec un certain score ou pourcentage de note personnelle. Sur la base de ce balisage, nous avons sélectionné une fonction qui traduit la prédiction du score du point au pourcentage afin que les attentes des utilisateurs soient maintenues.

Exemples de quêtes à Tolok


Il est utile de prévoir les attentes du film, mais il serait également utile de formuler des recommandations. Autrement dit, montrez immédiatement à la personne une liste de bons films. À ce moment-là, beaucoup d'entre vous pourraient penser: «Et disons simplement trier les films que l'utilisateur n'a pas regardés par classement personnel.» Nous l'avons pensé aussi au début. Mais j'ai dû résoudre deux problèmes.

Problème d'outil


Lorsqu'un utilisateur recherche un film particulier (ou souhaite louer un DVD spécifique), le service doit prédire la note de ce film particulier. Exactement, ce problème a été résolu lors du concours du prix Netflix, où la métrique RMSE a été utilisée. Mais les recommandations résolvent un problème différent: vous n'avez pas besoin de deviner la note, mais de trouver un film qui sera finalement regardé. Et la métrique RMSE fait un mauvais travail. Par exemple, la pénalité pour prédire une note de 2 au lieu de 1 est exactement la même que pour 5 au lieu de 4. Mais notre système ne devrait jamais recommander des films auxquels l'utilisateur met 2! Les métriques basées sur des listes conviennent beaucoup mieux à cette tâche, telles que Precision @ K, Recall @ K, MRR ou NDCG. Je ne peux pas m'empêcher de vous en dire un peu plus à leur sujet (mais si vous n'êtes pas intéressé par les statistiques, sautez simplement le paragraphe suivant).

Commençons par la métrique.MRR (rang réciproque moyen). Nous verrons quelle position dans le classement sera le film avec lequel l'utilisateur a interagi (par exemple, regardé ou félicité) pendant la période de test. La métrique MRR est la position inverse moyenne d'un utilisateur d'un tel film. C'est à direMRR=1|U|u=1|U|1ranku. Une telle métrique, contrairement à RMSE, évalue la liste entière, mais, malheureusement, ne regarde que le premier élément deviné. Cependant, il est facile de modifier la métrique pour supprimer cet inconvénient. Nous pouvons calculer la somme des positions inverses de tous les films avec lesquels l'utilisateur a interagi. Cette métrique est appelée Classement réciproque moyen. Cette métrique prend en compte tous les films devinés dans le numéro. Notez que la position k dans le paiement reçoit un poids de 1 / k pour un film deviné et un poids de 0 pour un autre film. Souvent, 1 / log (k) est utilisé au lieu de 1 / k: cela correspond plus probablement à la probabilité que l'utilisateur défile jusqu'à la position k. Le résultat est une métrique DCG (gain cumulé actualisé)DCG=1|U|u=1|U|pos=1Ngainposmax(1,log(pos)). Mais la contribution des différents utilisateurs à la métrique est différente: pour quelqu'un, nous avons deviné tous les films, pour quelqu'un, nous n'avons rien deviné. Par conséquent, en règle générale, cette métrique est normalisée. Divisez le DCG de chaque utilisateur en le DCG le mieux classé pour cet utilisateur. La mesure résultante est appelée NDCG (gain cumulatif actualisé normalisé). Il est largement utilisé pour évaluer la qualité du classement.

Ainsi, chaque tâche a sa propre métrique. Mais le problème suivant n'est pas si évident.

Problème de choix


C'est déjà assez difficile à décrire, mais je vais essayer. Il s'avère que les gens accordent des notes élevées non pas aux films qu'ils regardent habituellement . Les chefs-d'œuvre de films rares, les classiques, l'art et l'art obtiennent les meilleures notes, mais cela n'empêche pas les gens le soir après le travail de regarder avec plaisir une bonne comédie, un nouveau film d'action ou un opéra spatial spectaculaire. Ajoutez à cela que les utilisateurs de Yandex n'ont pas apprécié tous les films qu'ils ont regardés une fois et quelque part. Et si nous nous concentrons uniquement sur les notes les plus élevées, nous courons le risque d'obtenir un flux de film recommandé qui semblera logique, les utilisateurs peuvent même reconnaître sa qualité, mais à la fin ils ne regarderont rien.

Par exemple, voici à quoi ressemblerait mon flux de film si nous le classions par note personnelle et si nous ne savions rien de mes vues par le passé. Grands films. Mais je ne veux pas les revoir aujourd'hui.



Il s'avère que dans les conditions de cotes éparses et d'une pénurie de films avec des cotes élevées, il vaut la peine de regarder non seulement la cote. Eh bien, nous formons la voiture pour prédire le visionnement du film recommandé, et non la note. Cela semblerait logique, car l'utilisateur le souhaite. Qu'est-ce qui pourrait mal se passer? Le problème est que la bande sera remplie de films, dont chacun est tout à fait adapté à un passe-temps facile le soir, mais leur cote personnelle sera faible. Les utilisateurs, bien sûr, feront attention au fait qu'il n'y a pas de «chefs-d'œuvre» dans le flux, ce qui signifie que la crédibilité des recommandations sera compromise, ils ne regarderont pas ce qu'ils verraient autrement.

En conséquence, nous avons compris qu'un équilibre entre les deux extrêmes était nécessaire. Il est nécessaire de former la machine afin que le potentiel de visualisation et la perception de la recommandation par une personne soient pris en compte.

Comment fonctionnent nos recommandations


Notre système fait partie de la recherche, nous devons donc formuler des recommandations très rapidement: le temps de réponse du service doit être inférieur à 100 millisecondes. Par conséquent, nous essayons d'effectuer autant d'opérations lourdes que possible hors ligne, au stade de la préparation des données. Tous les films et utilisateurs du système de recommandation sont représentés par des profils (il est important de ne pas les confondre avec le compte), qui incluent des clés d'objet, des compteurs et des incorporations (en d'autres termes, des vecteurs dans un certain espace). Des profils de films sont préparés chaque jour sur YT ( lire «Yt» ) et chargés dans la RAM des machines qui répondent aux demandes. Mais avec les utilisateurs, tout est un peu plus compliqué.

Chaque jour, nous créons également le profil utilisateur principal sur YT et l'envoyons au magasin Yandex, à partir duquel vous pouvez obtenir le profil en quelques dizaines de millisecondes. Mais les données deviennent rapidement obsolètes si une personne regarde et évalue activement la vidéo. Ce n'est pas bon si les recommandations commencent à prendre du retard. Par conséquent, nous lisons le flux d'événements utilisateur et formons la partie dynamique du profil. Lorsqu'une personne saisit une demande, nous combinons le profil du référentiel avec un profil dynamique et obtenons un profil unique, qui peut être en retard sur la réalité pendant quelques secondes seulement.

Cela se produit hors ligne (c'est-à-dire à l'avance), et maintenant nous passons directement à l'exécution. Ici, le système de recommandation comprend deux étapes. Le classement de la base de données complète des films est trop long, donc à la première étape, nous sélectionnons simplement plusieurs centaines de candidats, c'est-à-dire que nous trouvons des films qui peuvent intéresser le spectateur. Cela inclut à la fois les peintures populaires et celles proches de l'utilisateur dans certaines intégrations. Il existe plusieurs algorithmes pour trouver rapidement les voisins les plus proches, nous utilisons HNSW (Hierarchical Navigable Small World). Avec lui, nous trouvons les films les plus proches de l'utilisateur en seulement quelques millisecondes.

Dans la deuxième étape, nous extrayons des fonctionnalités (parfois elles sont également appelées facteurs) par films, utilisateur et paire utilisateur / film et classons les candidats à l'aide de CatBoost. Permettez-moi de vous rappeler: nous avons déjà réalisé que nous devons nous concentrer non seulement sur les vues, mais également sur d'autres caractéristiques de qualité des recommandations, donc pour le classement, nous sommes arrivés à une combinaison de plusieurs modèles CatBoost formés pour différentes cibles.

Pour trouver des candidats, nous utilisons des plongements à partir de plusieurs décompositions matricielles: de la version classique d'ALS, qui prédit l'évaluation, aux variations plus complexes basées sur SVD ++. En tant que fonctionnalités de classement, des compteurs d'événements et des films utilisateur simples, des CTR pour divers événements, ainsi que des modèles pré-formés plus complexes sont utilisés. Par exemple, la prédiction ALS agit également comme une fonctionnalité. L'un des modèles les plus utiles est le réseau neuronal Recommender DSSM, dont je parlerai probablement un peu plus.

Recommender DSSM


DSSM est un réseau neuronal à deux tours. Chaque tour construit son propre encastrement, puis la distance cosinus est prise en compte entre les encastrements, ce nombre est la sortie du réseau. Autrement dit, le réseau apprend à évaluer la proximité d'objets dans les tours gauche et droite. Des réseaux de neurones similaires sont utilisés, par exemple, dans une recherche sur le Web pour trouver des documents pertinents pour une requête. Pour la tâche de recherche, une demande est envoyée à l'une des tours et un document à l'autre. Pour notre réseau, le rôle de la demande est joué par l'utilisateur, et les films agissent comme des documents.

La tour du film construit une intégration basée sur les données du film: c'est le titre, la description, le genre, le pays, les acteurs, etc. Cette partie du réseau est assez similaire à la recherche. Cependant, pour le spectateur, nous voulons utiliser son histoire. Pour ce faire, nous agrégons l'intégration des films de l'histoire avec le fondu dans le temps depuis le moment de l'événement. Ensuite, en plus de l'incorporation totale, nous appliquons plusieurs couches du réseau et, par conséquent, nous obtenons une incorporation de taille 400.



Si vous prenez immédiatement en compte l'intégralité de l'historique de l'utilisateur dans l'intégration, cela ralentira considérablement la formation. Par conséquent, nous allons à l'astuce et apprenons le réseau en deux étapes. Tout d'abord, apprenez le InnerDSSM plus simple. A l'entrée, il ne reçoit que les 50 derniers événements de l'historique de l'utilisateur sans se diviser en types d'événements (vues, notes ...). Ensuite, nous recyclons l'InnerDSSM résultant tout au long de l'historique de l'utilisateur, mais avec une ventilation en types d'événements. Nous obtenons donc OuterDSSM, qui est utilisé lors de l'exécution.

L'utilisation d'un réseau d'exécution dans le front nécessite beaucoup de ressources informatiques. Par conséquent, nous enregistrons les incorporations de la tour de cinéma dans la base de données et les intégrations en fonction de l'historique des utilisateurs sont mises à jour presque en temps réel. Ainsi, lors du traitement de la demande, il suffit d'appliquer une petite partie d'OuterDSSM et de calculer les cosinus, cela ne prend pas beaucoup de temps.

Conclusion


Maintenant, nos recommandations sont déjà disponibles dans notre recherche (par exemple, sur demande [que voir] ), dans le service Yandex.Air, et une version adaptée de cette technologie est également utilisée dans Yandex.Stations. Mais cela ne signifie pas que nous pouvons nous détendre. Nous formons constamment de nouveaux modèles, appliquons de plus en plus de données, essayons de nouvelles approches de formation et de nouvelles métriques de qualité. À mon avis, plus la zone est ancienne, plus elle est difficile à développer. Mais c'est le principal intérêt des spécialistes.

All Articles