{"id":71852,"date":"2020-02-28T20:59:58","date_gmt":"2020-02-28T17:59:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij"},"modified":"2020-03-03T16:14:08","modified_gmt":"2020-03-03T13:14:08","slug":"kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Je m'appelle Pavel Parkhomenko, je suis d\u00e9veloppeur ML. Dans cet article, je voudrais expliquer comment fonctionne le service Yandex.Zen et partager les am\u00e9liorations techniques mises en \u0153uvre qui ont permis d'augmenter la qualit\u00e9 des recommandations. \u00c0 travers cet article, vous d\u00e9couvrirez comment, en seulement quelques millisecondes, nous trouvons parmi des millions de documents ceux qui sont les plus pertinents pour l'utilisateur ; comment effectuer une d\u00e9composition continue d'une grande matrice (constitu\u00e9e de millions de colonnes et de dizaines de millions de lignes), afin que les nouveaux documents obtiennent leur vecteur en quelques dizaines de minutes ; comment r\u00e9utiliser la d\u00e9composition de la matrice utilisateur-article pour obtenir une bonne repr\u00e9sentation vectorielle pour les vid\u00e9os.<\/p>\n<p><img decoding=\"async\" alt=\"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations\" src=\"\/wp-content\/uploads\/2020\/02\/d63caf9162ca3533548fdef9cd740c24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nNotre base de recommandations contient des millions de documents de diff\u00e9rents formats : articles textuels cr\u00e9\u00e9s sur notre plateforme et provenant de sites externes, vid\u00e9os, r\u00e9cits et courts messages. Le d\u00e9veloppement d'un tel service est li\u00e9 \u00e0 un grand nombre de d\u00e9fis techniques. Voici quelques-uns d'entre eux :<\/p>\n<ul>\n<li>Diviser les t\u00e2ches de calcul : effectuer toutes les op\u00e9rations lourdes hors ligne, et n'appliquer que rapidement les mod\u00e8les en temps r\u00e9el, afin de garantir des temps de r\u00e9ponse de 100 \u00e0 200 ms.<\/li>\n<li>Prendre rapidement en compte les actions de l'utilisateur. Pour cela, il est n\u00e9cessaire que tous les \u00e9v\u00e9nements soient imm\u00e9diatement transmis au syst\u00e8me de recommandation et aient une influence sur le r\u00e9sultat des mod\u00e8les.<\/li>\n<li>Adapter rapidement le fil d'actualit\u00e9s pour que les nouveaux utilisateurs se sentent en phase avec leur comportement. Les personnes nouvellement arriv\u00e9es dans le syst\u00e8me doivent sentir que leurs retours influencent les recommandations.<\/li>\n<li>Comprendre rapidement \u00e0 qui recommander un nouvel article.<\/li>\n<li>R\u00e9agir rapidement \u00e0 l'apparition constante de nouveaux contenus. Des dizaines de milliers d'articles sont publi\u00e9s chaque jour, et beaucoup d'entre eux ont une dur\u00e9e de vie limit\u00e9e (par exemple, des actualit\u00e9s). C'est ce qui les distingue des films, de la musique et d'autres contenus de longue dur\u00e9e co\u00fbteux \u00e0 cr\u00e9er.<\/li>\n<li>Transf\u00e9rer les connaissances d'un domaine \u00e0 un autre. Si le syst\u00e8me de recommandation dispose de mod\u00e8les entra\u00een\u00e9s pour des articles textuels et que nous y ajoutons des vid\u00e9os, nous pouvons r\u00e9utiliser les mod\u00e8les existants pour mieux classer le nouveau type de contenu.<\/li>\n<\/ul>\n<p>\nJe vais expliquer comment nous avons r\u00e9solu ces d\u00e9fis.<\/p>\n<h2>S\u00e9lection des candidats<\/h2>\n<p>\n<b>Comment r\u00e9duire en quelques millisecondes le nombre de documents examin\u00e9s de milliers de fois, sans pratiquement alt\u00e9rer la qualit\u00e9 du classement ?<\/b><\/p>\n<p>Supposons que nous avons form\u00e9 plusieurs mod\u00e8les de ML, g\u00e9n\u00e9r\u00e9 des caract\u00e9ristiques sur leur base et form\u00e9 un autre mod\u00e8le qui classe les documents pour l'utilisateur. Tout semble aller bien, mais on ne peut pas simplement calculer toutes les caract\u00e9ristiques pour tous les documents en temps r\u00e9el si ces documents sont au nombre de millions et que les recommandations doivent \u00eatre \u00e9tablies en 100-200 ms. La t\u00e2che consiste \u00e0 s\u00e9lectionner un sous-ensemble parmi des millions de documents qui seront class\u00e9s pour l'utilisateur. Cette \u00e9tape est g\u00e9n\u00e9ralement appel\u00e9e filtration des candidats. Elle doit r\u00e9pondre \u00e0 plusieurs exigences. Tout d'abord, la filtration doit se faire tr\u00e8s rapidement, afin de laisser le plus de temps possible pour le classement. De plus, en r\u00e9duisant consid\u00e9rablement le nombre de documents \u00e0 classer, nous devons maximiser la conservation des documents pertinents pour l'utilisateur.<\/p>\n<p>Notre principe de filtration des candidats a \u00e9volu\u00e9 au fil du temps, et \u00e0 l'heure actuelle, nous avons adopt\u00e9 un sch\u00e9ma \u00e0 plusieurs niveaux :<\/p>\n<p><img decoding=\"async\" alt=\"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDans un premier temps, tous les documents sont regroup\u00e9s, et les documents les plus populaires sont s\u00e9lectionn\u00e9s dans chaque groupe. Les groupes peuvent \u00eatre des sites, des th\u00e8mes, des clusters. Pour chaque utilisateur, les groupes les plus proches de son historique sont s\u00e9lectionn\u00e9s et les meilleurs documents sont extraits de ceux-ci. Nous utilisons \u00e9galement un index kNN pour trouver en temps r\u00e9el les documents les plus proches de l'utilisateur. Il existe plusieurs m\u00e9thodes pour construire un index kNN, et la meilleure pour nous a \u00e9t\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchical Navigable Small World graphs). C'est un mod\u00e8le hi\u00e9rarchique qui permet de trouver en quelques millisecondes N vecteurs les plus proches pour l'utilisateur \u00e0 partir d'une base de millions. Nous indexons pr\u00e9alablement l'ensemble de notre base documentaire hors ligne. \u00c9tant donn\u00e9 que la recherche dans l'index est assez rapide, avec plusieurs embeddings performants, nous pouvons cr\u00e9er plusieurs indices (un pour chaque embedding) et interroger chacun d'eux en temps r\u00e9el.<\/p>\n<p>Nous disposons de dizaines de milliers de documents pour chaque utilisateur. Cela reste beaucoup pour le calcul de toutes les caract\u00e9ristiques, donc \u00e0 ce stade, nous appliquons un classement l\u00e9ger \u2014 un mod\u00e8le simplifi\u00e9 de classement lourd avec moins de caract\u00e9ristiques. L'objectif est de pr\u00e9dire quels documents seront en t\u00eate selon le mod\u00e8le lourd. Les documents avec la plus grande pr\u00e9diction seront utilis\u00e9s dans le mod\u00e8le lourd, c'est-\u00e0-dire \u00e0 la derni\u00e8re \u00e9tape du classement. Cette approche permet de r\u00e9duire en quelques millisecondes la base des documents examin\u00e9s par l'utilisateur, passant de millions \u00e0 des milliers.<\/p>\n<h2>\u00c9tape ALS en temps r\u00e9el<\/h2>\n<p>\n<b>Comment prendre en compte le feedback de l'utilisateur imm\u00e9diatement apr\u00e8s le clic ?<\/b><\/p>\n<p>Un facteur important dans les recommandations est le temps de r\u00e9ponse au feedback de l'utilisateur. Cela est particuli\u00e8rement important pour les nouveaux utilisateurs : lorsqu'une personne commence \u00e0 utiliser le syst\u00e8me de recommandation, elle re\u00e7oit un flux de documents vari\u00e9s non personnalis\u00e9s. D\u00e8s qu'elle effectue son premier clic, il est n\u00e9cessaire de prendre cela en compte imm\u00e9diatement et de s'adapter \u00e0 ses int\u00e9r\u00eats. Si tous les facteurs sont calcul\u00e9s hors ligne, la r\u00e9action rapide du syst\u00e8me deviendra impossible en raison du d\u00e9lai. Il est donc n\u00e9cessaire de traiter les actions de l'utilisateur en temps r\u00e9el. Pour cela, nous utilisons l'\u00e9tape ALS en temps r\u00e9el pour construire une repr\u00e9sentation vectorielle de l'utilisateur.<\/p>\n<p>Supposons que nous avons une repr\u00e9sentation vectorielle pour tous les documents. Par exemple, nous pouvons hors ligne, sur la base du texte de l'article, construire des embeddings \u00e0 l'aide de ELMo, BERT ou d'autres mod\u00e8les de machine learning. Comment obtenir une repr\u00e9sentation vectorielle des utilisateurs dans le m\u00eame espace bas\u00e9 sur leurs interactions dans le syst\u00e8me ?<\/p>\n<p><b class=\"spoiler_title\">Principe g\u00e9n\u00e9ral de cr\u00e9ation et de d\u00e9composition de la matrice utilisateur-document<\/b>Consid\u00e9rons m utilisateurs et n documents. Pour certains utilisateurs, leur int\u00e9r\u00eat pour quelques documents est connu. Cette information peut alors \u00eatre pr\u00e9sent\u00e9e sous la forme d'une matrice m x n : les lignes correspondent aux utilisateurs, et les colonnes \u2014 aux documents. \u00c9tant donn\u00e9 que la plupart des documents n'ont pas \u00e9t\u00e9 vus par l'utilisateur, la majorit\u00e9 des cellules de la matrice restera vide, tandis que d'autres seront remplies. Pour chaque \u00e9v\u00e9nement (like, dislike, clic) dans la matrice, il est pr\u00e9vu une certaine valeur \u2014 mais consid\u00e9rons un mod\u00e8le simplifi\u00e9 o\u00f9 un like correspond \u00e0 1, et un dislike \u00e0 -1.<\/p>\n<p>D\u00e9composons la matrice en deux : P (m x d) et Q (d x n), o\u00f9 d est la dimension de la repr\u00e9sentation vectorielle (g\u00e9n\u00e9ralement un petit nombre). Ainsi, chaque objet correspondra \u00e0 un vecteur de dimension d (l'utilisateur \u2014 une ligne dans la matrice P, le document \u2014 une colonne dans la matrice Q). Ces vecteurs seront les embeddings des objets correspondants. Pour pr\u00e9dire si un utilisateur aimera un document, il suffit de multiplier leurs embeddings.<\/p>\n<p><img decoding=\"async\" alt=\"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUne des m\u00e9thodes possibles pour la d\u00e9composition de la matrice est ALS (Alternating Least Squares). Nous allons optimiser la fonction de perte suivante :<\/p>\n<p><img decoding=\"async\" alt=\"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nIci, rui est l'interaction de l'utilisateur u avec le document i, qi est le vecteur du document i, pu est le vecteur de l'utilisateur u.<\/p>\n<p>Ainsi, le vecteur utilisateur optimal du point de vue de l'erreur quadratique moyenne (avec les vecteurs des documents fixes) est trouv\u00e9 analytiquement en r\u00e9solvant la r\u00e9gression lin\u00e9aire correspondante.<\/p>\n<p>Cela s'appelle un \u00ab pas ALS \u00bb. L'algorithme ALS consiste \u00e0 fixer alternativement une des matrices (utilisateurs et articles) et \u00e0 mettre \u00e0 jour l'autre pour trouver la solution optimale.<\/p>\n<p>Heureusement, trouver la repr\u00e9sentation vectorielle d'un utilisateur est une op\u00e9ration assez rapide qui peut \u00eatre effectu\u00e9e en temps r\u00e9el, en utilisant des instructions vectorielles. Ce truc permet de tenir imm\u00e9diatement compte des retours des utilisateurs dans le classement. Le m\u00eame embedding peut \u00eatre utilis\u00e9 dans l'index kNN pour am\u00e9liorer la s\u00e9lection de candidats.<\/p>\n<h2>Filtration collaborative distribu\u00e9e<\/h2>\n<p>\n<b>Comment effectuer une factorisation matricielle distribu\u00e9e incr\u00e9mentale et trouver rapidement la repr\u00e9sentation vectorielle de nouveaux articles ?<\/b><\/p>\n<p>Le contenu n'est pas la seule source de signaux pour les recommandations. Une autre source importante est l'information collaborative. De bons indicateurs pour le classement peuvent traditionnellement \u00eatre obtenus \u00e0 partir de la d\u00e9composition de la matrice utilisateur-document. Toutefois, en essayant de r\u00e9aliser cette d\u00e9composition, nous avons rencontr\u00e9 des probl\u00e8mes :<\/p>\n<p>1. Nous avons des millions de documents et des dizaines de millions d'utilisateurs. La matrice ne peut pas tenir sur une seule machine dans son ensemble, et la d\u00e9composition sera tr\u00e8s longue.<br \/>\n2. La plupart des contenus dans le syst\u00e8me ont une courte dur\u00e9e de vie : les documents restent pertinents pendant seulement quelques heures. Il est donc essentiel de construire leur repr\u00e9sentation vectorielle le plus rapidement possible.<br \/>\n3. Si nous effectuons la d\u00e9composition juste apr\u00e8s la publication d'un document, il n'aura pas \u00e9t\u00e9 \u00e9valu\u00e9 par un nombre suffisant d'utilisateurs. Par cons\u00e9quent, sa repr\u00e9sentation vectorielle sera tr\u00e8s probablement m\u00e9diocre.<br \/>\n4. Si un utilisateur aime ou n'aime pas, nous ne pourrons pas imm\u00e9diatement tenir compte de cela dans la d\u00e9composition.<\/p>\n<p>Pour r\u00e9soudre les probl\u00e8mes mentionn\u00e9s, nous avons mis en \u0153uvre une d\u00e9composition distribu\u00e9e de la matrice utilisateur-document avec des mises \u00e0 jour incr\u00e9mentielles fr\u00e9quentes. Comment cela fonctionne-t-il ?<\/p>\n<p>Supposons que nous avons un cluster de N machines (N est dans les centaines) et que nous souhaitons faire une d\u00e9composition distribu\u00e9e de la matrice qui ne tient pas sur une seule machine. La question est de savoir comment r\u00e9aliser cette d\u00e9composition pour que, d'une part, chaque machine ait suffisamment de donn\u00e9es et, d'autre part, que les calculs soient ind\u00e9pendants ? <\/p>\n<p><img decoding=\"async\" alt=\"Comment nous travaillons sur la qualit\u00e9 et la rapidit\u00e9 des recommandations\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous allons utiliser l'algorithme de d\u00e9composition ALS d\u00e9crit ci-dessus. Examinons comment r\u00e9aliser un pas d'ALS de mani\u00e8re distribu\u00e9e \u2014 les autres \u00e9tapes seront similaires. Supposons que nous ayons une matrice de documents fix\u00e9e et que nous souhaitions construire la matrice des utilisateurs. Pour cela, nous la diviserons en N parties par lignes, chaque partie contenant environ le m\u00eame nombre de lignes. Nous enverrons \u00e0 chaque machine les cellules non vides des lignes correspondantes, ainsi que la matrice d'embeddings des documents (dans son int\u00e9gralit\u00e9). \u00c9tant donn\u00e9 sa taille relativement petite, et que la matrice utilisateur-document est g\u00e9n\u00e9ralement tr\u00e8s sparse, ces donn\u00e9es tiendront sur une machine ordinaire.<\/p>\n<p>Ce truc peut \u00eatre r\u00e9p\u00e9t\u00e9 pendant plusieurs \u00e9poques jusqu'\u00e0 la convergence du mod\u00e8le, en changeant tour \u00e0 tour la matrice fixe. Mais m\u00eame dans ce cas, la d\u00e9composition de la matrice peut durer plusieurs heures. Et cela ne r\u00e9sout pas le probl\u00e8me qu'il faut obtenir rapidement les embeddings de nouveaux documents et mettre \u00e0 jour les embeddings de ceux d'entre eux pour lesquels il y avait peu d'informations lors de la construction du mod\u00e8le. <\/p>\n<p>Nous avons b\u00e9n\u00e9fici\u00e9 de l'impl\u00e9mentation d'une mise \u00e0 jour incr\u00e9mentale rapide du mod\u00e8le. Supposons que nous ayons un mod\u00e8le entra\u00een\u00e9 actuellement. Depuis son entra\u00eenement, de nouveaux articles sont apparus, avec lesquels nos utilisateurs ont interagi, ainsi que des articles qui avaient peu d'interactions lors de l'entra\u00eenement. Pour obtenir rapidement l'embedding de ces articles, nous utilisons les embeddings des utilisateurs obtenus lors du premier grand entra\u00eenement du mod\u00e8le et faisons un pas ALS pour calculer la matrice des documents avec la matrice des utilisateurs fixe. Cela permet d'obtenir des embeddings assez rapidement \u2014 dans les minutes qui suivent la publication d'un document \u2014 et de mettre souvent \u00e0 jour les embeddings des nouveaux documents.<\/p>\n<p>Pour que les recommandations prennent imm\u00e9diatement en compte les actions de l'utilisateur, nous n'utilisons pas les embeddings des utilisateurs obtenus hors ligne au moment de l'ex\u00e9cution. Au lieu de cela, nous faisons un pas ALS et obtenons le vecteur utilisateur actuel.<\/p>\n<h2>Transfert vers un autre domaine<\/h2>\n<p>\n<b>Comment utiliser le retour d'information des utilisateurs sur les articles textuels pour construire une repr\u00e9sentation vectorielle des vid\u00e9os ?<\/b><\/p>\n<p>Au d\u00e9part, nous ne recommandions que des articles textuels, c'est pourquoi de nombreux algorithmes sont adapt\u00e9s \u00e0 ce type de contenu. Mais avec l'ajout de contenus d'un autre type, nous avons rencontr\u00e9 le besoin d'adapter les mod\u00e8les. Comment avons-nous r\u00e9solu cette t\u00e2che pour les vid\u00e9os ? Une des options consiste \u00e0 r\u00e9entra\u00eener tous les mod\u00e8les depuis le d\u00e9but. Mais c'est long, et de plus, une partie des algorithmes exige beaucoup d'exemples d'entra\u00eenement, qui ne sont pas encore disponibles en quantit\u00e9 suffisante pour les nouveaux types de contenus dans les premiers moments de leur vie sur le service.<\/p>\n<p>Nous avons emprunt\u00e9 une autre voie en r\u00e9utilisant des mod\u00e8les de textes pour les vid\u00e9os. La cr\u00e9ation de repr\u00e9sentations vectorielles des vid\u00e9os a \u00e9t\u00e9 facilit\u00e9e par le m\u00eame truc avec l'ALS. Nous avons pris la repr\u00e9sentation vectorielle des utilisateurs bas\u00e9e sur des articles texte et avons r\u00e9alis\u00e9 une \u00e9tape d'ALS en utilisant les informations sur les vues des vid\u00e9os. De cette fa\u00e7on, nous avons facilement obtenu la repr\u00e9sentation vectorielle des vid\u00e9os. En cours d'ex\u00e9cution, nous calculons simplement la proximit\u00e9 entre le vecteur utilisateur, obtenu \u00e0 partir des articles texte, et le vecteur vid\u00e9o.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nLe d\u00e9veloppement du noyau d'un syst\u00e8me de recommandations en temps r\u00e9el est associ\u00e9 \u00e0 de nombreuses t\u00e2ches. Il faut traiter les donn\u00e9es rapidement et appliquer des m\u00e9thodes ML pour une utilisation efficace de ces donn\u00e9es ; construire des syst\u00e8mes distribu\u00e9s complexes capables de traiter les signaux utilisateurs et les nouvelles unit\u00e9s de contenu en un minimum de temps ; et bien d'autres t\u00e2ches.<\/p>\n<p>Dans le syst\u00e8me actuel, dont j'ai d\u00e9crit le fonctionnement, la qualit\u00e9 des recommandations pour l'utilisateur augmente avec son activit\u00e9 et sa dur\u00e9e de pr\u00e9sence sur le service. Mais bien s\u00fbr, ici r\u00e9side aussi la principale difficult\u00e9 : il est difficile pour le syst\u00e8me de comprendre rapidement les int\u00e9r\u00eats d'une personne qui a peu interagi avec le contenu. Am\u00e9liorer les recommandations pour les nouveaux utilisateurs est notre t\u00e2che cl\u00e9. Nous continuerons \u00e0 optimiser les algorithmes pour que le contenu pertinent arrive plus rapidement dans leur fil d'actualit\u00e9, tandis que le contenu non pertinent ne soit pas montr\u00e9.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/490140\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0418\u0437 \u043f\u043e\u0441\u0442\u0430 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f; \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71853,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-28T17:59:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Comment nous travaillons sur la qualit\u00e9 et la vitesse de la s\u00e9lection des recommandations | ProHoster","description":"Je m'appelle Pavel Parkhomenko, je suis d\u00e9veloppeur ML. Dans cet article, je voudrais parler du fonctionnement du service Yandex.Zen et partager les am\u00e9liorations techniques dont la mise en \u0153uvre a permis d'augmenter la qualit\u00e9 des recommandations.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-28T17:59:58+00:00","article:modified_time":"2020-03-03T13:14:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71852","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:55:28","updated":"2022-10-09 15:47:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}