Hallo! Mein Name ist Mikhail Dyachkov und bei Citymobil lerne ich maschinell. Heute werde ich Ihnen von unserem neuen Algorithmus zum Generieren von SuchvorschlĂ€gen fĂŒr endgĂŒltige Ziele erzĂ€hlen. Sie erfahren, wie aus einer scheinbar einfachen Aufgabe ein interessantes Szenario wurde, mit dessen Hilfe wir hoffentlich das Leben der Benutzer ein wenig einfacher gestalten konnten. Wir ĂŒberwachen die Arbeit des neuen Algorithmus weiterhin genau und werden ihn anschlieĂend optimieren, um die QualitĂ€t des Rankings auf einem hohen Niveau zu halten. FĂŒr alle Benutzer werden wir den Algorithmus in den nĂ€chsten Wochen starten, aber wir sind bereits bereit, ĂŒber den langen Weg zu sprechen, den wir von der Heuristik zum Algorithmus fĂŒr maschinelles Lernen zurĂŒckgelegt und in Betrieb genommen haben.
Ich denke, es lohnt sich, zunĂ€chst das ideale Weltbild eines Taxibestellungsszenarios aus Sicht der BenutzeroberflĂ€che zu beschreiben. Ich möchte, dass unsere Anwendung versteht, wo / wo / wann / mit welchem ââAuto der Benutzer abfahren möchte. In diesem Artikel sehen wir uns unsere Lösung an, um die "Wo" -Frage zu beantworten.
Eines der zentralen Elemente auf dem ersten Bildschirm (das der Benutzer nach dem Anmelden sieht) sind SuchvorschlĂ€ge. Im Geo-Suchteam nennen wir sie "sajest" (nach englischem Vorschlag)). Sie bieten dem Benutzer die endgĂŒltigen Routenadressen (âBâ -Punkte) aus seinem Reiseverlauf basierend auf der aktuellen Position der PIN (dh dem Ablagepunkt) und der Tageszeit, ohne eine Suchabfrage einzugeben. Wir versuchen dem Benutzer zu helfen, eine Bestellung "mit einem Klick" mit Hilfe von Sagests zu erstellen. In der aktuellen Version der iOS-Clientanwendung sehen die Sajests folgendermaĂen aus: Die Geosuche
aufgrund von Algorithmen zum Generieren von Suchergebnissen kann sich auf eine der wichtigsten Produktmetriken fĂŒr die Clientanwendung auswirken, z. B. auf die Zeit, die fĂŒr die Bestellung eines Taxis aufgewendet wurde ( Time to Order oder T2O ) Die Anzahl der Aktionen, die der Kunde ausgefĂŒhrt hat, um eine Bestellung zu erstellen ( Aktionen auf Bestellung oder A2O)). Aus diesem Grund haben wir uns entschlossen, einen Algorithmus zu entwickeln, der die wahrscheinlichsten Endpunkte der Route (Punkte "B") fĂŒr einen bestimmten Ort und eine bestimmte Tageszeit vorhersagt.
Heuristik
Einer der Backend-Entwickler des Geo-Search-Teams (vasilesk, hallo!) hat eine ziemlich einfache Heuristik zum Generieren von Sajests entwickelt, die sowohl fĂŒr den Startpunkt "A" als auch fĂŒr den Endpunkt "B" funktioniert. Es sollte sofort angemerkt werden, dass die Heuristik nicht mit dem Reiseverlauf des Benutzers, sondern mit dem Verlauf der Klicks auf Suchergebnisse funktioniert, was einige Probleme mit sich brachte. Diese Objekte nennen wir "Peaks" (aus dem Englischen. Die Auswahl ). Die Heuristik sah folgendermaĂen aus:
- FĂŒr den aktuellen Benutzer nehmen wir alle seine historischen Spitzen.
- Wir filtern sie und lassen diejenigen mit demselben Ziel (von / wo).
- , , 300 ( «» â 300 «», «» â 300 «»). , GPS- .
- , , , , , .
- , , 3:00 14:00, , .
- - (), , - .
- .
Dieser Algorithmus funktionierte eine Weile und war im Allgemeinen gut fĂŒr MVPs (wir werden etwas spĂ€ter ĂŒber Metriken sprechen), hatte aber eine Reihe von Nachteilen. Neben der eher primitiven Logik der Arbeit beruhte sie nicht auf Reisen, sondern auf den Empfehlungen des Benutzers. Aus diesem Grund erhielten Benutzer manchmal nicht offensichtliche Suchergebnisse. Aufgrund der "spezifischen" Art der Speicherung der Geschichte der Peaks war es auch ziemlich schwierig, schnelle Analysen durchzufĂŒhren. Auf dieser Grundlage haben wir uns entschlossen, maschinelles Lernen anzuwenden. Als nĂ€chstes werden wir die Formulierung von Ranking-Problemen betrachten und unser Problem auf eine binĂ€re Klassifikation reduzieren.
ErklÀrung zum Ranking-Problem
Bevor wir ĂŒber Funktionen, Metriken und ein Modell sprechen, mĂŒssen wir herausfinden, welche Art von Problem wir lösen möchten. Gehen wir iterativ vor und versuchen zunĂ€chst, eine allgemeine Formulierung des Ranking-Problems zu formulieren. Es sieht aus wie das:
- viele GegenstÀnde.
- Trainingsmuster.
- paarweise richtige Reihenfolge
Ziel: Aufbau einer Ranking-Funktion , mit welchem
Formulieren wir nun die Aufgabe, Suchergebnisse nach Abfragen zu ordnen. Es unterscheidet sich vom allgemeinen Ranking-Problem darin, dass anstelle der allgemeinen Menge von Objekten, die sortiert werden mĂŒssen, zwei Mengen angezeigt werden und - viele Dokumente und Anfragen.
- Sammlung von Dokumenten (Antworten).
- viele Anfragen.
- die durch die Abfrage q gefundenen Dokumente.
- Objekte sind Paare "Anfrage, Dokument":
- eine geordnete Reihe von Bewertungen (Ratings).
- Relevanzwerte.
Je höher die PunktzahlJe relevanter das Dokument Anfrage ...
Die richtige Reihenfolge wird nur zwischen den Dokumenten definiert, die von derselben Abfrage gefunden wurden::
Bei unserer Aufgabe, Routenendpunkte zu empfehlen, sind die Bewertungen binĂ€r. FĂŒr den Benutzer kann die vorgeschlagene Adresse entweder relevant oder irrelevant sein (ausgenommen FĂ€lle mit einer komplexen Route mit mehreren Endpunkten). Wenn wir die Aufgabe im Kontext des Benutzers betrachten, dann- eine Anfrage an den Dienst, die die ID , die geografische Position, das Datum und die Uhrzeit des Kunden enthĂ€lt ;- viele historische Endpunkte "B" fĂŒr die Reisen des Benutzers (wir machen nur VorschlĂ€ge basierend auf den Adressen vergangener Reisen). Und jede gĂŒltige Antwort auf Anfrage kann entweder fĂŒr den Benutzer relevant sein (ab dem aktuellen Zeitpunkt und zum aktuellen Zeitpunkt muss der Benutzer genau hierher gehen) oder irrelevant.
Der VollstĂ€ndigkeit halber muss nur der Prozess der Erstellung einer Stichprobe von Anforderungs-Antwort-Paaren mit einem Ziel beschrieben werden. Betrachten Sie der Einfachheit halber einen Kunden, der 5 Reisen hatte. Lassen Sie uns diese Reisen vom ersten bis zum letzten Rang einordnen. FĂŒr die erste Reise wissen wir nichts ĂŒber die Reisen des Benutzers, daher können wir ihm mit dem beschriebenen Algorithmus fĂŒr maschinelles Lernen keinen Sagest anbieten (die Heuristik fĂŒr neue Benutzer funktioniert hier). FĂŒr die zweite Reise kennen wir das endgĂŒltige Ziel von der ersten Reise und können dem Benutzer diese Adresse anbieten, wenn er das Nachbearbeitungsverfahren erfolgreich bestanden hat (mehr als 1 km vom aktuellen Standort entfernt, in derselben Region usw.). FĂŒr die dritte Reise haben wir möglicherweise bereits ein bis zwei mögliche Sadgets.wenn die Endadresse der zweiten Reise mit der Endadresse der ersten identisch war und wenn die Endadressen unterschiedlich waren. Wenn das Sajest mit dem Endpunkt "B" zusammenfiel (das heiĂt, es fiel in dasselbe Hex einer festen GröĂe), setzen wir 1 als Ziel, andernfalls - 0. Nach diesem Algorithmus bilden wir alle Arten von Paaren der Form "Anfrage - (mögliche) Antwort "FĂŒr jeden Kunden.
Daher haben wir das Ranking-Problem auf ein binĂ€res Klassifizierungsproblem reduziert. Jetzt können wir ĂŒber QualitĂ€tsbewertungsmetriken sprechen.
Metriken
Bei Ranking-Problemen eine Metrik, die den Anteil der richtigen Antworten aus Dokumenten anzeigt nach oben Rangliste auf Anfrage heiĂen Precision @ n . Wir sind an Precision @ 1/2/3 interessiert , da die gesamte Klickrate fĂŒr die ersten drei Positionen etwa 95% betrĂ€gt. Gleichzeitig gibt es nur eine korrekte Endadresse (natĂŒrlich, wenn der Benutzer eine Adresse aus seinem Verlauf abrufen möchte). Daher zeigt diese Metrik nur den Anteil der FĂ€lle an, in denen der korrekte Endpunkt "B" in die oberen 1/2/3 Adressen fĂ€llt, die schlug unseren Algorithmus vor.
Denken Sie daran, dass in unserem Problem - Relevanz, Ist die erforderliche Ranking-Funktion. Dann kann Precision @ n wie folgt geschrieben werden:
Schilder und Modell
Die Funktionen fĂŒr das Modell in unserem Problem können in mehrere Blöcke unterteilt werden:
- Nur fĂŒr Dokumente (Endadresse, Punkt "B").
- Nur auf Anfrage (Startadresse, Punkt "A").
- Gemeinsam anzufordern und zu dokumentieren (Route von "A" nach "B").
- Allgemein fĂŒr den Benutzer.
Hier sind einige Beispiele fĂŒr jeden von ihnen.
Beispiele fĂŒr Zeichen nur fĂŒr das Dokument (Punkt "B"):
- Anzahl der Fahrten zum Punkt "B" in den letzten K Tagen.
- Die Anzahl der Fahrten zum Punkt "B" nach Wochentag und Tageszeit.
- Wann war die vorherige Reise zu Punkt "B".
- Markieren Sie, dass die vorherige Reise zum Punkt "B" gemacht wurde.
- Ist Punkt "B" eine gewÀhlte Adresse / Zuhause / Arbeit.
Beispiele fĂŒr Merkmale nur auf Anfrage ( «» + /):
- , .
- «».
- «» K .
- «» .
- «» //.
- / .
- «».
, ( «» ââ):
- , .
- .
- .
:
- K .
- .
- Historische Reisestatistiken (Mittelwert, Quantile, mittlere Reisestrecke usw.).
Als Ergebnis haben wir mehr als 100 Funktionen erhalten, die ein Paar von "Anforderungsdokument" -Objekten beschreiben. Da wir Precision @ 1/2/3 maximieren möchten , ist es logisch, dass wir die Wahrscheinlichkeit einer Benutzerreise zu einem bestimmten Ziel vorhersagen und mögliche Kandidaten gemÀà der erhaltenen Wahrscheinlichkeit bewerten mĂŒssen. Wir haben verschiedene Algorithmen und verschiedene Verlustfunktionen ausprobiert und uns fĂŒr die Erhöhung des Gradienten auf BĂ€umen und den Logloss entschieden . Die Ergebnisse, die zum Zeitpunkt der Verwendung der Heuristik erhalten wurden:
| Heuristik | ML-Algorithmus | |
|---|---|---|
| PrÀzision @ 1 | 0,657 | 0,789 |
| PrÀzision @ 2 | 0,719 | 0,872 |
| PrÀzision @ 3 | 0,761 | 0,923 |
Produktion
Bevor Sie einige komplexe Algorithmen, Funktionen und Trainingsmodelle entwickeln, mĂŒssen Sie sich natĂŒrlich ĂŒberlegen, wie dies alles im Kampf unter Last funktioniert, ohne die Skalierung zu vergessen. Nachdem wir uns mit dem Backend-Entwicklungsteam getroffen hatten, skizzierten wir einen groben Ăberblick darĂŒber, wie unser Service aussehen sollte. Wir haben uns entschlossen, das trainierte Modell fĂŒr maschinelles Lernen in das asynchrone Webframework Sanic zu integrieren, an die der Suchdienst Anfragen sendet. ZusĂ€tzlich zur vertikalen Skalierung haben wir die Möglichkeit implementiert, auf mehreren Computern bereitzustellen. Anforderungen an den Dienst werden an die URL des Load Balancers gesendet, und anschlieĂend erfolgt ein Proxy an diesen oder jenen Computer mithilfe des Round-Robin-Algorithmus. Nach der Implementierung des ersten Prototyps des Dienstes haben wir festgestellt, dass wir das Abfragevolumen in MySQL erheblich reduzieren können. Da jede Verschiebung des Pins mit der Wahl des Einspeisepunkts eine neue Suchanforderung darstellt und daher fĂŒr unseren Service, dachten wir, wir könnten ab dem Moment der Anforderung an Redis einen Cache mit dem Reiseverlauf des Benutzers fĂŒr N Minuten speichern . Dank dessen haben wir die Belastung der Basis um das Dreifache reduziert. Infolgedessen kann das Dienstschema wie folgt dargestellt werden:
Wir speichern Anfragen an den Service und seine Antworten in ElasticSearch und ĂŒbertragen und ĂŒberwachen Metriken, die fĂŒr die StabilitĂ€t der Arbeit in NewRelic verantwortlich sind.
Der allgemeine Arbeitsablauf unseres Service:
- Der Suchdienst sendet eine Anfrage an den Suchhinweisdienst.
- Der Balancer wÀhlt eine der Maschinen aus und sendet diese Anfrage an diese.
- Innerhalb des Computers wird die Anforderung an einen der offenen Mitarbeiter gesendet oder in die Warteschlange gestellt.
- Im Inneren des Arbeiters:
- Wir validieren die eingehende Anfrage.
- Wir stellen in Redis eine Anfrage. Wenn fĂŒr den Benutzer keine Bestellhistorie vorhanden ist, gehen wir zu MySQL und schreiben die empfangenen Daten in Redis.
- Wir fĂŒhren eine grundlegende Datenvorverarbeitung durch und sammeln Funktionen fĂŒr das Modell.
- Wir machen es
predict_proba()nach allen generierten Sadges und sortieren sie nach "Wahrscheinlichkeit". - Wir fĂŒhren eine zusĂ€tzliche Nachbearbeitung der Daten durch und bilden die Antwort.
- Wir senden die Antwort an den Suchdienst zurĂŒck.
Was weiter?
Jetzt testen wir unser Modell aktiv mithilfe von Switchback-Tests, um anschlieĂend Schlussfolgerungen zu ziehen und zusĂ€tzliche Add-Ons in den Algorithmus zu implementieren, um die Ranking-QualitĂ€t zu verbessern. In Zukunft werden wir versuchen, dem Modell zusĂ€tzliche Funktionen hinzuzufĂŒgen und gemeinsam mit den Produktdesignern eine neue Lösung fĂŒr die "Anzeige" von Sagests vorzubereiten. NatĂŒrlich wĂ€re es groĂartig, wenn unsere Anwendung selbst verstehen wĂŒrde, wo / wann / wo / mit welchem ââAuto der Benutzer abfahren möchte. Wir arbeiten in alle Richtungen, damit eine Taxibestellung wirklich mit einem Klick erfolgt.