{"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\/de\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ich hei\u00dfe Pavel Parkhomenko und bin ML-Entwickler. In diesem Artikel m\u00f6chte ich \u00fcber den Aufbau des Yandex.Zen-Dienstes sprechen und technische Verbesserungen teilen, die es erm\u00f6glicht haben, die Qualit\u00e4t der Empfehlungen zu steigern. Aus dem Post erfahren Sie, wie man in nur wenigen Millisekunden aus Millionen von Dokumenten die relevantesten f\u00fcr den Nutzer findet; wie man eine kontinuierliche Zerlegung einer gro\u00dfen Matrix (die aus Millionen von Spalten und Dutzenden Millionen von Zeilen besteht) durchf\u00fchrt, damit neue Dokumente in nur wenigen Minuten ihren Vektor erhalten; und wie man die Zerlegung der Matrix Nutzer-Artikel wiederverwendet, um eine gute vektorielle Darstellung f\u00fcr Videos zu erhalten.<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten\" 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 \/>\nUnsere Empfehlungsdatenbank enth\u00e4lt Millionen von Dokumenten verschiedener Formate: Textartikel, die auf unserer Plattform erstellt und von externen Websites entnommen wurden, Videos, Narrative und kurze Posts. Die Entwicklung eines solchen Dienstes ist mit einer Vielzahl technischer Herausforderungen verbunden. Hier sind einige davon:<\/p>\n<ul>\n<li>Rechenaufgaben aufteilen: Alle schweren Operationen offline durchf\u00fchren und in Echtzeit nur schnelle Modellanwendungen ausf\u00fchren, um innerhalb von 100-200 ms zu antworten.<\/li>\n<li>Die Aktionen des Nutzers schnell ber\u00fccksichtigen. Daf\u00fcr ist es notwendig, dass alle Ereignisse sofort an den Empfehlungsalgorithmus geliefert werden und die Ergebnisse der Modelle beeinflussen.<\/li>\n<li>Der Feed sollte so gestaltet sein, dass er sich schnell an das Verhalten neuer Nutzer anpasst. Neu in das System kommende Personen sollten das Gef\u00fchl haben, dass ihr Feedback die Empfehlungen beeinflusst.<\/li>\n<li>Schnell verstehen, wem eine neue Geschichte empfohlen werden sollte.<\/li>\n<li>Schnell auf das st\u00e4ndige Erscheinen neuer Inhalte reagieren. T\u00e4glich erscheinen Zehntausende von Artikeln, von denen viele eine begrenzte Lebensdauer haben (zum Beispiel Nachrichten). Das unterscheidet sie von Filmen, Musik und sonstigem langlebigen und aufwendigen Content.<\/li>\n<li>Wissen von einem Themenbereich auf einen anderen \u00fcbertragen. Wenn im Empfehlungssystem trainierte Modelle f\u00fcr Textartikel vorhanden sind und wir Videos hinzuf\u00fcgen, k\u00f6nnen bestehende Modelle wiederverwendet werden, um neuen Content besser zu bewerten.<\/li>\n<\/ul>\n<p>\nIch werde erz\u00e4hlen, wie wir diese Aufgaben gel\u00f6st haben.<\/p>\n<h2>Auswahl von Kandidaten<\/h2>\n<p>\n<b>Wie man in wenigen Millisekunden die Anzahl der betrachteten Dokumente um das Tausendfache reduziert, ohne die Qualit\u00e4t der Rangfolge wesentlich zu verschlechtern?<\/b><\/p>\n<p>Nehmen wir an, wir haben viele ML-Modelle trainiert, basierend auf diesen Merkmale generiert und ein weiteres Modell trainiert, das Dokumente f\u00fcr den Benutzer rankt. Alles w\u00e4re gut, aber man kann nicht einfach alle Merkmale in Echtzeit f\u00fcr Millionen von Dokumenten berechnen und dabei Empfehlungen in 100-200 ms erstellen. Die Aufgabe besteht darin, eine bestimmte Untermenge aus Millionen auszuw\u00e4hlen, die f\u00fcr den Benutzer gerankt wird. Diese Phase nennt man in der Regel die Kandidatenauswahl. Dabei gibt es einige Anforderungen. Erstens muss die Auswahl sehr schnell erfolgen, damit f\u00fcr die eigentliche Rangfolge m\u00f6glichst viel Zeit bleibt. Zweitens m\u00fcssen wir, w\u00e4hrend wir die Anzahl der zu rankenden Dokumente stark reduzieren, alle f\u00fcr den Benutzer relevanten Dokumente so vollst\u00e4ndig wie m\u00f6glich erhalten.<\/p>\n<p>Unser Prinzip der Kandidatenauswahl hat sich evolution\u00e4r entwickelt, und mittlerweile sind wir zu einem mehrstufigen Schema gekommen:<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nZun\u00e4chst werden alle Dokumente in Gruppen unterteilt, und aus jeder Gruppe werden die beliebtesten Dokumente entnommen. Gruppen k\u00f6nnen Websites, Themen oder Cluster sein. F\u00fcr jeden Benutzer werden basierend auf seiner Historie die ihm am n\u00e4chsten liegenden Gruppen ausgew\u00e4hlt, und aus diesen werden die besten Dokumente entnommen. Au\u00dferdem verwenden wir den kNN-Index, um die dem Benutzer am n\u00e4chsten liegenden Dokumente in Echtzeit auszuw\u00e4hlen. Es gibt mehrere Methoden zur Erstellung des kNN-Index, bei uns hat am besten funktioniert <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchische navigierbare kleine Weltgraphen). Dies ist ein hierarchisches Modell, das es erm\u00f6glicht, in wenigen Millisekunden die N n\u00e4chsten Vektoren f\u00fcr den Benutzer aus einer Million gro\u00dfen Datenbank zu finden. Zuvor indizieren wir offline unsere gesamte Dokumentenbank. Da die Suche im Index ziemlich schnell funktioniert, kann man bei mehreren starken Embeddings mehrere Indizes erstellen (je einen Index f\u00fcr jedes Embedding) und in Echtzeit auf jeden von ihnen zugreifen.<\/p>\n<p>Wir haben zehntausende Dokumente f\u00fcr jeden Benutzer. Das ist nach wie vor viel, um alle Merkmale zu z\u00e4hlen, daher wenden wir in diesem Schritt ein leichtes Ranking an \u2013 ein vereinfachtes Modell des schweren Rankings mit weniger Merkmalen. Die Aufgabe besteht darin, vorherzusagen, welche Dokumente in dem schweren Modell ganz oben stehen werden. Dokumente mit der h\u00f6chsten Vorhersage werden im schweren Modell verwendet, also im letzten Schritt des Rankings. Dieser Ansatz erm\u00f6glicht es, die Datenbank der f\u00fcr den Benutzer in Betracht gezogenen Dokumente in nur wenigen Millisekunden von Millionen auf Tausende zu reduzieren.<\/p>\n<h2>ALS-Schritt zur Laufzeit<\/h2>\n<p>\n<b>Wie ber\u00fccksichtigt man das Feedback des Benutzers sofort nach dem Klick?<\/b><\/p>\n<p>Ein wichtiger Faktor bei Empfehlungen ist die Reaktionszeit auf das Feedback des Benutzers. Dies ist besonders wichtig f\u00fcr neue Benutzer: Wenn jemand gerade erst beginnt, das Empfehlungssystem zu nutzen, erh\u00e4lt er einen unpersonalisierten Feed mit einer Vielzahl von Dokumenten zu verschiedenen Themen. Sobald er den ersten Klick macht, muss dies sofort ber\u00fccksichtigt werden, um sich an seine Interessen anzupassen. Wenn alle Faktoren offline berechnet werden, wird eine schnelle Reaktion des Systems aufgrund von Verz\u00f6gerungen unm\u00f6glich. Daher m\u00fcssen die Aktionen des Benutzers in Echtzeit verarbeitet werden. Zu diesem Zweck verwenden wir den ALS-Schritt zur Laufzeit, um eine vektorielle Darstellung des Benutzers zu erstellen.<\/p>\n<p>Angenommen, f\u00fcr alle Dokumente haben wir eine vektorielle Darstellung. Zum Beispiel k\u00f6nnen wir offline basierend auf dem Text des Artikels Einbettungen mit Hilfe von ELMo, BERT oder anderen Modellen des maschinellen Lernens erstellen. Wie kann man die vektorielle Darstellung der Benutzer im selben Raum basierend auf ihrer Interaktion im System erhalten?<\/p>\n<p><b class=\"spoiler_title\">Das allgemeine Prinzip der Bildung und Zerlegung der Benutzer-Dokument-Matrix<\/b>Angenommen, wir haben m Benutzer und n Dokumente. F\u00fcr einige Benutzer ist ihre Beziehung zu bestimmten Dokumenten bekannt. Dann kann diese Information in Form einer m x n-Matrix dargestellt werden: Die Zeilen entsprechen den Benutzern und die Spalten den Dokumenten. Da die meisten Dokumente von den Benutzern nicht gesehen wurden, bleiben die meisten Zellen der Matrix leer, w\u00e4hrend andere ausgef\u00fcllt sind. F\u00fcr jedes Ereignis (Gef\u00e4llt mir, Gef\u00e4llt mir nicht, Klick) ist in der Matrix ein gewisser Wert vorgesehen \u2013 betrachten wir ein vereinfachtes Modell, in dem ein Gef\u00e4llt mir 1 und ein Gef\u00e4llt mir nicht \u20131 entspricht.<\/p>\n<p>Wir zerlegen die Matrix in zwei: P (m x d) und Q (d x n), wobei d die Dimension der Vektorrepr\u00e4sentation ist (gew\u00f6hnlich eine kleine Zahl). Dann entspricht jedem Objekt ein d-dimensionaler Vektor (dem Benutzer eine Zeile in der Matrix P, dem Dokument eine Spalte in der Matrix Q). Diese Vektoren sind die Embeddings der entsprechenden Objekte. Um vorherzusagen, ob einem Benutzer ein Dokument gef\u00e4llt, k\u00f6nnen wir einfach ihre Embeddings multiplizieren.<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEine m\u00f6gliche Methode zur Zerlegung der Matrix ist ALS (Alternating Least Squares). Wir werden die folgende Verlustfunktion optimieren:<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nHier ist rui die Interaktion des Benutzers u mit dem Dokument i, qi ist der Vektor des Dokuments i, pu ist der Vektor des Benutzers u.<\/p>\n<p>Dann wird der optimale Vektor des Benutzers (bei festen Dokumentvektoren) analytisch durch die L\u00f6sung der entsprechenden linearen Regression gefunden, wobei die mittlere quadrierte Abweichung minimiert wird.<\/p>\n<p>Das wird als \"ALS-Schritt\" bezeichnet. Der Algorithmus ALS selbst besteht darin, dass wir abwechselnd eine der Matrizen (Benutzer und Artikel) fixieren und die andere aktualisieren, um die optimale L\u00f6sung zu finden.<\/p>\n<p>Gl\u00fccklicherweise ist das Finden der Vektorrepr\u00e4sentation eines Benutzers eine relativ schnelle Operation, die zur Laufzeit unter Verwendung von Vektorbefehlen durchgef\u00fchrt werden kann. Dieser Trick erm\u00f6glicht es, das Feedback des Benutzers sofort in die Rangliste einzubeziehen. Dasselbe Embedding kann auch im kNN-Index verwendet werden, um die Auswahl der Kandidaten zu verbessern.<\/p>\n<h2>Verteilte kollaborative Filterung<\/h2>\n<p>\n<b>Wie kann man inkrementelle verteilte Matrixfaktorisierung durchf\u00fchren und schnell die Vektorrepr\u00e4sentation neuer Artikel finden?<\/b><\/p>\n<p>Inhalte sind nicht die einzige Informationsquelle f\u00fcr Empfehlungen. Eine weitere wichtige Quelle ist die kollaborative Information. Gute Hinweise im Ranking k\u00f6nnen traditionell aus der Zerlegung der Nutzer-Dokument-Matrix gewonnen werden. Bei dem Versuch, eine solche Zerlegung durchzuf\u00fchren, sind wir jedoch auf Probleme gesto\u00dfen:<\/p>\n<p>1. Wir haben Millionen von Dokumenten und Dutzende Millionen von Nutzern. Die Matrix passt nicht vollst\u00e4ndig auf eine einzelne Maschine, und die Zerlegung wird sehr lange dauern.<br \/>\n2. Bei den meisten Inhalten im System ist die Lebensdauer kurz: Dokumente sind nur wenige Stunden relevant. Daher ist es notwendig, so schnell wie m\u00f6glich ihre Vektordarstellung zu erstellen.<br \/>\n3. Wenn die Zerlegung sofort nach der Ver\u00f6ffentlichung eines Dokuments erfolgt, haben nicht gen\u00fcgend Nutzer Zeit, ihre Bewertung abzugeben. Daher wird die Vektordarstellung mit gro\u00dfer Wahrscheinlichkeit nicht besonders gut sein.<br \/>\n4. Wenn ein Nutzer ein Like oder ein Dislike vergibt, k\u00f6nnen wir dies nicht sofort in die Zerlegung einbeziehen.<\/p>\n<p>Um die genannten Probleme zu l\u00f6sen, haben wir eine verteilte Zerlegung der Nutzer-Dokument-Matrix mit h\u00e4ufigen inkrementellen Updates implementiert. Wie funktioniert das genau?<\/p>\n<p>Angenommen, wir haben einen Cluster von N Maschinen (N summiert sich zu Hunderten), und wir m\u00f6chten eine verteilte Zerlegung der Matrix durchf\u00fchren, die nicht auf eine einzelne Maschine passt. Die Frage ist, wie man diese Zerlegung so ausf\u00fchrt, dass einerseits gen\u00fcgend Daten auf jeder Maschine vorhanden sind und andererseits die Berechnungen unabh\u00e4ngig sind. <\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsfindung arbeiten\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir werden den oben beschriebenen ALS-Zerlegungsalgorithmus verwenden. Lassen Sie uns betrachten, wie wir einen Schritt von ALS verteilt ausf\u00fchren \u2014 die anderen Schritte werden \u00e4hnlich sein. Angenommen, wir haben die Dokumentenmatrix fixiert und m\u00f6chten die Nutzermatrix erstellen. Dazu teilen wir sie in N Teile nach Zeilen auf, wobei jeder Teil ungef\u00e4hr die gleiche Anzahl von Zeilen enth\u00e4lt. Wir senden die nicht leeren Zellen der entsprechenden Zeilen an jede Maschine sowie die Matrix der Dokumenteneinbettungen (komplett). Da diese nicht sehr gro\u00df ist und die Nutzer-Dokument-Matrix in der Regel stark sp\u00e4rlich ist, passen diese Daten auf eine gew\u00f6hnliche Maschine.<\/p>\n<p>Dieser Trick kann \u00fcber mehrere Epochen hinweg wiederholt werden, bis das Modell konvergiert, indem man abwechselnd die feste Matrix \u00e4ndert. Aber selbst dann kann die Zerlegung der Matrix mehrere Stunden dauern. Das l\u00f6st nicht das Problem, dass man schnell Embedding f\u00fcr neue Dokumente erhalten und die Embedding f\u00fcr die Dokumente aktualisieren muss, zu denen es bei der Erstellung des Modells wenig Informationen gab. <\/p>\n<p>Uns hat die Einf\u00fchrung eines schnellen inkrementellen Updates des Modells geholfen. Angenommen, wir haben ein aktuelles trainiertes Modell. Seit seiner Schulung sind neue Artikel erschienen, mit denen unsere Benutzer interagiert haben, sowie Artikel, die w\u00e4hrend des Trainings wenig Interaktionen hatten. Um das Embedding solcher Artikel schnell zu erhalten, verwenden wir die Benutzer-Embeddings, die w\u00e4hrend des ersten gro\u00dfen Trainings des Modells erhalten wurden, und f\u00fchren einen ALS-Schritt durch, um die Dokumentmatrix bei einer festen Benutzermatrix zu berechnen. Das erm\u00f6glicht es, das Embedding recht schnell zu erhalten \u2014 innerhalb weniger Minuten nach der Ver\u00f6ffentlichung eines Dokuments \u2014 und h\u00e4ufig die Embedding frischer Dokumente zu aktualisieren.<\/p>\n<p>Um die Aktionen einer Person sofort in die Empfehlungen einzubeziehen, verwenden wir zur Laufzeit keine Benutzer-Embeddings, die offline erhalten wurden. Stattdessen f\u00fchren wir einen ALS-Schritt durch und erhalten den aktuellen Benutzer-Vektor.<\/p>\n<h2>\u00dcbertragung auf ein anderes Anwendungsgebiet<\/h2>\n<p>\n<b>Wie kann man das Feedback der Benutzer zu Textartikeln nutzen, um eine vektorielle Darstellung von Videos zu erstellen?<\/b><\/p>\n<p>Urspr\u00fcnglich haben wir nur Textartikel empfohlen, daher sind viele unserer Algorithmen auf diese Art von Inhalt ausgerichtet. Bei der Hinzuf\u00fcgung anderer Inhaltstypen standen wir vor der Notwendigkeit, die Modelle anzupassen. Wie haben wir dieses Problem am Beispiel von Videos gel\u00f6st? Eine M\u00f6glichkeit w\u00e4re gewesen, alle Modelle von Grund auf neu zu trainieren. Aber das dauert lange, zudem sind einige Algorithmen anspruchsvoll hinsichtlich der Menge an Trainingsdaten, die zu Beginn ihrer Lebensdauer auf dem Service f\u00fcr den neuen Inhalt noch nicht in ausreichendem Ma\u00dfe vorhanden sind.<\/p>\n<p>Wir sind einen anderen Weg gegangen und haben Textmodelle f\u00fcr Videos wiederverwendet. Bei der Erstellung von Vektor-Darstellungen f\u00fcr Videos haben wir den gleichen Trick mit ALS verwendet. Wir haben die Vektor-Darstellung der Nutzer basierend auf Textartikeln genommen und einen ALS-Schritt gemacht, indem wir die Informationen \u00fcber Videoaufrufe genutzt haben. So haben wir m\u00fchelos die Vektor-Darstellung f\u00fcr Videos erhalten. Zur Laufzeit berechnen wir einfach die \u00c4hnlichkeit zwischen dem Nutzervektor, der auf den Textartikeln basiert, und dem Video-Vektor.<\/p>\n<h2>Fazit<\/h2>\n<p>\nDie Entwicklung des Kerns eines Echtzeit-Empfehlungssystems ist mit einer Vielzahl von Herausforderungen verbunden. Es m\u00fcssen Daten schnell verarbeitet und ML-Methoden angewendet werden, um diese Daten effektiv zu nutzen; komplexe verteilte Systeme aufgebaut werden, die in der Lage sind, Benutzersignale und neue Inhalte in minimaler Zeit zu verarbeiten; sowie viele andere Aufgaben zu erledigen.<\/p>\n<p>In dem aktuellen System, dessen Aufbau ich beschrieben habe, steigt die Qualit\u00e4t der Empfehlungen f\u00fcr den Nutzer mit seiner Aktivit\u00e4t und der Dauer seines Aufenthalts im Service. Doch hier liegt auch die gr\u00f6\u00dfte Schwierigkeit: Es f\u00e4llt dem System schwer, die Interessen einer Person zu verstehen, die wenig mit Inhalten interagiert hat. Die Verbesserung der Empfehlungen f\u00fcr neue Nutzer ist unsere Hauptaufgabe. Wir werden die Algorithmen weiterhin optimieren, damit relevante Inhalte schneller in ihren Feeds erscheinen und irrelevante nicht angezeigt werden.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsanpassung arbeiten | ProHoster","description":"Mein Name ist Pavel Parkhomenko und ich bin ML-Entwickler. In diesem Artikel m\u00f6chte ich \u00fcber die Funktionsweise des Yandex Zen-Dienstes berichten und technische Verbesserungen teilen, deren Implementierung die Qualit\u00e4t der Empfehlungen erh\u00f6ht hat.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}