{"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 Empfehlungsauswahl arbeiten","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ich hei\u00dfe Pavel Parchomenko und bin ML-Entwickler. In diesem Artikel m\u00f6chte ich \u00fcber die Architektur des Yandex Zen-Dienstes berichten und technische Verbesserungen teilen, die die Qualit\u00e4t der Empfehlungen erh\u00f6ht haben. Sie erfahren, wie es in nur wenigen Millisekunden m\u00f6glich ist, unter Millionen von Dokumenten die relevantesten f\u00fcr den Nutzer zu finden; wie man eine kontinuierliche Zerlegung einer gro\u00dfen Matrix (bestehend aus Millionen von Spalten und zig Millionen Zeilen) durchf\u00fchrt, sodass neue Dokumente ihren Vektor innerhalb von Minuten erhalten; und wie man die Zerlegung der Benutzer-Artikeldatenmatrix wiederverwendet, um gute vektorielle Darstellungen f\u00fcr Videos zu erhalten.<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsauswahl 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 unterschiedlicher Formate: Textartikel, die auf unserer Plattform erstellt oder von externen Websites \u00fcbernommen wurden, Videos, Narrative und kurze Beitr\u00e4ge. Die Entwicklung eines solchen Dienstes ist mit einer Vielzahl technischer Herausforderungen verbunden. Hier sind einige davon:<\/p>\n<ul>\n<li>Rechenaufgaben aufteilen: Alle rechenintensiven Operationen offline durchf\u00fchren und in Echtzeit nur schnelle Modellanwendungen ausf\u00fchren, um innerhalb von 100 bis 200 ms zu reagieren.<\/li>\n<li>Benutzeraktionen schnell erfassen. Dazu ist es notwendig, dass alle Ereignisse sofort an das Empfehlungssystem \u00fcbermittelt werden und die Ergebnisse der Modelle beeinflussen.<\/li>\n<li>Den Feed so gestalten, dass er sich schnell an das Verhalten neuer Benutzer anpasst. Neuank\u00f6mmlinge im System sollten das Gef\u00fchl haben, dass ihr Feedback die Empfehlungen beeinflusst.<\/li>\n<li>Schnell verstehen, wem eine neue Artikel empfohlen werden sollte.<\/li>\n<li>Prompt auf die st\u00e4ndige Ver\u00f6ffentlichung neuer Inhalte reagieren. T\u00e4glich erscheinen Zehntausende Artikel, von denen viele eine begrenzte Lebensdauer haben (zum Beispiel Nachrichten). Das unterscheidet sie von Filmen, Musik und anderen langfristigen und kostenintensiven Inhalten.<\/li>\n<li>Wissen von einem Anwendungsgebiet auf ein anderes \u00fcbertragen. Wenn im Empfehlungssystem trainierte Modelle f\u00fcr Textartikel existieren und wir Videos hinzuf\u00fcgen, k\u00f6nnen bestehende Modelle wiederverwendet werden, um die Sichtbarkeit des neuen Inhalts zu verbessern.<\/li>\n<\/ul>\n<p>\nIch werde erl\u00e4utern, wie wir diese Herausforderungen gemeistert haben.<\/p>\n<h2>Auswahl der Kandidaten<\/h2>\n<p>\n<b>Wie kann man in wenigen Millisekunden die Anzahl der zu \u00fcberpr\u00fcfenden Dokumente um ein Vielfaches reduzieren, ohne die Qualit\u00e4t der Einstufung erheblich zu beeintr\u00e4chtigen?<\/b><\/p>\n<p>Angenommen, wir haben viele ML-Modelle trainiert, daraus Merkmale generiert und ein weiteres Modell trainiert, das Dokumente f\u00fcr den Benutzer einstuft. Alles w\u00e4re gut, aber man kann nicht einfach alle Merkmale f\u00fcr Millionen von Dokumenten in Echtzeit berechnen, wenn die Empfehlungen in 100-200 ms bereitgestellt werden m\u00fcssen. Die Aufgabe besteht darin, aus Millionen von Dokumenten eine Teilmenge auszuw\u00e4hlen, die f\u00fcr die Benutzerbewertung verwendet wird. Dieser Schritt wird in der Regel als Auswahl der Kandidaten bezeichnet. Es gibt daf\u00fcr mehrere Anforderungen. Erstens muss die Auswahl sehr schnell erfolgen, damit f\u00fcr die tats\u00e4chliche Einstufung so viel Zeit wie m\u00f6glich bleibt. Zweitens, obwohl wir die Anzahl der zu bewertenden Dokumente erheblich reduzieren, sollten wir so viele relevante Dokumente wie m\u00f6glich f\u00fcr den Benutzer erhalten.<\/p>\n<p>Unser Auswahlprinzip hat sich evolution\u00e4r entwickelt, und mittlerweile sind wir zu einem mehrstufigen Schema gelangt:<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsauswahl 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 eingeteilt, aus denen die beliebtesten Dokumente ausgew\u00e4hlt werden. Die Gruppen k\u00f6nnen Webseiten, Themen oder Cluster sein. F\u00fcr jeden Nutzer werden basierend auf seiner Historie die am besten passenden Gruppen ausgew\u00e4hlt, aus denen die besten Dokumente entnommen werden. Zudem verwenden wir den kNN-Index, um in Echtzeit die am n\u00e4chsten liegenden Dokumente f\u00fcr den Nutzer auszuw\u00e4hlen. Es gibt verschiedene Methoden zur Erstellung des kNN-Indexes, bei uns hat die folgende am besten funktioniert: <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchische Navigierbare Kleinstadtgrafen). Dies ist ein hierarchisches Modell, das es erm\u00f6glicht, innerhalb von wenigen Millisekunden die N n\u00e4chstgelegenen Vektoren f\u00fcr den Nutzer aus einer Millionen-Datenbank zu finden. Vorab indizieren wir unsere gesamte Dokumentendatenbank offline. Da die Suche im Index recht schnell ist, k\u00f6nnen wir bei Vorhandensein mehrerer starker Einbettungen mehrere Indizes erstellen (je einen f\u00fcr jede Einbettung) und in Echtzeit auf jeden von ihnen zugreifen.<\/p>\n<p>Wir verf\u00fcgen \u00fcber Zehntausende von Dokumenten f\u00fcr jeden Benutzer. Das ist immer noch eine gro\u00dfe Menge, um s\u00e4mtliche Merkmale zu z\u00e4hlen, daher wenden wir in diesem Schritt ein leichtes Ranking an \u2013 ein vereinfachtes Modell eines schweren Rankings mit weniger Merkmalen. Die Aufgabe besteht darin, vorherzusagen, welche Dokumente bei dem schwereren Modell in der Spitze landen werden. Die Dokumente mit den h\u00f6chsten Vorhersagen werden in dem schweren Modell verwendet, das hei\u00dft in der finalen Ranking-Phase. Dieser Ansatz erm\u00f6glicht es, die Anzahl der f\u00fcr den Benutzer betrachteten 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 Benutzer-Feedback sofort nach dem Klick?<\/b><\/p>\n<p>Ein wichtiger Faktor in Empfehlungen ist die Reaktionszeit auf das Feedback des Nutzers. Dies ist besonders wichtig f\u00fcr neue Nutzer: Wenn jemand anf\u00e4ngt, das Empfehlungssystem zu nutzen, erh\u00e4lt er einen nicht personalisierten Feed mit einer Vielzahl von Dokumenten zu unterschiedlichen Themen. Sobald er seinen ersten Klick macht, ist es wichtig, sofort darauf zu reagieren und sich an seinen Interessen zu orientieren. Wenn alle Faktoren offline berechnet werden, wird eine schnelle Reaktion des Systems aufgrund von Verz\u00f6gerungen unm\u00f6glich. Daher ist es notwendig, die Aktionen der Nutzer in Echtzeit zu verarbeiten. Zu diesem Zweck verwenden wir den ALS-Schritt zur Laufzeit, um die Vektorrepr\u00e4sentation des Nutzers zu erstellen.<\/p>\n<p>Angenommen, wir haben f\u00fcr alle Dokumente eine Vektorrepr\u00e4sentation. Zum Beispiel k\u00f6nnen wir offline aus dem Text eines Artikels Embeddings mit ELMo, BERT oder anderen Modellen des maschinellen Lernens erstellen. Wie k\u00f6nnen wir die Vektorrepr\u00e4sentation der Nutzer im selben Raum basierend auf ihren Interaktionen im System erhalten?<\/p>\n<p><b class=\"spoiler_title\">Der allgemeine Grundsatz zur Bildung und Zerlegung der Nutzer-Dokument-Matrix<\/b>Angenommen, wir haben m Nutzer und n Dokumente. F\u00fcr einige Nutzer ist ihre Beziehung zu bestimmten Dokumenten bekannt. Diese Informationen k\u00f6nnen wir in einer m x n-Matrix darstellen: Die Zeilen entsprechen den Nutzern und die Spalten den Dokumenten. Da die meisten Dokumente von einer Person nicht gesehen wurden, bleiben viele Zellen der Matrix leer, w\u00e4hrend andere ausgef\u00fcllt sind. F\u00fcr jedes Ereignis (Gef\u00e4llt mir, gef\u00e4llt mir nicht, Klicken) sieht die Matrix einen bestimmten Wert vor \u2013 in unserem vereinfachten Modell entspricht ein \"Gef\u00e4llt mir\" der 1 und ein \"Gef\u00e4llt mir nicht\" der -1.<\/p>\n<p>Wir zerlegen die Matrix in zwei Matrizen: P (m x d) und Q (d x n), wobei d die Dimension der Vektordarstellung ist (in der Regel eine kleine Zahl). Daher hat jedes Objekt einen d-dimensionalen Vektor (f\u00fcr den Nutzer ist das die Zeile in der Matrix P, f\u00fcr das Dokument die Spalte in der Matrix Q). Diese Vektoren sind die Embeddings der entsprechenden Objekte. Um vorherzusagen, ob einem Nutzer ein Dokument gefallen wird, multiplizieren wir einfach ihre Embeddings.<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsauswahl 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 optimieren die folgende Verlustfunktion:<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsauswahl 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 - der Vektor des Dokuments i, pu - der Vektor des Benutzers u.<\/p>\n<p>Der optimale Vektor des Benutzers aus Sicht des mittleren quadratischen Fehlers (bei festen Dokumentvektoren) wird analytisch durch die L\u00f6sung der entsprechenden linearen Regression ermittelt.<\/p>\n<p>Dies wird als \"ALS-Schritt\" bezeichnet. Der Algorithmus 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 Vektor-Darstellung des Benutzers eine ziemlich schnelle Operation, die zur Laufzeit unter Verwendung von Vektor-Befehlen durchgef\u00fchrt werden kann. Dieser Trick erm\u00f6glicht es, das Benutzer-Feedback sofort in die Rangfolge einzubeziehen. Das gleiche 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 Vektor-Darstellung neuer Artikel finden?<\/b><\/p>\n<p>Inhalte sind nicht die einzige Quelle f\u00fcr Empfehlungsdaten. Eine weitere wichtige Quelle ist die kollaborative Information. Gute Hinweise f\u00fcr das 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 zehn Millionen Nutzer. Die Matrix passt nicht vollst\u00e4ndig auf eine einzige Maschine, und die Zerlegung w\u00fcrde sehr lange dauern.<br \/>\n2. Bei den meisten Inhalten in unserem System ist die Lebensdauer kurz: Dokumente sind nur wenige Stunden relevant. Daher ist es notwendig, ihre vektorielle Darstellung m\u00f6glichst schnell zu erstellen.<br \/>\n3. Wenn die Zerlegung direkt nach der Ver\u00f6ffentlichung eines Dokuments erfolgt, haben wahrscheinlich nicht ausreichend viele Nutzer das Dokument bewertet. Daher wird die vektorielle Darstellung sehr wahrscheinlich nicht besonders gut sein.<br \/>\n4. Wenn ein Nutzer ein Dokument positiv oder negativ bewertet, k\u00f6nnen wir dies in der Zerlegung nicht sofort ber\u00fccksichtigen.<\/p>\n<p>Um die genannten Probleme zu l\u00f6sen, haben wir eine verteilte Matrixfaktorierung benutzer-dokument mit h\u00e4ufigen, inkrementellen Updates umgesetzt. Wie funktioniert das genau?<\/p>\n<p>Angenommen, wir haben einen Cluster aus N Maschinen (N in den Hunderten) und wollen eine verteilte Faktorierung einer Matrix durchf\u00fchren, die nicht auf einer Maschine Platz hat. Die Frage ist, wie wir diese Faktorisierung so ausf\u00fchren, dass eine ausreichende Datenmenge auf jeder Maschine vorhanden ist und die Berechnungen unabh\u00e4ngig voneinander stattfinden k\u00f6nnen. <\/p>\n<p><img decoding=\"async\" alt=\"Wie wir an der Qualit\u00e4t und Geschwindigkeit der Empfehlungsauswahl arbeiten\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir werden den oben beschriebenen ALS-Faktorierungsalgorithmus verwenden. Lassen Sie uns betrachten, wie wir einen Schritt der ALS-Faktorisierung verteilt ausf\u00fchren \u2014 die anderen Schritte werden \u00e4hnlich sein. Angenommen, wir haben die Dokumentmatrix fixiert und wollen die Benutzermatrix erstellen. Zu diesem Zweck teilen wir sie in N Teile nach Zeilen auf, wobei jeder Teil ungef\u00e4hr die gleiche Anzahl von Zeilen enth\u00e4lt. Wir senden an jede Maschine die nicht leeren Zellen der entsprechenden Zeilen sowie die gesamte Dokumenteinbettungsmatrix. Da sie nicht sehr gro\u00df ist und die Benutzer-Dokument-Matrix normalerweise sehr d\u00fcnn besetzt ist, passen diese Daten auf eine gew\u00f6hnliche Maschine.<\/p>\n<p>Dieser Trick kann \u00fcber mehrere Epochen hinweg zur Konvergenz des Modells wiederholt werden, indem abwechselnd die feste Matrix ver\u00e4ndert wird. Doch selbst dann kann die Zerlegung der Matrix mehrere Stunden in Anspruch nehmen. Und das l\u00f6st nicht das Problem, dass man schnell die Embeddings neuer Dokumente erhalten und die Embeddings derjenigen aktualisieren muss, zu denen w\u00e4hrend des Modelltrainings nur begrenzte Informationen vorlagen. <\/p>\n<p>Die Implementierung eines schnellen inkrementellen Updates des Modells hat uns 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 nur geringf\u00fcgig genutzt wurden. Um schnell die Embeddings solcher Artikel zu erhalten, verwenden wir die Benutzer-Embeddings, die w\u00e4hrend des ersten gro\u00dfen Trainings des Modells generiert wurden, und f\u00fchren einen Schritt ALS (Alternating Least Squares) durch, um die Dokumentmatrix bei konstanter Benutzermatrix zu berechnen. Dadurch k\u00f6nnen wir die Embeddings ziemlich schnell erhalten \u2013 innerhalb von Minuten nach der Ver\u00f6ffentlichung eines Dokuments \u2013 und die Embeddings neuer Dokumente h\u00e4ufig aktualisieren.<\/p>\n<p>Um Empfehlungen sofort in Echtzeit auf die Handlungen der Benutzer abzustimmen, verwenden wir keine Offline-Benutzer-Embeddings. Stattdessen setzen wir den ALS-Schritt ein und erhalten den aktuellsten Benutzervektor.<\/p>\n<h2>\u00dcbertragung auf ein anderes Domaingebiet<\/h2>\n<p>\n<b>Wie kann man das Nutzerfeedback zu Textartikeln nutzen, um eine Vektordarstellung von Videos zu erstellen?<\/b><\/p>\n<p>Urspr\u00fcnglich haben wir nur Textartikel empfohlen, weshalb viele unserer Algorithmen auf diese Art von Inhalten optimiert sind. Bei der Einf\u00fchrung von Inhalten anderer Typen stie\u00dfen wir jedoch auf die Notwendigkeit, die Modelle anzupassen. Wie haben wir diese Herausforderung am Beispiel von Videos gel\u00f6st? Eine M\u00f6glichkeit w\u00e4re, alle Modelle von Grund auf neu zu trainieren. Das dauert jedoch lange und einige Algorithmen sind auf eine gro\u00dfe Menge an Trainingsdaten angewiesen, die f\u00fcr neue Inhaltstypen in den ersten Phasen seiner Nutzung auf dem Dienst noch nicht in ausreichendem Ma\u00dfe vorhanden sind.<\/p>\n<p>Wir haben einen anderen Weg eingeschlagen und Textmodelle f\u00fcr Videos wiederverwendet. Bei der Erstellung von Vektorrepr\u00e4sentationen f\u00fcr Videos haben wir denselben ALS-Trick verwendet. Wir haben die Vektorrepr\u00e4sentation der Nutzer basierend auf Textartikeln genommen und einen ALS-Schritt unternommen, indem wir Informationen \u00fcber Videoansichten eingesetzt haben. So erhielten wir m\u00fchelos die Vektorrepr\u00e4sentation des Videos. Zur Laufzeit berechnen wir einfach die \u00c4hnlichkeit zwischen dem Benutzervektor, der auf Textartikeln basiert, und dem Video-Vektor.<\/p>\n<h2>Fazit<\/h2>\n<p>\nDie Entwicklung des Kernsystems f\u00fcr Echtzeitempfehlungen ist mit vielen Herausforderungen verbunden. Es ist erforderlich, Daten schnell zu verarbeiten und ML-Methoden anzuwenden, um diese Daten effektiv zu nutzen; komplexe verteilte Systeme zu bauen, die in der Lage sind, Nutzerinformationen und neue Inhalte in minimaler Zeit zu verarbeiten; und viele weitere Aufgaben.<\/p>\n<p>In dem aktuellen System, dessen Ger\u00e4t ich beschrieben habe, w\u00e4chst die Qualit\u00e4t der Empfehlungen f\u00fcr den Nutzer mit seiner Aktivit\u00e4t und Verweildauer im Dienst. Doch hier liegt auch die gr\u00f6\u00dfte Herausforderung: Es f\u00e4llt dem System schwer, sofort die Interessen eines Menschen zu erkennen, der wenig mit den Inhalten interagiert hat. Die Verbesserung der Empfehlungen f\u00fcr neue Nutzer ist unser zentrales Anliegen. Wir werden weiterhin die Algorithmen optimieren, damit relevante Inhalte schneller in den Feed gelangen 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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 von Empfehlungen arbeiten | ProHoster","description":"Ich hei\u00dfe Pavel Parkhomenko und 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 gesteigert hat. Aus dem Beitrag erfahren Sie, wie man in nur wenigen Millisekunden aus Millionen von Dokumenten die relevantesten f\u00fcr den Nutzer findet; wie man die kontinuierliche Zerlegung einer gro\u00dfen Matrix (bestehend aus Millionen von Spalten und...","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. \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","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"},"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}]}}