Zurück zum Blog

Ein Auffrischer zum Batch-(Re-)Normalisierung

Wenn Sie wie ich sind, werfen Sie gerne CNNs auf jedes bildliche Problem, das Ihnen begegnet. Wenn Sie wie ich sind, dann haben Sie von BatchNorm gehört.

24. Januar 2018

AI

Industry

Industry

close-up photo of laptop screen with code
close-up photo of laptop screen with code
close-up photo of laptop screen with code

Dieser Beitrag setzt voraus, dass Sie ein CS231n-ähnliches Verständnis von neuronalen Netzwerken haben (d. h., Sie haben einen universitären Einführungskurs in Deep Learning absolviert). Wenn Sie neu in neuronalen Netzen sind, kann ich genau diesen Kurs sehr empfehlen, um schnell auf den neuesten Stand zu kommen. Ehrlich gesagt, entwickelte ich die meisten meiner Intuitionen über CNNs während dieser Vorlesungen, auf die ich noch täglich angewiesen bin — Danke Andrej! Danke Justin!)

Batch renormalisation

Wenn Sie wie ich sind, werfen Sie gerne CNNs auf jedes bildliche Problem, das Ihnen begegnet. Sie fühlen sich sicher, Ihren MBA-Freunden zu erklären, wie¹ neuronale Netze funktionieren, und beschweren sich mit Ihren CS²-Freunden über den Preis von Nvidias neuen GPUs. Wenn Sie wie ich sind, dann haben Sie schon von BatchNorm gehört. Wahrscheinlich haben Sie es³ verwendet, nach einer Erklärung für den Begriff interner Kovariatenverschiebung gegoogelt und einigermaßen zufrieden sind Sie zu Ihrem Tagesgeschäft mit dem Feintuning einiger Hyperparameter zurückgekehrt.

Nun, wenn Sie noch nichts von Batch-renormalisierung, dem nachfolgenden Papier von Ioffe, gehört haben, besteht eine gute Chance, dass Sie überrascht werden.

Die tl;dr für die meisten Menschen liest sich etwa so:
BatchRenorm ist BatchNorm überlegen, in TensorFlow implementiert, aber erfordert das Tuning einiger zusätzlicher Hyperparameter. Wenn Ihre Batchgröße sehr klein ist (z.B. 2 oder 4 — wahrscheinlich aufgrund von begrenztem GPU-Speicher), sollten Sie es wahrscheinlich verwenden.

Nachfolgend werde ich Ihnen eine Auffrischung geben, wie BatchNorm mit dem Transferlernen zusammenhängt, warum Sie beim Einsatz von BatchNorm ein wenig paranoid sein sollten (d.h. wie es unerwartet ausfallen kann) und wie BatchRenorm Ihnen helfen wird, wieder wie ein Baby zu schlafen, aber nur — um das Gleichnis etwas zu erweitern — wenn Sie bereit sind, vor dem Schlafengehen ein paar zusätzliche Liegestütze zu machen.

Transferlernen

Das Szenario des Transferlernens, das Sie wahrscheinlich am besten kennen, ist dieses: Sie haben ein CNN, das auf ImageNet vortrainiert wurde und das Sie nun verwenden möchten, um zwischen Ihren linken und rechten Fußsocken zu unterscheiden (oder etwas Ähnliches). Abhängig davon, wie viele Daten Sie haben, frieren Sie die letzten Schichten ein oder trainieren das gesamte CNN auf Ihrem eigenen Sockendatensatz neu — bislang, so gut. Aber es gibt andere Szenarien des Transferlernens, die, wenn auch nicht so allgegenwärtig, dennoch genauso wichtig sind.

Training and test set

Wenn wir — anstatt von einer Aufgabe zur nächsten zu verallgemeinern (wie z.B. das Klassifizieren von Socken statt Hunde und Katzen) — möchten, dass unser Modell von einer Quell-Domäne zu einer Ziel-Domäne mit einer anderen Datenverteilung verallgemeinert, dann nennt man das Domänenanpassung. Um ein intuitives Verständnis dafür zu bekommen, warum dies möglicherweise ein schwieriges Problem ist, betrachten Sie zwei Datensätze mit nur Katzen und Hunden. Beide enthalten Ihre normale Vielfalt an Katzen, aber der erste hat nur Hunde, die braun sind. Wenn wir Pech haben, wird unser Modell, das auf dem ersten Datensatz trainiert wurde, keine Unterschiede wie spitze vs. schlaffe Ohren lernen, sondern nur, dass wenn es etwas Braunes sieht, es ein Hund sein muss. In diesem Fall sollten wir nicht überrascht sein, wenn unsere Klassifizierungsgenauigkeit auf dem zweiten Datensatz plötzlich leidet.

Die Quintessenz ist eine universelle Wahrheit des maschinellen Lernens: wenn sich Ihre Datenverteilung unterm Radar ändert, sind Sie wahrscheinlich in Schwierigkeiten.

BatchNorm interessiert das nicht

Zurück zu BatchNorm und dem Googeln, was „Reduzierung der internen Kovariatenverschiebung“ bedeutet. „Interne Kovariatenverschiebung“ ist nur ein schicker Begriff für die Tatsache, dass sich die Eingaben („Daten“) der Zwischenschichten von neuronalen Netzen während des Trainings ändern. Das ist nicht überraschend, da die Eingabe einer Zwischenschicht einfach die Ausgabe der vorhergehenden Schicht ist und sich diese „Vor“-Schichtausgabe mit der Zeit als ihre Parameter aktualisiert werden, ebenfalls ändert.

Anstatt zu versuchen, eine clevere „interne Domänenanpassung“-Technik zu finden, ist die geniale Lösung von Ioffe-Szegedy dieses Problems der sich ändernden Eingabeverteilungen, es einfach zu umgehen. Sie verwenden BatchNorm, um jede Schichteingabe zu normalisieren und voilà: keine chaotischen, veränderlichen Verteilungen mehr.

Hier ist das Algorithmus zur schnellen Referenz.

Algorithm of shape shifting distributions

Es stellt sich heraus, dass die Verwendung von BatchNorm Ihr Modell auch robuster für weniger sorgfältige Gewichtsinitialisierungen und größere Lernraten macht. Und ein weiteres Gimmick:
I-S berichten, dass das Rauschen, das durch das Berechnen des Mittelwertes und der Varianz über jedes Mini-Batch anstelle über das gesamte Trainingsset eingeführt wird, nicht nur schlechte Nachrichten sind, sondern als Regularisierung wirkt und die Notwendigkeit zum Hinzufügen zusätzlicher Dropout-Schichten beseitigen kann.

Warum BatchNorm Sie paranoid machen sollte

Wissen Sie, was ich hasse: wenn mein Code kompiliert, mein Modell trainiert, aber aus irgendeinem gut versteckten Grund die Modellleistung viel schlechter ist als erwartet. Leider kann BatchNorm unter bestimmten Umständen dieser gut versteckte Grund sein. Um zu verstehen, wann dies passiert, empfehle ich dringend, den Beitrag von Alex Irpan über die Gefahren von BatchNorm zu lesen. In jedem Fall, hier ist meine zusammenfassende Zusammenfassung:

Wenn sich der Mini-Batch-Mittelwert (µB) und die Mini-Batch-Standardabweichung (σB) zu oft vom Mittelwert und der Standardabweichung über das gesamte Trainingsset hinweg unterscheiden, bricht BatchNorm zusammen. Denken Sie daran, dass wir zur Inferenzzeit die gleitenden Durchschnitte von µB und σB (als Schätzung der Statistiken des gesamten Trainingssets) verwenden, um den Normalisierungsschritt durchzuführen. Natürlich, wenn Ihre Mittelwerte und Standardabweichungen während des Trainings und Testens unterschiedlich sind, sind es auch Ihre Aktivierungen und Sie können nicht überrascht sein, wenn Ihre Ergebnisse ebenfalls unterschiedlich (lesen: schlechter) sind. Dies kann passieren, wenn Ihre Mini-Batch-Proben nicht unabhängig und identisch verteilt sind (oder in einfacher Sprache: wenn Ihre Stichprozedur voreingenommen ist — denken Sie daran, zuerst nur braune Hunde zu sampeln und dann nur schwarze Hunde) oder, häufiger, wenn Sie eine sehr kleine Batchgröße haben. In beiden Fällen: Willkommen zurück im „veränderlichen Verteilungen“-Land.

Eintreten BatchRenorm

BatchRenorm packt dieses Problem der unterschiedlichen Statistiken zur Trainings- und Inferenzzeit direkt an. Der Schlüsselgedanke, um die Differenz zu überbrücken, ist dieser:

BatchRenorm algorithm

Der Normalisierungsschritt zur Inferenzzeit (unter Verwendung von Schätzungen der Trainingsset-Statistiken µ und σ) kann tatsächlich als affine Transformation des Normalisierungsschritts zur Trainingszeit (unter Verwendung der Mini-Batch-Statistiken µB und σB) umgeschrieben werden! Und das ist im Grunde alles dazu. Die Verwendung von Mini-Batch + affiner Transformation während der Trainingszeit und gleitenden Durchschnitten zur Inferenzzeit stellt sicher, dass die Ausgabe von BatchRenorm in beiden Phasen die gleiche ist, selbst wenn σB != σ und µB != µ.

Hier ist der Algorithmus in seiner vollständigen nicht-japanischen Form.

BatchRenorm Algorithm

Ein interessantes Detail ist, dass die Batchrenormalisierung eigentlich nur eine Verallgemeinerung von BatchNorm ist und sich auf seinen Vorgänger zurückführt, wenn σB == σ und µB == µ (oder r = 1 und d = 0). Dies führt uns zu der Frage, wann BatchRenorm verwendet werden soll und wann BatchNorm ausreicht?

BatchRenorm ≥ BatchNorm?

Die gute Nachricht ist, dass Sie hinsichtlich der Modellleistung auf BatchRenorm zählen können, das immer besser oder gleich BatchNorm ist.

BatchNorm & Batch Renorm

Die Verwendung von BatchRenorm hat jedoch die zusätzlichen Kosten von zwei Hyperparametern (im Unterschrift unter dem BatchRenorm-Algorithmus diskutiert) und Sie müssen den richtigen Zeitplan finden, um die beste Leistung zu erzielen. So weit, so gut. Wie bei den meisten Dingen im Leben ist es ein Kompromiss zwischen Ihrer Zeit und der Leistung Ihres Modells. Wenn Sie Ihr Hyperparameter-Tuning zu Dingen wie Bayesian Optimierung ausgelagert haben¹¹, bleibt es zumindest noch ein Kompromiss zwischen Rechenressourcen und Leistung.

Persönlich werde ich von nun an BatchRenorm mit dem festen Zeitplan verwenden, der im Papier¹² erwähnt wird. Wenn ich sehr kleine Batchgrößen habe (oder eine seltsame Mini-Batch-Sampling-Eigenheit wie in Irpans Beitrag), bringe ich mich vielleicht dazu, selbst etwas Hyperparameter-Tuning zu machen.

Lassen Sie mich wissen, wie es bei Ihnen läuft.

[1] ^ Beachten Sie, dass ich sagte, wie, nicht warum. Für einen klaren, völlig nicht-technischen Überblick darüber, wie neuronale Netzwerke funktionieren, ist dies NYTimes-Artikel ein Muss. Er enthält auch ein urkomisches Zitat von Quoc V. Le, das — wenn Sie mich fragen — wunderbar dieses dunkle Gefühl einfängt, dass auch wenn Sie die meisten Prinzipien und Mathematik hinter neuronalen Netzwerken verstanden haben, es sich immer noch ein wenig wie Zauberei anfühlt, wenn Ihr Inception-Resnet-v2 erneut erfolgreich Ihren Hund als Soft Coated Wheaten Terrier und nicht, sagen wir, West Highland White Terrier klassifiziert [1a].
Genervt vom Autor für ein intuitives mentales Bild von Wort-Embeddings (wie word2vec oder GloVe) antwortet Le unverhohlen: „Gideon, […] ich mag es im Allgemeinen nicht, tausenddimensionale Vektoren im dreidimensionalen Raum zu visualisieren.
[1a] Vollständige Offenlegung: Ich besitze keinen Terrier.

[2] ^ Freie Suche und Ersetzung mit EE, Statistik, Physik, Mathematik, etc.

[3] ^ Tatsächlich wurde das Ioffe-Szegedy-Papier, das die Idee der Batch-Normalisierung einführt, 3397 Mal zitiert (Stand: 20. Januar 2018). Dies bedeutet nicht notwendigerweise, dass 3397 Personen versucht haben, auf den von I-S eingeführten Ideen aufzubauen oder dass sie versucht haben, neue Wege zur Bewältigung der von BatchNorm angesprochenen Probleme zu finden (mehr dazu später), sondern hauptsächlich, dass BatchNorm seit 2016 zur Standardpraxis in den meisten CNN-Architekturen geworden ist. Der Vollständigkeit halber, lassen Sie mich es hier und jetzt zitieren:
Ioffe, S., Szegedy, C., (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML.

[4] ^ Batchrenormalisierung hat keine Verbindung zur Renormalisierung, einer Sammlung von Techniken in der Quantenfeldtheorie. Wenn Sie nichts über Quantenfeldtheorie wissen (wie ich), ermutige ich Sie dennoch, dem Link zum Wikipedia-Artikel zu folgen und sich zu amüsieren, während Sie den ersten Satz dort lesen. Jedenfalls, hier ist die Renormalisierung, mit der wir uns beschäftigen:
Ioffe, S., (2017). Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models. NIPS.

[5] ^ Sebastian Ruder schrieb einen großartigen Blog-Beitrag über die verschiedenen Transferlerneinstellungen, mit viel genaueren Definitionen als ich hier verwende. Dort zitiert er auch Andrew Ng, der während seines NIPS-2016-Workshops voraussagte, dass Transferlernen „der nächste Treiber des ML-Erfolgs“ sein wird.

[6] ^ Ähnlich könnte man sich vorstellen, dass, wenn wir auf einem normalen Datensatz von Katzen und Hunden trainieren, aber zufällig Proben ziehen und nur braune Hunde am Anfang bekommen, es wahrscheinlich länger dauert, bis unser Modell geeignete Unterschiede wie spitze vs. schlaffe Ohren lernt. Wir werden auf diese Idee zurückkommen, wenn wir darüber diskutieren, wie BatchNorm auf unerwartete Weise fehlschlagen kann.

[7] ^ Eine einfache Intuition, warum dies zutreffen könnte, findet sich schnell in Ioffes Batch Renormalization-Papier [4]:

Wenn x selbst das Ergebnis einer Anwendung einer linearen Transformation W auf die vorherige Schicht ist, macht batchnorm das Modell invariant gegenüber der Skalierung von W (unter Ausschluss des kleinen Epsilon).

Aber wenn die Skalierung von W keine Rolle spielt, ist eine ordnungsgemäße Gewichtsinitialisierung nicht so wichtig und größere Lernraten brechen Ihr Training nicht so leicht!

[8] ^ Wir können den Populationsmittelwert und die Populationsvarianz der Aktivierungen der Zwischenschicht nicht berechnen, da das Durchlaufen des gesamten Trainingssatzes nach jeder einzelnen Parameteraktualisierung den gesamten Zweck des stochastischen Gradientenabstiegs zunichte machen würde. Das scheint einfach genug. Aber warum können wir nicht einfach die gleitenden Durchschnitte von Mittelwert und Varianz anstelle der Mini-Batch-Versionen für die Normalisierung verwenden? Der Grund, finde ich, ist ziemlich subtil. Haftungsausschluss: Wenn Sie nie von dieser Frage zu BatchNorm verfolgt wurden, ermutige ich Sie, den Rest dieser Fußnote zu überspringen, da sie sowohl langatmig als auch ein wenig technisch ist.

Wenn Sie jemals den Rückpass für BatchNorm selbst ableiten mussten, erinnern Sie sich vielleicht daran, dass der Grund, warum die Übung nicht völlig mühelos ist, darin besteht, dass der Mini-Batch-Mittelwert und die Varianz (offensichtlich) Funktionen der aktuellen Aktivierungen im Mini-Batch sind.

algorithm of batch renorm

Natürlich gilt dies auch für die gleitenden Durchschnitte. Nun, wenn Sie von der Normalisierungsstufe (der Berechnung von σ und μ) auf Ihre Mini-Batch-Eingaben absehen, während Sie Ihre Gradienten berechnen, wird Ihr Modell explodieren. Aber warum ist das so? I-S hat natürlich die Antwort:

original batchrnorm paper

Das letzte, was hinzuzufügen ist, ist, dass wenn Sie die Abhängigkeit von E[x] von b berücksichtigen, Ihr Gradient ∆b = 0 (gehen Sie vor und prüfen Sie, ob dies zutrifft!) und Ihr Modell nicht explodieren wird. Yay! Zurück zum Geschäft der gleitenden Durchschnitte: in TensorFlow werden sie mit dem Moment α berechnet (in Worten: mean_moving_average = α * mean_moving_average + (1 − α) * mini_batch_mean). Wie Sie wahrscheinlich schon erkennen können, obwohl es möglich ist, die Abhängigkeit des mini_batch_mean von Ihren aktuellen Aktivierungen zu berücksichtigen, gibt es keine leichte Möglichkeit, die Gradienten von mean_moving_average in Bezug auf die Aktivierungen x zu berechnen (leider der Nachteil der Rekursion), somit ∆b nicht 0 ist, somit b explodieren wird, somit verwenden wir den Mini-Batch-Mittelwert und die Varianz und nicht die gleitenden Durchschnitte. So ist das.

[9] ^ Kleine Batchgrößen führen zu einer hohen Varianz in µB und σB. Noch besser (bzw. schlechter): Im Extremfall einer Batchgröße von eins, ist es nicht nur ein Problem unsteter Mittelwerte und Varianzen, sondern die Ausgabe von BatchNorm wird völlig null sein!

[10] ^ Wenn wir das nicht tun würden, wären wir wieder genau bei demselben Problem, das in [8] diskutiert wurde. Wenn Sie r und d jedoch als Konstanten behandeln, können Sie die in [8] besprochenen Schritte durchlaufen und Sie werden sehen, dass ∆b immer noch 0 ist => und Ihr Modell sollte nicht explodieren.

[11] ^ Gibt es schon eine Open-Source-Version von Google Vizier?

[12] ^ Der im Papier verwendete Hyperparameter-Zeitplan:

Für Batch Renorm verwendeten wir rmax = 1, dmax = 0 (d.h. einfach batchnorm) für die ersten 5000 Trainingsschritte, nach denen diese allmählich entspannt wurden, um rmax = 3 bei 40k Schritten und dmax = 5 bei 25k Schritten zu erreichen.

‍‍

Weitere Blog-Artikel

Neueste Blog-Artikel

Sebastian Schaal
Inga Schwarz
Patrick Perner

Kostenfreie Demo buchen

Lassen Sie sich von unseren Produktspezialisten durch die Plattform führen, alle für Ihren individuellen Anwendungsfall relevanten Funktionalitäten ansprechen und alle Ihre Fragen direkt beantworten. Oder sehen Sie sich ein 5-minütiges Video der wichtigsten Funktionen an.