Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Vor ein paar Monaten unsere Kollegen von Google gehalten Auf Kaggle gibt es einen Wettbewerb zur Erstellung eines Klassifikators für Bilder, die in der Sensation gewonnen wurden das Spiel "Schnelle Zeichnung!" Das Team, zu dem auch der Yandex-Entwickler Roman Vlasov gehörte, belegte im Wettbewerb den vierten Platz. Beim Machine-Learning-Training im Januar teilte Roman die Ideen seines Teams, die endgültige Implementierung des Klassifikators und interessante Praktiken seiner Gegner mit.


- Hallo zusammen! Mein Name ist Roma Vlasov, heute erzähle ich Ihnen von Quick, Draw! Herausforderung zur Doodle-Erkennung.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Unser Team bestand aus fünf Personen. Ich bin kurz vor Ablauf der Fusionsfrist beigetreten. Wir hatten Pech, wir wurden ein wenig erschüttert, aber wir wurden von der Geldposition her erschüttert, und sie wurden von der Goldposition erschüttert. Und wir belegten einen ehrenvollen vierten Platz.

(Während des Wettbewerbs beobachteten sich die Teams in einer Bewertung, die auf der Grundlage der Ergebnisse gebildet wurde, die auf einem Teil des vorgeschlagenen Datensatzes angezeigt wurden. Die endgültige Bewertung wurde wiederum auf einem anderen Teil des Datensatzes gebildet. Dies geschieht so dass die Wettbewerbsteilnehmer ihre Algorithmen nicht an bestimmte Daten anpassen. Daher wackeln im Finale beim Wechsel zwischen den Bewertungen die Positionen ein wenig (von englisch shake up – mischen): Bei anderen Daten kann das Ergebnis ausfallen anders sein. Romans Team war das erste unter den ersten drei. In diesem Fall handelt es sich bei den ersten drei um Geld, die monetäre Bewertungszone, da nur die ersten drei Plätze mit einem Geldpreis ausgezeichnet wurden. Nach der Umstellung war das Team bereits dabei Vierter Platz. Auf die gleiche Weise verlor das andere Team den Sieg, die Goldposition. - Ed.)

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Der Wettbewerb war auch insofern bedeutsam, als Evgeniy Babachnin einen Großmeister erhielt, Ivan Sosin einen Meister erhielt, Roman Soloviev Großmeister blieb, Alex Parinov einen Meister erhielt, ich Experte wurde und jetzt bereits Meister bin.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Was ist das für ein Quick Draw? Dies ist ein Dienst von Google. Google hatte das Ziel, KI populär zu machen und wollte mit diesem Dienst zeigen, wie neuronale Netze funktionieren. Sie gehen dorthin, klicken auf „Lass uns zeichnen“ und es öffnet sich eine neue Seite, auf der Ihnen gesagt wird: „Zeichnen Sie einen Zickzack“, dafür haben Sie 20 Sekunden Zeit. Sie versuchen, in 20 Sekunden einen Zickzack zu zeichnen, wie hier zum Beispiel. Wenn Sie Erfolg haben, sagt das Netzwerk, dass es sich um einen Zickzack handelt, und Sie gehen weiter. Es gibt nur sechs solcher Bilder.

Wenn das Google-Netzwerk nicht erkannte, was Sie gezeichnet hatten, wurde die Aufgabe angekreuzt. Was es in Zukunft bedeutet, ob eine Zeichnung vom Netzwerk erkannt wird oder nicht, erzähle ich euch später.

Dieser Dienst versammelte eine ziemlich große Anzahl von Benutzern und alle von Benutzern gezeichneten Bilder wurden protokolliert.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Es ist uns gelungen, fast 50 Millionen Bilder zu sammeln. Daraus wurden der Trainings- und Prüfungstermin für unseren Wettbewerb gebildet. Die Datenmenge im Test und die Anzahl der Klassen sind übrigens nicht ohne Grund fett hervorgehoben. Ich werde euch etwas später davon erzählen.

Das Datenformat war wie folgt. Hierbei handelt es sich nicht nur um RGB-Bilder, sondern grob gesagt um ein Protokoll aller Aktionen des Benutzers. Wort ist unser Ziel, Ländercode gibt an, woher der Autor des Doodles kommt, Zeitstempel ist die Zeit. Das erkannte Label zeigt lediglich an, ob das Netzwerk das Bild von Google erkannt hat oder nicht. Und die Zeichnung selbst ist eine Folge, eine Annäherung an eine Kurve, die der Benutzer mit Punkten zeichnet. Und Timings. Dies ist die Zeit ab Beginn des Zeichnens des Bildes.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Die Daten wurden in zwei Formaten präsentiert. Dies ist das erste Format und das zweite ist vereinfacht. Von dort aus haben sie die Zeitangaben herausgeschnitten und diese Punktemenge durch eine kleinere Punktemenge angenähert. Dafür verwendeten sie Douglas-Pecker-Algorithmus. Sie haben eine große Menge von Punkten, die lediglich eine gerade Linie annähern, aber tatsächlich können Sie diese Linie mit nur zwei Punkten annähern. Das ist die Idee des Algorithmus.

Die Daten wurden wie folgt verteilt. Alles ist einheitlich, aber es gibt einige Ausreißer. Als wir das Problem gelöst haben, haben wir es nicht angeschaut. Die Hauptsache ist, dass es keine wirklich wenigen Klassen gab, wir mussten keine gewichteten Sampler und keine Datenüberabtastung durchführen.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Wie sahen die Bilder aus? Dies ist die Klasse „Flugzeug“ und Beispiele daraus mit den Bezeichnungen „erkannt“ und „unerkannt“. Ihr Verhältnis lag bei etwa 1 zu 9. Wie Sie sehen können, sind die Daten ziemlich verrauscht. Ich würde vermuten, dass es ein Flugzeug ist. Wenn man es nicht erkennt, handelt es sich in den meisten Fällen nur um Rauschen. Jemand hat sogar versucht, „Flugzeug“ zu schreiben, aber offenbar auf Französisch.

Die meisten Teilnehmer nahmen einfach Gitter, zeichneten Daten aus dieser Linienfolge als RGB-Bilder und warfen sie in das Netzwerk. Ich habe ungefähr auf die gleiche Weise gezeichnet: Ich habe eine Farbpalette genommen, die erste Linie mit einer Farbe gezeichnet, die am Anfang dieser Palette war, die letzte Linie mit einer anderen, die am Ende der Palette war, und dazwischen Mit dieser Palette habe ich überall interpoliert. Das ergab übrigens ein besseres Ergebnis, als wenn man wie auf der allerersten Folie zeichnete – nur in Schwarz.

Andere Teammitglieder, wie zum Beispiel Ivan Sosin, versuchten etwas andere Herangehensweisen an das Zeichnen. Mit einem Kanal zeichnete er einfach ein graues Bild, mit einem anderen Kanal zeichnete er jeden Strich mit einem Farbverlauf von Anfang bis Ende, von 32 bis 255, und mit dem dritten Kanal zeichnete er einen Farbverlauf über alle Striche von 32 bis 255.

Eine weitere interessante Sache ist, dass Alex Parinov Informationen mithilfe des Ländercodes in das Netzwerk hochgeladen hat.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Die im Wettbewerb verwendete Metrik ist die mittlere durchschnittliche Präzision. Was ist das Wesentliche an dieser Messgröße für den Wettbewerb? Sie können drei Prädikate angeben, und wenn es in diesen dreien kein korrektes Prädikat gibt, dann erhalten Sie 0. Wenn es ein richtiges Prädikat gibt, wird dessen Reihenfolge berücksichtigt. Und das Zielergebnis wird als 1 geteilt durch die Reihenfolge Ihrer Vorhersage gezählt. Sie haben beispielsweise drei Prädiktoren erstellt und der richtige ist der erste. Dann teilen Sie 1 durch 1 und erhalten 1. Wenn der Prädiktor richtig ist und seine Ordnung 2 ist, teilen Sie 1 durch 2 und erhalten 0,5. Na ja, usw.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Mit der Datenvorverarbeitung – wie man Bilder zeichnet und so weiter – haben wir uns ein wenig entschieden. Welche Architekturen haben wir verwendet? Wir haben versucht, fette Architekturen wie PNASNet, SENet und bereits klassische Architekturen wie SE-Res-NeXt zu verwenden, sie treten zunehmend in neue Wettbewerbe ein. Es gab auch ResNet und DenseNet.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Wie haben wir das gelehrt? Alle von uns aufgenommenen Modelle wurden auf Imagenet vorab trainiert. Es gibt zwar viele Daten, 50 Millionen Bilder, aber wenn Sie ein auf Imagenet vorab trainiertes Netzwerk verwenden, zeigt es bessere Ergebnisse, als wenn Sie es einfach von Grund auf trainieren würden.

Welche Unterrichtstechniken haben wir verwendet? Das ist Cosing Annealing mit Warm-Neustarts, worüber ich etwas später sprechen werde. Dies ist eine Technik, die ich bei fast allen meiner letzten Wettkämpfe anwende, und mit der es gelingt, die Grids recht gut zu trainieren und ein gutes Minimum zu erreichen.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Als nächstes reduzieren Sie die Lernrate auf dem Plateau. Sie beginnen mit dem Training des Netzwerks, legen eine bestimmte Lernrate fest, unterrichten es weiter und Ihr Verlust nähert sich allmählich einem bestimmten Wert an. Wenn Sie dies beispielsweise überprüfen, hat sich der Verlust über zehn Epochen hinweg überhaupt nicht verändert. Sie reduzieren Ihre Lernrate um einen bestimmten Wert und lernen weiter. Sie sinkt wieder ein wenig, konvergiert bei einem Minimum, und Sie verringern erneut die Lernrate und so weiter, bis Ihr Netzwerk schließlich konvergiert.

Als nächstes kommt eine interessante Technik: Verringern Sie nicht die Lernrate, sondern erhöhen Sie die Stapelgröße. Es gibt einen Artikel mit demselben Namen. Wenn Sie ein Netzwerk trainieren, müssen Sie die Lernrate nicht reduzieren, sondern können einfach die Stapelgröße erhöhen.

Diese Technik wurde übrigens von Alex Parinov verwendet. Er begann mit einem Batch von 408, und als sein Netzwerk ein gewisses Plateau erreichte, verdoppelte er einfach die Batch-Größe usw.

Tatsächlich kann ich mich nicht erinnern, welchen Wert seine Batch-Größe erreichte, aber interessant ist, dass es auf Kaggle Teams gab, die die gleiche Technik verwendeten, ihre Batch-Größe betrug etwa 10000. Übrigens, moderne Frameworks für Deep Learning, wie z PyTorch ermöglicht Ihnen dies beispielsweise ganz einfach. Sie generieren Ihren Stapel und übermitteln ihn nicht so, wie er ist, als Ganzes an das Netzwerk, sondern teilen ihn in Stücke auf, damit er in Ihre Grafikkarte passt, berechnen die Farbverläufe und aktualisieren ihn, nachdem Sie den Farbverlauf für den gesamten Stapel berechnet haben die Gewichte.

Bei diesem Wettbewerb wurden übrigens immer noch große Batch-Größen berücksichtigt, da die Daten ziemlich verrauscht waren und eine große Batch-Größe dabei half, den Gradienten genauer anzunähern.

Es wurden auch Pseudoetiketten verwendet, die vor allem von Roman Soloviev verwendet wurden. Er hat etwa die Hälfte der Daten aus dem Test in Chargen abgetastet und das Raster anhand dieser Chargen trainiert.

Die Größe der Bilder spielt eine Rolle, aber Tatsache ist, dass Sie über viele Daten verfügen und lange trainieren müssen. Wenn Ihre Bildgröße ziemlich groß ist, wird das Training sehr lange dauern. Dies trug jedoch nicht wesentlich zur Qualität Ihres endgültigen Klassifikators bei, sodass es sich lohnte, einen Kompromiss einzugehen. Und wir haben nur Bilder ausprobiert, die nicht sehr groß waren.

Wie wurde das alles gelernt? Zuerst wurden kleinformatige Bilder gemacht, mehrere Epochen darauf laufen gelassen, das hat ziemlich viel Zeit in Anspruch genommen. Dann wurden großformatige Bilder gegeben, das Netzwerk trainiert, dann noch mehr, noch mehr, um es nicht von Grund auf zu trainieren und nicht viel Zeit zu verschwenden.

Über Optimierer. Wir haben SGD und Adam verwendet. Auf diese Weise war es möglich, ein einziges Modell zu bekommen, das eine Geschwindigkeit von 0,941-0,946 auf der öffentlichen Bestenliste erreichte, was ziemlich gut ist.

Wenn man die Modelle auf irgendeine Weise zusammenfasst, kommt man auf etwa 0,951. Wenn Sie eine weitere Technik anwenden, erhalten Sie auf der öffentlichen Tafel ein Endergebnis von 0,954, genau wie wir. Aber dazu später mehr. Als nächstes erzähle ich Ihnen, wie wir die Modelle zusammengebaut haben und wie wir es geschafft haben, eine solche Endgeschwindigkeit zu erreichen.

Als nächstes möchte ich über Cosing Annealing mit Warm-Neustarts oder Stochastic Gradient Descent mit Warm-Neustarts sprechen. Grob gesagt können Sie im Prinzip jeden Optimierer verwenden, aber der Punkt ist folgender: Wenn Sie nur ein Netzwerk trainieren und es nach und nach auf ein Minimum konvergiert, dann ist alles in Ordnung, Sie erhalten ein Netzwerk, das bestimmte Fehler macht, aber Sie kann es etwas anders trainieren. Sie legen eine anfängliche Lernrate fest und senken diese schrittweise gemäß dieser Formel. Wenn Sie den Wert senken, erreicht Ihr Netzwerk ein Minimum, dann speichern Sie die Gewichte und stellen erneut die Lernrate ein, die zu Beginn des Trainings galt, wodurch Sie von diesem Minimum aus irgendwo nach oben gehen und Ihre Lernrate erneut senken.

So können Sie mehrere Minima gleichzeitig besuchen, bei denen Ihr Verlust plus oder minus gleich ist. Tatsache ist jedoch, dass Netzwerke mit diesen Gewichtungen unterschiedliche Fehler bei Ihrem Datum liefern. Indem Sie sie mitteln, erhalten Sie eine Art Annäherung und Ihre Geschwindigkeit wird höher sein.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Darüber, wie wir unsere Modelle zusammengestellt haben. Zu Beginn der Präsentation sagte ich, man solle auf die Datenmenge im Test und die Anzahl der Klassen achten. Wenn Sie 1 zur Anzahl der Ziele im Testsatz addieren und durch die Anzahl der Klassen dividieren, erhalten Sie die Zahl 330, und im Forum wurde geschrieben, dass die Klassen im Test ausgewogen sind. Das könnte genutzt werden.

Auf dieser Grundlage entwickelte Roman Soloviev eine Metrik, die wir Proxy Score nannten und die recht gut mit der Bestenliste korrelierte. Der Punkt ist: Sie machen eine Vorhersage, nehmen die ersten 1 Ihrer Prädiktoren und zählen die Anzahl der Objekte für jede Klasse. Als nächstes subtrahieren Sie 330 von jedem Wert und addieren die resultierenden Absolutwerte.

Es wurden folgende Werte ermittelt. Dies hat uns geholfen, keine Sondierungs-Bestenliste zu erstellen, sondern lokal zu validieren und Koeffizienten für unsere Ensembles auszuwählen.

Mit einem Ensemble könnte man eine solche Geschwindigkeit erreichen. Was könnte ich sonst noch tun? Angenommen, Sie haben die Information verwendet, dass die Klassen in Ihrem Test ausgeglichen sind.

Die Ausbalancierung war anders. Ein Beispiel für eines davon – Abwägung der Jungs, die den ersten Platz belegten.

Was haben wir getan? Unser Ausgleich war ganz einfach, er wurde von Evgeny Babachnin vorgeschlagen. Wir haben unsere Vorhersagen zunächst nach Top 1 sortiert und daraus Kandidaten ausgewählt – so dass die Anzahl der Klassen 330 nicht überstieg. Bei einigen Klassen erhält man jedoch am Ende weniger als 330 Prädiktoren. Okay, sortieren wir auch nach Top 2 und Top 3 , und wir werden auch Kandidaten auswählen.

Wie unterschied sich unsere Bilanzierung von der Bilanzierung des ersten Platzes? Sie verwendeten einen iterativen Ansatz, indem sie die beliebteste Klasse nahmen und die Wahrscheinlichkeiten für diese Klasse um eine kleine Zahl verringerten, bis diese Klasse nicht mehr die beliebteste Klasse war. Wir haben den nächstbeliebtesten Kurs belegt. Also senkten sie sie weiter, bis die Zahl aller Klassen gleich war.

Jeder nutzte den Plus- oder Minus-Eins-Ansatz zum Trainieren von Netzwerken, aber nicht jeder nutzte den Ausgleich. Mithilfe des Balancierens konnte man in Gold investieren, und wenn man Glück hatte, dann in Geld.

Wie verarbeite ich ein Datum vor? Alle haben das Datum, Plus oder Minus, auf die gleiche Weise vorverarbeitet – indem sie handgefertigte Merkmale erstellt haben, versucht haben, Zeitangaben mit unterschiedlichen Strichfarben zu kodieren usw. Alexey Nozdrin-Plotnitsky, der den 8. Platz belegte, sprach darüber.

Klassifizierung handschriftlicher Zeichnungen. Bericht in Yandex

Er hat es anders gemacht. Er sagte, dass all Ihre handgefertigten Funktionen nicht funktionieren, Sie müssen das nicht tun, Ihr Netzwerk sollte das alles von selbst lernen. Stattdessen hat er Lernmodule entwickelt, die Ihre Daten vorverarbeiten. Er fügte ihnen die Originaldaten ohne Vorverarbeitung hinzu – Punktkoordinaten und Zeitangaben.

Dann nahm er die Differenz anhand der Koordinaten und bildete den Durchschnitt aller Daten anhand der Zeitangaben. Und er hat sich eine ziemlich lange Matrix ausgedacht. Er wandte mehrmals eine 1D-Faltung darauf an, um eine Matrix der Größe 64xn zu erhalten, wobei n die Gesamtzahl der Punkte ist und 64 gebildet wird, um die resultierende Matrix der Schicht eines beliebigen Faltungsnetzwerks zuzuführen, das die Anzahl der Kanäle akzeptiert - 64. Er erhielt eine 64xn-Matrix, daraus musste dann ein Tensor einiger Größe erstellt werden, damit die Anzahl der Kanäle 64 betrug. Er normalisierte alle Punkte X, Y im Bereich von 0 bis 32, um a zu erstellen Tensor der Größe 32x32. Ich weiß nicht, warum er 32x32 wollte, es ist einfach so passiert. Und an dieser Koordinate platzierte er ein Fragment dieser Matrix der Größe 64xn. Am Ende entstand also ein 32x32x64-Tensor, den Sie weiter in Ihr Faltungs-Neuronales Netzwerk integrieren können. Das ist alles, was ich sagen wollte.

Source: habr.com

Kommentar hinzufügen