Ich heiĂe Pavel Parkhomenko und bin ML-Entwickler. In diesem Artikel möchte ich ĂŒber den Aufbau des Yandex.Zen-Dienstes sprechen und technische Verbesserungen teilen, die es ermöglicht haben, die QualitĂ€t der Empfehlungen zu steigern. Aus dem Post erfahren Sie, wie man in nur wenigen Millisekunden aus Millionen von Dokumenten die relevantesten fĂŒr den Nutzer findet; wie man eine kontinuierliche Zerlegung einer groĂen Matrix (die aus Millionen von Spalten und Dutzenden Millionen von Zeilen besteht) durchfĂŒhrt, 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ĂŒr Videos zu erhalten.

Unsere Empfehlungsdatenbank enthÀlt 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:
- Rechenaufgaben aufteilen: Alle schweren Operationen offline durchfĂŒhren und in Echtzeit nur schnelle Modellanwendungen ausfĂŒhren, um innerhalb von 100-200 ms zu antworten.
- Die Aktionen des Nutzers schnell berĂŒcksichtigen. DafĂŒr ist es notwendig, dass alle Ereignisse sofort an den Empfehlungsalgorithmus geliefert werden und die Ergebnisse der Modelle beeinflussen.
- 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ĂŒhl haben, dass ihr Feedback die Empfehlungen beeinflusst.
- Schnell verstehen, wem eine neue Geschichte empfohlen werden sollte.
- Schnell auf das stÀndige Erscheinen neuer Inhalte reagieren. TÀglich 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.
- Wissen von einem Themenbereich auf einen anderen ĂŒbertragen. Wenn im Empfehlungssystem trainierte Modelle fĂŒr Textartikel vorhanden sind und wir Videos hinzufĂŒgen, können bestehende Modelle wiederverwendet werden, um neuen Content besser zu bewerten.
Ich werde erzÀhlen, wie wir diese Aufgaben gelöst haben.
Auswahl von Kandidaten
Wie man in wenigen Millisekunden die Anzahl der betrachteten Dokumente um das Tausendfache reduziert, ohne die QualitÀt der Rangfolge wesentlich zu verschlechtern?
Nehmen wir an, wir haben viele ML-Modelle trainiert, basierend auf diesen Merkmale generiert und ein weiteres Modell trainiert, das Dokumente fĂŒr den Benutzer rankt. Alles wĂ€re gut, aber man kann nicht einfach alle Merkmale in Echtzeit fĂŒr Millionen von Dokumenten berechnen und dabei Empfehlungen in 100-200 ms erstellen. Die Aufgabe besteht darin, eine bestimmte Untermenge aus Millionen auszuwĂ€hlen, die fĂŒr 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ĂŒr die eigentliche Rangfolge möglichst viel Zeit bleibt. Zweitens mĂŒssen wir, wĂ€hrend wir die Anzahl der zu rankenden Dokumente stark reduzieren, alle fĂŒr den Benutzer relevanten Dokumente so vollstĂ€ndig wie möglich erhalten.
Unser Prinzip der Kandidatenauswahl hat sich evolutionÀr entwickelt, und mittlerweile sind wir zu einem mehrstufigen Schema gekommen:

ZunĂ€chst werden alle Dokumente in Gruppen unterteilt, und aus jeder Gruppe werden die beliebtesten Dokumente entnommen. Gruppen können Websites, Themen oder Cluster sein. FĂŒr jeden Benutzer werden basierend auf seiner Historie die ihm am nĂ€chsten liegenden Gruppen ausgewĂ€hlt, und aus diesen werden die besten Dokumente entnommen. AuĂerdem verwenden wir den kNN-Index, um die dem Benutzer am nĂ€chsten liegenden Dokumente in Echtzeit auszuwĂ€hlen. Es gibt mehrere Methoden zur Erstellung des kNN-Index, bei uns hat am besten funktioniert (Hierarchische navigierbare kleine Weltgraphen). Dies ist ein hierarchisches Modell, das es ermöglicht, in wenigen Millisekunden die N nĂ€chsten Vektoren fĂŒr den Benutzer aus einer Million groĂen 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ĂŒr jedes Embedding) und in Echtzeit auf jeden von ihnen zugreifen.
Wir haben zehntausende Dokumente fĂŒr jeden Benutzer. Das ist nach wie vor viel, um alle Merkmale zu zĂ€hlen, daher wenden wir in diesem Schritt ein leichtes Ranking an â 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öchsten Vorhersage werden im schweren Modell verwendet, also im letzten Schritt des Rankings. Dieser Ansatz ermöglicht es, die Datenbank der fĂŒr den Benutzer in Betracht gezogenen Dokumente in nur wenigen Millisekunden von Millionen auf Tausende zu reduzieren.
ALS-Schritt zur Laufzeit
Wie berĂŒcksichtigt man das Feedback des Benutzers sofort nach dem Klick?
Ein wichtiger Faktor bei Empfehlungen ist die Reaktionszeit auf das Feedback des Benutzers. Dies ist besonders wichtig fĂŒr neue Benutzer: Wenn jemand gerade erst beginnt, das Empfehlungssystem zu nutzen, erhĂ€lt er einen unpersonalisierten Feed mit einer Vielzahl von Dokumenten zu verschiedenen Themen. Sobald er den ersten Klick macht, muss dies sofort berĂŒcksichtigt werden, um sich an seine Interessen anzupassen. Wenn alle Faktoren offline berechnet werden, wird eine schnelle Reaktion des Systems aufgrund von Verzögerungen unmöglich. Daher mĂŒssen 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.
Angenommen, fĂŒr alle Dokumente haben wir eine vektorielle Darstellung. Zum Beispiel können 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?
Das allgemeine Prinzip der Bildung und Zerlegung der Benutzer-Dokument-MatrixAngenommen, wir haben m Benutzer und n Dokumente. FĂŒr 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Ă€hrend andere ausgefĂŒllt sind. FĂŒr jedes Ereignis (GefĂ€llt mir, GefĂ€llt mir nicht, Klick) ist in der Matrix ein gewisser Wert vorgesehen â betrachten wir ein vereinfachtes Modell, in dem ein GefĂ€llt mir 1 und ein GefĂ€llt mir nicht â1 entspricht.
Wir zerlegen die Matrix in zwei: P (m x d) und Q (d x n), wobei d die Dimension der VektorreprÀsentation ist (gewöhnlich 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Àllt, können wir einfach ihre Embeddings multiplizieren.

Eine mögliche Methode zur Zerlegung der Matrix ist ALS (Alternating Least Squares). Wir werden die folgende Verlustfunktion optimieren:

Hier 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.
Dann wird der optimale Vektor des Benutzers (bei festen Dokumentvektoren) analytisch durch die Lösung der entsprechenden linearen Regression gefunden, wobei die mittlere quadrierte Abweichung minimiert wird.
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ösung zu finden.
GlĂŒcklicherweise ist das Finden der VektorreprĂ€sentation eines Benutzers eine relativ schnelle Operation, die zur Laufzeit unter Verwendung von Vektorbefehlen durchgefĂŒhrt werden kann. Dieser Trick ermöglicht 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.
Verteilte kollaborative Filterung
Wie kann man inkrementelle verteilte Matrixfaktorisierung durchfĂŒhren und schnell die VektorreprĂ€sentation neuer Artikel finden?
Inhalte sind nicht die einzige Informationsquelle fĂŒr Empfehlungen. Eine weitere wichtige Quelle ist die kollaborative Information. Gute Hinweise im Ranking können traditionell aus der Zerlegung der Nutzer-Dokument-Matrix gewonnen werden. Bei dem Versuch, eine solche Zerlegung durchzufĂŒhren, sind wir jedoch auf Probleme gestoĂen:
1. Wir haben Millionen von Dokumenten und Dutzende Millionen von Nutzern. Die Matrix passt nicht vollstÀndig auf eine einzelne Maschine, und die Zerlegung wird sehr lange dauern.
2. Bei den meisten Inhalten im System ist die Lebensdauer kurz: Dokumente sind nur wenige Stunden relevant. Daher ist es notwendig, so schnell wie möglich ihre Vektordarstellung zu erstellen.
3. Wenn die Zerlegung sofort nach der Veröffentlichung eines Dokuments erfolgt, haben nicht genĂŒgend Nutzer Zeit, ihre Bewertung abzugeben. Daher wird die Vektordarstellung mit groĂer Wahrscheinlichkeit nicht besonders gut sein.
4. Wenn ein Nutzer ein Like oder ein Dislike vergibt, können wir dies nicht sofort in die Zerlegung einbeziehen.
Um die genannten Probleme zu lösen, haben wir eine verteilte Zerlegung der Nutzer-Dokument-Matrix mit hÀufigen inkrementellen Updates implementiert. Wie funktioniert das genau?
Angenommen, wir haben einen Cluster von N Maschinen (N summiert sich zu Hunderten), und wir möchten eine verteilte Zerlegung der Matrix durchfĂŒhren, die nicht auf eine einzelne Maschine passt. Die Frage ist, wie man diese Zerlegung so ausfĂŒhrt, dass einerseits genĂŒgend Daten auf jeder Maschine vorhanden sind und andererseits die Berechnungen unabhĂ€ngig sind.

Wir werden den oben beschriebenen ALS-Zerlegungsalgorithmus verwenden. Lassen Sie uns betrachten, wie wir einen Schritt von ALS verteilt ausfĂŒhren â die anderen Schritte werden Ă€hnlich sein. Angenommen, wir haben die Dokumentenmatrix fixiert und möchten die Nutzermatrix erstellen. Dazu teilen wir sie in N Teile nach Zeilen auf, wobei jeder Teil ungefĂ€hr die gleiche Anzahl von Zeilen enthĂ€lt. Wir senden die nicht leeren Zellen der entsprechenden Zeilen an jede Maschine sowie die Matrix der Dokumenteneinbettungen (komplett). Da diese nicht sehr groĂ ist und die Nutzer-Dokument-Matrix in der Regel stark spĂ€rlich ist, passen diese Daten auf eine gewöhnliche Maschine.
Dieser Trick kann ĂŒber mehrere Epochen hinweg wiederholt werden, bis das Modell konvergiert, indem man abwechselnd die feste Matrix Ă€ndert. Aber selbst dann kann die Zerlegung der Matrix mehrere Stunden dauern. Das löst nicht das Problem, dass man schnell Embedding fĂŒr neue Dokumente erhalten und die Embedding fĂŒr die Dokumente aktualisieren muss, zu denen es bei der Erstellung des Modells wenig Informationen gab.
Uns hat die EinfĂŒhrung 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Ă€hrend des Trainings wenig Interaktionen hatten. Um das Embedding solcher Artikel schnell zu erhalten, verwenden wir die Benutzer-Embeddings, die wĂ€hrend des ersten groĂen Trainings des Modells erhalten wurden, und fĂŒhren einen ALS-Schritt durch, um die Dokumentmatrix bei einer festen Benutzermatrix zu berechnen. Das ermöglicht es, das Embedding recht schnell zu erhalten â innerhalb weniger Minuten nach der Veröffentlichung eines Dokuments â und hĂ€ufig die Embedding frischer Dokumente zu aktualisieren.
Um die Aktionen einer Person sofort in die Empfehlungen einzubeziehen, verwenden wir zur Laufzeit keine Benutzer-Embeddings, die offline erhalten wurden. Stattdessen fĂŒhren wir einen ALS-Schritt durch und erhalten den aktuellen Benutzer-Vektor.
Ăbertragung auf ein anderes Anwendungsgebiet
Wie kann man das Feedback der Benutzer zu Textartikeln nutzen, um eine vektorielle Darstellung von Videos zu erstellen?
UrsprĂŒnglich haben wir nur Textartikel empfohlen, daher sind viele unserer Algorithmen auf diese Art von Inhalt ausgerichtet. Bei der HinzufĂŒgung anderer Inhaltstypen standen wir vor der Notwendigkeit, die Modelle anzupassen. Wie haben wir dieses Problem am Beispiel von Videos gelöst? Eine Möglichkeit wĂ€re 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ĂŒr den neuen Inhalt noch nicht in ausreichendem MaĂe vorhanden sind.
Wir sind einen anderen Weg gegangen und haben Textmodelle fĂŒr Videos wiederverwendet. Bei der Erstellung von Vektor-Darstellungen fĂŒr 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 ĂŒber Videoaufrufe genutzt haben. So haben wir mĂŒhelos die Vektor-Darstellung fĂŒr Videos erhalten. Zur Laufzeit berechnen wir einfach die Ăhnlichkeit zwischen dem Nutzervektor, der auf den Textartikeln basiert, und dem Video-Vektor.
Fazit
Die Entwicklung des Kerns eines Echtzeit-Empfehlungssystems ist mit einer Vielzahl von Herausforderungen verbunden. Es mĂŒssen 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.
In dem aktuellen System, dessen Aufbau ich beschrieben habe, steigt die QualitĂ€t der Empfehlungen fĂŒr den Nutzer mit seiner AktivitĂ€t und der Dauer seines Aufenthalts im Service. Doch hier liegt auch die gröĂte Schwierigkeit: Es fĂ€llt dem System schwer, die Interessen einer Person zu verstehen, die wenig mit Inhalten interagiert hat. Die Verbesserung der Empfehlungen fĂŒr neue Nutzer ist unsere Hauptaufgabe. Wir werden die Algorithmen weiterhin optimieren, damit relevante Inhalte schneller in ihren Feeds erscheinen und irrelevante nicht angezeigt werden.
Quelle: habr.com
