
Basierend auf meinen Vorträgen bei Highload++ und DataFest Minsk 2019.
Für viele Menschen ist die E-Mail heute ein unverzichtbarer Bestandteil des Lebens im Internet. Mit ihrer Hilfe führen wir geschäftliche Korrespondenz, speichern verschiedene wichtige Informationen in Zusammenhang mit Finanzen, Hotelbuchungen, Bestellungen und vielem mehr. Mitte 2018 haben wir eine Produktstrategie für die Entwicklung der E-Mail formuliert. Wie sollte eine moderne E-Mail aussehen?
Die E-Mail muss intelligent, das heißt, sie soll den Nutzern helfen, sich im wachsenden Informationsvolumen zurechtzufinden: filtern, strukturieren und diese auf die bequemste Art bereitstellen. Sie sollte nützlich, indem sie es ermöglicht, direkt im Posteingang verschiedene Aufgaben zu erledigen, wie zum Beispiel Bußgelder zu bezahlen (eine Funktion, die ich leider oft nutze). Und dabei sollte die E-Mail natürlich auch Informationsschutz gewährleisten, Spam filtern und vor Hacks schützen, sprich sie muss sicher.
Diese Richtungen definieren eine Reihe von Schlüsselaufgaben, von denen viele effektiv mit Hilfe von maschinellem Lernen gelöst werden können. Hier sind Beispiele für bereits implementierte Funktionen, die im Rahmen der Strategie entwickelt wurden – jeweils eine für jede Richtung.
- Smart Reply. In der E-Mail gibt es die Funktion für intelligente Antworten. Das neuronale Netzwerk analysiert den Text der E-Mail, versteht ihren Sinn und Zweck, und schlägt daraufhin drei am besten passenden Antwortmöglichkeiten vor: positiv, negativ und neutral. Dies hilft erheblich, Zeit beim Beantworten von E-Mails zu sparen und oft ungewöhnliche und unterhaltsame Antworten zu geben.
- Gruppierung von E-Mails, die mit Bestellungen in Online-Shops verbunden sind. Wir kaufen oft online ein, und in der Regel können die Geschäfte mehrere E-Mails für jede Bestellung senden. Beispielsweise von AliExpress, dem größten Service, kommen sehr viele E-Mails für eine Bestellung, und wir haben festgestellt, dass in extremen Fällen deren Anzahl bis zu 29 betragen kann. Daher extrahieren wir mithilfe des Modells zur Erkennung benannter Entitäten die Bestellnummer und andere Informationen aus dem Text und gruppieren alle E-Mails in einem Thread. Zudem zeigen wir die wichtigsten Informationen zur Bestellung in einem separaten Feld an, was die Bearbeitung dieser Art von E-Mails erleichtert.

- Antiphishing. Phishing ist eine besonders gefährliche Art von Betrugsmails, mit denen Angreifer versuchen, an finanzielle Informationen (einschließlich der Bankkarten des Nutzers) und Logins zu gelangen. Solche Mails imitieren echte von Dienstanbietern versandte Mails, auch visuell. Daher erkennen wir mithilfe von Computer Vision die Logos und das Design von Mails großer Unternehmen (zum Beispiel Mail.ru, Sber, Alfa) und berücksichtigen diese zusammen mit dem Text und anderen Merkmalen in unseren Spam- und Phishing-Klassifikatoren.
Maschinelles Lernen
Ein wenig über maschinelles Lernen im E-Mail-Bereich insgesamt. E-Mail ist ein hochbelastetes System: Über unsere Server gehen durchschnittlich täglich 1,5 Milliarden Mails für 30 Millionen DAU-Nutzer. Alle notwendigen Funktionen und Features werden von etwa 30 maschinellen Lernsystemen unterstützt.
Jede E-Mail durchläuft eine umfassende Klassifikationspipeline. Zuerst filtern wir Spam heraus und behalten gute Mails. Nutzer bemerken oft nicht, wie das Antispam-System arbeitet, da 95-99 % des Spams nicht einmal im entsprechenden Ordner landen. Die Spam-Erkennung ist ein sehr wichtiger und gleichzeitig der komplexeste Teil unseres Systems, da im Bereich Antispam eine ständige Anpassung zwischen Schutzsystemen und Angriffen stattfindet, was eine kontinuierliche ingenieurtechnische Herausforderung für unser Team darstellt.
Anschließend trennen wir Mails von Menschen und Bots. Mails von Menschen sind am wichtigsten, deshalb bieten wir für sie Funktionen wie Smart Reply an. Mails von Bots werden in zwei Kategorien unterteilt: Transaktionsmails – wichtige Mails von Diensten, wie Bestell- oder Hotelbuchungsbestätigungen, Finanzen – und Informationsmails – Werbung von Unternehmen, Rabatte.
Wir sind der Meinung, dass Transaktionsmails in ihrer Bedeutung der persönlichen Korrespondenz gleichwertig sind. Sie sollten stets griffbereit sein, da es oft notwendig ist, schnell Informationen über Bestellungen oder Flugbuchungen zu finden, und dabei verbringen wir Zeit mit der Suche nach diesen Mails. Daher teilen wir sie zur Vereinfachung automatisch in sechs Hauptkategorien ein: Reisen, Bestellungen, Finanzen, Tickets, Registrierungen und schließlich Strafen.
Informationsschreiben sind die zahlreichste und wahrscheinlich auch weniger wichtige Gruppe, die keine sofortige Reaktion erfordert, da sich im Leben des Nutzers nichts Wesentliches ändert, wenn er ein solches Schreiben nicht liest. In unserem neuen Interface fassen wir sie in zwei Threads zusammen: soziale Netzwerke und Newsletter, wodurch wir den Posteingang visuell aufräumen und nur die wichtigen E-Mails im Blick behalten.

Betrieb
Eine große Anzahl von Systemen bringt viele Schwierigkeiten im Betrieb mit sich. Schließlich degradiert jede Modell im Laufe der Zeit, wie jede Software: Merkmale fallen aus, Maschinen versagen, es entsteht fehlerhafter Code. Zudem ändern sich ständig die Daten: neue werden hinzugefügt, das Nutzerverhalten verändert sich usw., sodass ein Modell ohne die nötige Unterstützung im Laufe der Zeit immer schlechter funktioniert.
Man darf auch nicht vergessen, dass je tiefer maschinelles Lernen in das Leben der Nutzer eindringt, desto größere Auswirkungen sie auf das Ökosystem haben, und infolgedessen desto mehr finanzielle Verluste oder Gewinne die Akteure auf dem Markt erzielen können. Daher passen sich in immer mehr Bereichen die Akteure an die Arbeit mit ML-Algorithmen an (klassische Beispiele sind Werbung, Suche und das bereits erwähnte Antispam).
Zudem weisen die Aufgaben des maschinellen Lernens eine Besonderheit auf: Jede, auch noch so unbedeutende, Änderung im System kann viel Arbeit mit sich bringen: Datenarbeit, Neuausbildung, Deployment, was Wochen oder Monate in Anspruch nehmen kann. Deshalb erfordert es immer mehr Aufwand, je schneller sich die Umgebung verändert, in der Ihre Modelle operieren. Ein Team kann viele Systeme erstellen und sich darüber freuen, danach aber nahezu alle Ressourcen für deren Unterstützung aufwenden, ohne die Möglichkeit, etwas Neues zu machen. Mit einer solchen Situation sind wir einmal im Antispam-Team konfrontiert worden und haben die offensichtliche Schlussfolgerung gezogen, dass die Wartung automatisiert werden muss.
Automatisierung
Was kann automatisiert werden? Tatsächlich fast alles. Ich habe vier Bereiche identifiziert, die die Infrastruktur des maschinellen Lernens bestimmen:
- Datensammlung;
- Nachbesserung;
- Deployment;
- Testen & Überwachung.
Wenn die Umgebung instabil und ständig im Wandel ist, ist die gesamte Infrastruktur um das Modell herum viel wichtiger als das Modell selbst. Es kann ein altbewährter linearer Klassifizierer sein, aber wenn die Merkmale richtig bereitgestellt und ein gutes Feedback von den Benutzern integriert wird, funktioniert er viel besser als State-Of-The-Art-Modelle mit all den Spielereien.
Feedback-Schleife
Dieser Zyklus umfasst die Datensammlung, das Fine-Tuning und das Deployment – im Grunde den gesamten Aktualisierungszyklus des Modells. Warum ist das wichtig? Schauen Sie sich das Diagramm der Registrierungen im E-Mail-Dienst an:

Der Machine Learning-Entwickler hat ein Anti-Bot-Modell implementiert, das Bots daran hindert, sich im E-Mail-Dienst zu registrieren. Das Diagramm fällt auf einen Wert, bei dem nur echte Benutzer übrig bleiben. Alles ist großartig! Aber nach vier Stunden optimieren die Bot-Betreiber ihre Skripte, und alles kehrt zur Normalität zurück. Der Entwickler hat einen Monat dafür verwendet, Merkmale hinzuzufügen und das Modell weiterzubilden, aber der Spammer konnte sich innerhalb von vier Stunden anpassen.
Um zu vermeiden, dass es so schmerzhaft ist und wir alles später neu machen müssen, müssen wir zu Beginn darüber nachdenken, wie die Feedback-Schleife aussehen wird und was wir tun werden, falls sich die Umgebung ändert. Lassen Sie uns mit der Datensammlung beginnen – das ist der Treibstoff für unsere Algorithmen.
Datensammlung
Es ist klar, dass moderne neuronale Netze je mehr Daten sie haben, umso besser funktionieren, und diese werden in der Regel von den Benutzern des Produkts generiert. Benutzer können uns helfen, Daten zu kennzeichnen, aber wir dürfen das nicht übertreiben, denn irgendwann werden die Benutzer es leid sein, Ihre Modelle weiterzubilden, und sie werden zu einem anderen Produkt wechseln.
Einer der häufigsten Fehler (hier beziehe ich mich auf Andrew Ng) ist die zu starke Ausrichtung auf Metriken des Testdatensatzes anstatt auf das Feedback der Benutzer, welches tatsächlich das wichtigste Maß für die Qualität der Arbeit darstellt, da wir ein Produkt für den Benutzer schaffen. Wenn der Benutzer die Arbeitsweise des Modells nicht versteht oder nicht mag, ist alles umsonst.
Deshalb sollte der Benutzer immer die Möglichkeit haben, abzustimmen, und wir sollten ihm ein Werkzeug für das Feedback geben. Wenn wir glauben, dass eine E-Mail, die im Posteingang angekommen ist, etwas mit Finanzen zu tun hat, sollten wir sie mit „Finanzen“ kennzeichnen und einen Knopf zeichnen, den der Benutzer drücken kann, um zu sagen, dass es keine Finanzen sind.
Qualität des Feedbacks
Lass uns über die Qualität des Benutzerfeedbacks sprechen. Erstens kann es sein, dass du und der Benutzer unterschiedliche Bedeutungen in ein und dasselbe Konzept legen. Zum Beispiel meint ihr mit den Produktmanagern, dass "Finanzen" Briefe von der Bank sind, während der Benutzer denkt, dass auch ein Brief von der Großmutter über die Rente zu den Finanzen zählt. Zweitens gibt es Benutzer, die ohne nachzudenken auf Knöpfe klicken, ohne jegliche Logik. Drittens kann der Benutzer in seinen Schlussfolgerungen tief im Irrtum sein. Ein anschauliches Beispiel aus unserer Praxis ist die Implementierung eines Klassifikators , einer recht amüsanten Spam-Art, bei der dem Benutzer angeboten wird, mehrere Millionen Dollar von einem plötzlich gefundenen entfernten Verwandten in Afrika zu kassieren. Nach der Implementierung dieses Klassifikators haben wir die Klicks auf "Kein Spam" für diese Briefe überprüft und herausgefunden, dass 80 % davon klarer nigerianischer Spam sind, was darauf hinweist, dass die Benutzer äußerst gutgläubig sein können.
Und wir dürfen nicht vergessen, dass nicht nur Menschen auf die Knöpfe klicken können, sondern auch verschiedene Bots, die sich als Browser ausgeben. Daher ist rohes Feedback nicht geeignet für das Training. Was kann man mit diesen Informationen tun?
Wir verwenden zwei Ansätze:
- Feedback von verbundenem ML. Zum Beispiel haben wir ein Online-Antibot-System, das, wie ich bereits erwähnt habe, schnell Entscheidungen auf Basis einer begrenzten Anzahl von Merkmalen trifft. Es gibt ein zweites, langsameres System, das im Nachhinein arbeitet. Es hat mehr Daten über den Benutzer, sein Verhalten usw. Folglich wird die am besten abgewogene Entscheidung getroffen, und es hat daher eine höhere Genauigkeit und Vollständigkeit. Wir können die Unterschiede zwischen diesen Systemen als Trainingsdaten für das erste System verwenden. Auf diese Weise wird das einfachere System stets versuchen, sich der Leistung des komplizierteren Systems anzunähern.
- Klassifikation der Klicks. Man kann jeden Klick des Benutzers einfach klassifizieren, seine Validität und Verwendbarkeit bewerten. So machen wir es im E-Mail-Antispam, indem wir Merkmale des Benutzers, seine Historie, Merkmale des Absenders, den Text selbst und die Ergebnisse der Klassifikatoren verwenden. Am Ende erhalten wir ein automatisches System, das das Benutzer-Feedback validiert. Und da es seltener weiter trainiert werden muss, kann seine Arbeit die Grundlage für alle anderen Systeme werden. Der Hauptfokus in diesem Modell liegt auf Präzision, da das Trainieren des Modells mit ungenauen Daten schwerwiegende Folgen haben kann.
Während wir die Daten bereinigen und unsere ML-Systeme weiter trainieren, dürfen wir die Benutzer nicht vergessen, denn für uns sind tausende, Millionen Fehler in einem Diagramm nur Statistik, während jeder Fehler für den Benutzer eine Tragödie ist. Neben der Tatsache, dass der Benutzer mit Ihrem Fehler im Produkt leben muss, erwartet er nach seinem Feedback, dass eine ähnliche Situation in der Zukunft ausgeschlossen wird. Daher sollten Benutzer nicht nur die Möglichkeit erhalten, abzustimmen, sondern auch das Verhalten der ML-Systeme anzupassen, indem sie beispielsweise persönliche Heuristiken für jeden Klick des Feedbacks erstellen; im Fall von E-Mails könnte dies die Möglichkeit sein, ähnliche E-Mails nach Absender und Betreff für diesen Benutzer zu filtern.
Zusätzlich muss man basierend auf Berichten oder Anfragen an den Support in einem halbautomatischen oder manuellen Modus das Modell anpassen, damit auch andere Benutzer nicht unter ähnlichen Problemen leiden.
Heuristiken für das Training
Mit diesen Heuristiken und Anpassungen gibt es zwei Probleme. Erstens ist die ständig wachsende Anzahl an Anpassungen schwer aufrechtzuerhalten, ganz zu schweigen von ihrer Qualität und ihrer langfristigen Funktionalität. Das zweite Problem besteht darin, dass ein Fehler nicht häufig vorkommen kann, und einige Klicks zum Nachtrainieren des Modells möglicherweise nicht ausreichen. Es scheint, als könnten diese beiden nicht miteinander verbundenen Effekte erheblich gemildert werden, wenn man den folgenden Ansatz anwendet.
- Erstellen wir eine temporäre Anpassung.
- Leiten wir die Daten von dieser Anpassung in das Modell, es wird regelmäßig weiter trainiert, auch anhand der erhaltenen Daten. Hier ist es selbstverständlich wichtig, dass die Heuristik eine hohe Genauigkeit aufweist, um die Qualität der Daten im Trainingsset nicht zu mindern.
- Dann richten wir das Monitoring auf das Auslösen des Workarounds ein, und wenn dieser nach einiger Zeit nicht mehr ausgelöst wird und vollständig durch das Modell abgedeckt ist, kann er ohne Bedenken entfernt werden. Dieses Problem wird sich nun wohl kaum wiederholen.
Die Armee der Workarounds ist also sehr nützlich. Wichtig ist, dass ihre Nutzung vorübergehend und nicht dauerhaft ist.
Nachtraining
Nachtraining ist der Prozess des Hinzufügens neuer Daten, die aus dem Feedback von Nutzern oder anderen Systemen stammen, und des Trainings des bestehenden Modells auf diesen Daten. Mit dem Nachtraining können verschiedene Probleme auftreten:
- Das Modell unterstützt möglicherweise einfach kein Nachtraining und kann nur von Grund auf neu lernen.
- Nirgendwo in dem Buch der Natur steht geschrieben, dass Nachtraining die Qualität der Arbeit in der Produktion unbedingt verbessern wird. Oft geschieht das Gegenteil, das heißt, es kann nur zu einer Verschlechterung kommen.
- Die Veränderungen können unvorhersehbar sein. Das ist ein ziemlich heikler Punkt, den wir für uns festgestellt haben. Selbst wenn das neue Modell im A/B-Test ähnliche Ergebnisse wie das aktuelle liefert, bedeutet das nicht, dass es genauso funktioniert. Ihre Leistung kann sich in einem einzigen Prozentpunkt unterscheiden, was neue Fehler bringen oder bereits behobene alte zurückbringen kann. Mit den aktuellen Fehlern können wir und die Nutzer bereits leben, und wenn eine große Anzahl neuer Fehler auftritt, kann der Nutzer auch nicht verstehen, was passiert, da er ein vorhersehbares Verhalten erwartet.
Deshalb ist das Wichtigste beim Nachtraining, das Modell garantiert zu verbessern oder es zumindest nicht zu verschlechtern.
Das erste, was einem in den Sinn kommt, wenn wir über Nachtraining sprechen, ist der Ansatz des aktiven Lernens. Was bedeutet das? Zum Beispiel erkennt ein Klassifikator, ob ein Schreiben zu Finanzen gehört, und wir fügen um seine Entscheidungsgrenze eine Stichprobe aus gekennzeichneten Beispielen hinzu. Das funktioniert gut, zum Beispiel in der Werbung, wo es z sehr viel Feedback gibt und das Modell im Online-Modus trainiert werden kann. Wenn es jedoch wenig Feedback gibt, erhalten wir eine stark verzerrte Stichprobe im Vergleich zur Produktionsverteilung der Daten, auf deren Grundlage das Verhalten des Modells im Betrieb nicht bewertet werden kann.

Tatsächlich ist unser Ziel, alte Muster, bereits bekannte Modelle zu bewahren und neue zu erwerben. Hier ist Kontinuität wichtig. Das Modell, das wir oft mit großer Mühe herausgebracht haben, funktioniert bereits, weshalb wir uns an seinen Leistungen orientieren können.
In der Mail werden verschiedene Modelle angewendet: Bäume, lineare Modelle, neuronale Netzwerke. Für jedes erstellen wir unseren eigenen Feinabgleichungsalgorithmus. Im Prozess der Feinabstimmung erhalten wir nicht nur neue Daten, sondern auch oft neue Merkmale, die wir in allen nachfolgenden Algorithmen berücksichtigen werden.
Lineare Modelle
Angenommen, wir haben eine logistische Regression. Wir stellen den Verlust der Modell-Performance aus folgenden Komponenten zusammen:
- LogLoss auf neuen Daten;
- wir regularisieren die Gewichte neuer Merkmale (alte lassen wir unberührt);
- wir lernen auch mit alten Daten, um die alten Muster zu bewahren;
- und, vielleicht am wichtigsten: wir hängen eine harmonische Regularisierung an, die garantiert, dass die Gewichte im Vergleich zum alten Modell nur geringfügig verändert werden.
Da jede Verlustkomponente Koeffizienten hat, können wir die optimalen Werte für unsere Aufgabe beim Cross-Validation oder basierend auf Produktanforderungen anpassen.

Bäume
Kommen wir zu Entscheidungsbäumen. Wir haben den folgenden Algorithmus für die Feinabstimmung der Bäume entwickelt:
- In der Produktion arbeitet ein Wald aus 100–300 Bäumen, der auf dem alten Datensatz trainiert wurde.
- Am Ende entfernen wir M = 5 Bäume und fügen 2M = 10 neue hinzu, die auf dem gesamten Datensatz trainiert wurden, aber mit hohem Gewicht auf neuen Daten, was natürlich eine inkrementelle Änderung des Modells gewährleistet.
Offensichtlich erhöht sich im Laufe der Zeit die Anzahl der Bäume erheblich, und sie müssen regelmäßig reduziert werden, um im Zeitrahmen zu bleiben. Dafür verwenden wir den derzeit sehr verbreiteten Ansatz der Wissen-Destillation (KD). Kurz dabeizutragen, wie es funktioniert.
- Wir haben ein aktuelles „komplexes“ Modell. Wir führen es auf dem Trainingsdatensatz aus und erhalten eine Verteilung der Klassenwahrscheinlichkeiten als Ausgabe.
- Dann schulen wir das Schüler-Modell (in diesem Fall ein Modell mit weniger Bäumen), um die Ergebnisse des Modells zu wiederholen, indem wir die Klassenverteilung als Zielvariable verwenden.
- Es ist wichtig zu erwähnen, dass wir das Layout des Datensatzes nicht verwenden und daher beliebige Daten verwenden können. Selbstverständlich nutzen wir eine Stichprobe von Daten aus einem produktiven Stream als Trainingsdatensatz für das Schüler-Modell. So ermöglicht der Trainingssatz eine genaue Modellierung, während die Stichprobe des Streams eine ähnliche Leistung in der Produktionsverteilung gewährleistet und die Verzerrung des Trainingssatzes ausgleicht.

Die Kombination dieser beiden Methoden (Hinzufügen von Bäumen und gelegentliches Reduzieren ihrer Anzahl durch Knowledge Distillation) sorgt dafür, dass neue Muster eingeführt werden und eine vollständige Nachfolge gewährleistet ist.
Mit KD führen wir auch Unterscheidungen bei den Merkmalsoperationen des Modells durch, wie z. B. das Entfernen von Merkmalen und das Arbeiten mit Ausfällen. In unserem Fall haben wir eine Reihe wichtiger statistischer Merkmale (von Absendern, Text-Hashes, URLs usw.), die in einer Datenbank gespeichert sind, die Ausfall-Charakteristika aufweist. Auf solche Entwicklungen ist das Modell natürlich nicht vorbereitet, da im Trainingssatz keine Ausfallsituationen vorkommen. In solchen Fällen kombinieren wir KD-Techniken und Augmentation: Beim Training für Teile der Daten entfernen oder setzen wir erforderliche Merkmale auf null, während wir die ursprünglichen Labels (Ausgaben des aktuellen Modells) verwenden. Das Schüler-Modell lernt, diese Verteilung zu wiederholen.

Wir haben festgestellt, dass je schwerwiegender die Manipulation der Modelle ist, desto mehr Stichproben aus dem Stream prozentual benötigt werden.
Für das Entfernen von Merkmalen, der einfachsten Operation, wird nur ein kleiner Teil des Streams benötigt, da sich nur ein paar Merkmale ändern und das aktuelle Modell auf demselben Satz trainiert wurde – der Unterschied ist minimal. Um das Modell zu vereinfachen (die Anzahl der Bäume um ein Vielfaches zu reduzieren), werden bereits 50 zu 50 benötigt. Und für Ausfälle wichtiger statistischer Merkmale, die die Leistung des Modells erheblich beeinflussen, sind noch mehr Daten erforderlich, um die Funktionalität des neuen, ausfallsicheren Modells bei allen Arten von Nachrichten auszugleichen.

FastText
Lassen Sie uns zu FastText übergehen. Ich erinnere daran, dass die Wortdarstellung (Embedding) aus der Summe des Embeddings des Wortes selbst und aller seiner Buchstaben-N-Gramme besteht, üblicherweise Trigrammen. Da es viele Trigramme geben kann, wird Bucket Hashing verwendet, das heißt, die Umwandlung des gesamten Raums in eine feste Hashmap. Am Ende erhält die Gewichtsmatrix die Dimension des inneren Schichtengegenstandes multipliziert mit der Anzahl der Wörter plus Buckets.
Beim Feintuning entstehen neue Merkmale: Wörter und Trigramme. Im Standard-Feintuning von Facebook passiert nichts Außergewöhnliches. Nur die alten Gewichte werden mit Kreuzentropie auf den neuen Daten angepasst. Somit werden die neuen Merkmale nicht genutzt, und dieser Ansatz weist alle zuvor beschriebenen Nachteile auf, die mit der Unvorhersehbarkeit des Modells in der Produktion verbunden sind. Daher haben wir FastText etwas verbessert. Wir fügen alle neuen Gewichte (Wörter und Trigramme) hinzu, trainieren die gesamte Matrix mit Kreuzentropie nach und fügen eine harmonische Regularisierung analog zum linearen Modell hinzu, die eine unerhebliche Änderung der alten Gewichte garantiert.

CNN
Mit Convolutional Neural Networks ist es etwas komplizierter. Wenn im CNN die letzten Schichten nachtrainiert werden, kann natürlich harmonische Regularisierung angewendet werden, und die Kontinuität kann garantiert werden. Wenn jedoch das gesamte Netzwerk nachtrainiert werden muss, lässt sich eine solche Regularisierung nicht auf alle Schichten anwenden. Es gibt jedoch die Möglichkeit, komplementäre Embeddings über Triplet Loss zu trainieren ().
Triplet Loss
Am Beispiel der Anti-Phishing-Aufgabe werden wir Triplet Loss im Großen und Ganzen besprechen. Wir nehmen unser Logo sowie positive und negative Beispiele von Logos anderer Unternehmen. Wir minimieren den Abstand zwischen den ersten und maximieren den Abstand zwischen den zweiten, wobei wir einen kleinen Spielraum lassen, um eine größere Kompaktheit der Klassen zu gewährleisten.

Wenn wir das Netzwerk weiter trainieren, ändert sich unser metrischer Raum vollständig, und er wird absolut inkompatibel mit dem vorherigen. Dies ist ein ernsthaftes Problem bei Aufgaben, die Vektoren verwenden. Um dieses Problem zu umgehen, werden wir während des Trainings alte Embeddings hinzufügen.
Wir haben neue Daten in das Trainingsset hinzugefügt und schulen die zweite Version des Modells von Grund auf. In der zweiten Phase verfeinern wir unser Netzwerk (Finetuning): Zuerst wird die letzte Schicht weitertrainiert, dann wird das gesamte Netzwerk wieder freigegeben. Bei der Erstellung der Triplets berechnen wir nur einen Teil der Embeddings mit dem trainierbaren Modell, während die anderen mit dem alten Modell erstellt werden. So stellen wir während des Verfeinerungsprozesses die Kompatibilität der metrischen Räume v1 und v2 sicher. Eine spezielle Art der harmonischen Regularisierung.

Die gesamte Architektur
Betrachtet man das gesamte System am Beispiel von Anti-Spam, sind die Modelle nicht isoliert, sondern ineinander geschachtelt. Wir nehmen Bilder, Text und andere Merkmale und erhalten mithilfe von CNN und Fast Text Embeddings. Darüber werden Klassifizierer angewendet, die Scores für verschiedene Klassen ausgeben (E-Mail-Typen, Spam, Vorhandensein eines Logos). Die Scores und Merkmale gelangen dann in einen Wald von Entscheidungsbäumen zur endgültigen Entscheidungsfindung. Einzelne Klassifizierer in diesem Schema ermöglichen eine bessere Interpretation der Ergebnisse des Systems und eine gezielte Nachschulung der Komponenten im Falle von Problemen, anstatt alle Daten in roher Form in die Entscheidungsbäume einzuspeisen.

Letztendlich garantieren wir die Nachvollziehbarkeit auf jeder Ebene. Auf der untersten Ebene in CNN und Fast Text nutzen wir harmonische Regularisierung, und für die Klassifizierer in der Mitte ebenfalls harmonische Regularisierung und Kalibrierung der Scores zur Kompatibilität der Wahrscheinlichkeitsverteilungen. Das Boosting der Bäume wird inkrementell oder mithilfe von Knowledge Distillation trainiert.
Insgesamt bedeutet die Unterstützung eines solchen geschachtelten Systems des maschinellen Lernens normalerweise einen großen Aufwand, da jede Komponente auf der unteren Ebene zu einem Update des gesamten Systems darüber führt. Da jedoch in unserem Setup jede Komponente nur geringfügig geändert wird und mit der vorherigen kompatibel ist, kann das gesamte System in Teilen aktualisiert werden, ohne dass die gesamte Struktur neu trainiert werden muss, was es ermöglicht, die Unterstützung ohne ernsthafte Überlastung aufrechtzuerhalten.
Bereitstellung
Wir haben die Datensammlung und das Nachtrainieren verschiedener Modelltypen behandelt, daher gehen wir nun zu ihrem Deployment in die Produktionsumgebung über.
A/B-Testing
Wie ich bereits früher sagte, erhalten wir beim Datensammeln in der Regel eine verzerrte Stichprobe, anhand derer die Produktionsleistung des Modells nicht bewertet werden kann. Daher ist es bei der Bereitstellung des Modells unbedingt erforderlich, es mit der vorherigen Version zu vergleichen, um zu verstehen, wie es tatsächlich läuft, d. h. A/B-Tests durchzuführen. Tatsächlich ist der Rollout-Prozess und die Analyse der Grafiken ziemlich routinemäßig und lässt sich hervorragend automatisieren. Wir rollen unsere Modelle schrittweise für 5 %, 30 %, 50 % und 100 % der Benutzer aus und sammeln dabei alle verfügbaren Metriken zu den Modellantworten und dem Feedback der Benutzer. Bei ernsthaften Ausreißern rollen wir das Modell automatisch zurück, während wir in anderen Fällen, nachdem wir eine ausreichende Anzahl von Benutzeranfragen gesammelt haben, eine Entscheidung über die Erhöhung des Prozentsatzes treffen. Letztendlich bringen wir das neue Modell vollständig automatisiert auf 50 % der Benutzer, während der Rollout auf das gesamte Publikum von einer Person genehmigt wird, obwohl auch dieser Schritt automatisiert werden kann.
Allerdings bietet der Prozess der A/B-Tests Optimierungsmöglichkeiten. Das Problem ist, dass jeder A/B-Test recht langwierig ist (in unserem Fall dauert er je nach Feedback zwischen 6 und 24 Stunden), was ihn ziemlich kostspielig und ressourcenintensiv macht. Darüber hinaus ist ein ausreichender Prozentsatz des Verkehrs für den Test erforderlich, um die Gesamtzeit des A/B-Tests zu verkürzen (eine statistisch signifikante Stichprobe zur Bewertung von Metriken bei einem niedrigen Prozentsatz zu sammeln, kann sehr lange dauern), was die Anzahl der A/B-Slots äußerst begrenzt. Offensichtlich müssen wir nur die vielversprechendsten Modelle in den Test bringen, die wir im Prozess des Feintunings in großer Anzahl erhalten.
Um dieses Problem zu lösen, haben wir einen separaten Klassifikator trainiert, der den Erfolg des A/B-Tests vorhersagt. Dazu verwenden wir Entscheidungsstatistik, Precision, Recall und andere Metriken aus dem Trainingsdatensatz, dem Validierungsdatensatz und einer Stichprobe aus dem Verkehrsstrom. Außerdem vergleichen wir das Modell mit dem aktuellen Produktionsmodell, mit Heuristiken, und berücksichtigen die Komplexität des Modells. Unter Verwendung all dieser Merkmale bewertet der auf der Testhistorie trainierte Klassifikator die Kandidatenmodelle, in unserem Fall Entscheidungsbäume, und entscheidet, welches von ihnen in den A/B-Test aufgenommen wird.

Bei der Einführung ermöglichte dieser Ansatz eine mehrfache Steigerung der Anzahl erfolgreicher A/B-Tests.
Testen & Überwachen
Testen und Überwachen schaden, wie man denkt, nicht unserer Gesundheit; im Gegenteil, sie verbessern sie und befreien uns von unnötigem Stress. Testen ermöglicht es, Ausfälle zu verhindern, während Überwachen dazu dient, diese rechtzeitig zu erkennen, um die Auswirkungen auf die Nutzer zu minimieren.
Hier ist es wichtig zu verstehen, dass Ihr System früher oder später immer Fehler machen wird – das ist mit dem Entwicklungszyklus jeder Software verbunden. Zu Beginn der Systementwicklung gibt es immer viele Bugs, bis alles stabilisiert ist und der Hauptteil der Neuerungen abgeschlossen ist. Mit der Zeit erhöht sich jedoch die Entropie, und Fehler treten erneut auf – aufgrund der Degradierung der umgebenden Komponenten und der sich ändernden Daten, von denen ich zu Beginn sprach.
Hier möchte ich anmerken, dass jedes maschinelle Lernsystem aus der Sicht seines Nutzens über den gesamten Lebenszyklus betrachtet werden muss. Die Grafik zeigt ein Beispiel für die Funktionsweise eines Systems zur Erkennung einer seltenen Art von Spam (auf der Grafik liegt die Linie nahe null). Einmal hat es wegen eines falsch zwischengespeicherten Merkmals verrückt gespielt. Unglücklicherweise gab es kein Monitoring auf anomalem Verhalten, wodurch das System begann, viele E-Mails im Ordner „Spam“ zu speichern, an der Grenze der Entscheidungsfindung. Trotz der Behebung der Folgen hat das System bereits so oft falsch reagiert, dass es sich nicht einmal in fünf Jahren amortisieren wird. Das ist ein völliger Fehlschlag aus der Sicht des Lebenszyklus des Modells.

Deshalb kann eine so einfache Sache wie Monitoring der Schlüssel im Leben eines Modells werden. Neben den Standard- und offensichtlichen Metriken betrachten wir die Verteilung der Antworten und Scores des Modells sowie die Verteilung der Werte der Schlüsselmerkmale. Mit Hilfe der KL-Divergenz können wir die aktuelle Verteilung mit der historischen oder die Werte im A/B-Test mit dem restlichen Strom vergleichen, was es ermöglicht, Anomalien im Modell zu erkennen und Änderungen rechtzeitig zurückzusetzen.
In den meisten Fällen starten wir unsere ersten Versionen von Systemen mit einfachen Heuristiken oder Modellen, die wir später zur Überwachung verwenden. Zum Beispiel überwachen wir das NER-Modell im Vergleich zu regulären Ausdrücken für bestimmte Online-Shops, und wenn die Abdeckung des Klassifikators im Vergleich zu ihnen sinkt, untersuchen wir die Gründe. Ein weiteres nützliches Anwendungsgebiet für Heuristiken!
Ergebnisse
Lassen Sie uns die wichtigsten Gedanken des Artikels noch einmal durchgehen.
- Fibdäk. Wir denken immer an die Benutzer: wie sie mit unseren Fehlern leben werden, wie sie uns darüber informieren können. Wir vergessen nicht, dass die Benutzer keine reinen Feedbackquellen für das Training von Modellen sind und dass es notwendig ist, diese mit Hilfe von unterstützenden ML-Systemen zu filtern. Wenn es nicht möglich ist, ein Signal vom Benutzer zu sammeln, suchen wir alternative Feedbackquellen, wie z. B. verwandte Systeme.
- Nachtraining. Hier ist das Hauptaugenmerk die Kontinuität, deshalb stützen wir uns auf das aktuelle Produktionsmodell. Wir trainieren neue Modelle so, dass sie sich nicht wesentlich von der Vorgängerversion unterscheiden, durch harmonische Regularisierung und ähnliche Tricks.
- Bereitstellung. Die automatische Bereitstellung anhand von Metriken verkürzt die Zeit für die Implementierung von Modellen erheblich. Die Überwachung von Statistiken und Entscheidungstransaktionen sowie die Anzahl der Benutzerfehler sind unerlässlich für Ihren ruhigen Schlaf und produktive Wochenenden.
Ich hoffe, dass das Gelese Ihnen hilft, Ihre ML-Systeme schneller zu verbessern, ihre Markteinführung zu beschleunigen und sie zuverlässiger zu machen, wodurch der Stress bei der Arbeit reduziert wird.
Quelle: habr.com

