
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.

Sebastian Schaal
Gründer und Geschäftsführer bei Luminovo
24. Januar 2018

Dieser Beitrag setzt voraus, dass Sie ein CS231n-ähnliches Verständnis von neuronalen Netzwerken haben (d. h. Sie haben einen Einführungskurs zur Tiefenlernen auf Universitätsniveau absolviert). Wenn Sie völlig neu bei neuronalen Netzen sind, empfehle ich genau diesenKurs als perfekte Ressource, um schnell auf den neuesten Stand zu kommen. Ehrlich gesagt, war es beim Verfolgen dieser Vorlesungen, dass ich die meisten meiner Intuitionen über CNNs entwickelt habe, auf die ich mich jeden Tag verlasse – Danke Andrej! Danke Justin!)

Wenn Sie wie ich sind, werfen Sie gerne CNNs auf jedes bildhafte Problem, das Ihnen begegnet. Sie fühlen sich sicher dabei, Ihren MBA-Freunden zu erklären, wie¹ neuronale Netze funktionieren, und Sie beschweren sich gerne mit Ihren CS² Freunden über das Preisschild von Nvidias neuen GPUs. Wenn Sie wie ich sind, dann haben Sie von BatchNorm gehört. Sie haben es wahrscheinlich verwendet³, nach einer Erklärung für den Begriff interne Kovariatenverschiebung gegoogelt und kehrten einigermaßen zufrieden zu Ihrem täglichen Geschäft zurück, um einige weitere Hyperparameter zu optimieren.
Jetzt besteht die Wahrscheinlichkeit, dass Sie noch nichts von Batch Renormalisierung⁴, Ioffes Folgepapier, gehört haben.
Das tl;dr für die meisten Menschen liest sich ungefähr so:
BatchRenorm ist BatchNorm überlegen, implementiert in TensorFlow, hat jedoch den Nachteil, dass ein paar zusätzliche Hyperparameter abgestimmt werden müssen. Wenn Ihre Batchgröße sehr klein ist (sagen Sie 2 oder 4 — wahrscheinlich aufgrund des begrenzten GPU-Speichers), sollten Sie es wahrscheinlich verwenden.
Im Folgenden werde ich versuchen, Ihnen eine Auffrischung darüber zu geben, wie BatchNorm mit Transferlernen zusammenhängt, warum Sie beim Verwenden von BatchNorm nur ein wenig paranoid sein sollten (d. h. wie es auf unerwartete Weise zusammenbrechen kann) und wie BatchRenorm Ihnen helfen wird, wieder zu schlafen wie ein Baby, aber nur – um den Vergleich etwas zu dehnen – wenn Sie bereit sind, ein paar zusätzliche Liegestütze zu machen, bevor Sie ins Bett gehen.
Transferlernen
Das Transferlernszenario, das Ihnen am vertrautesten ist, ist wahrscheinlich dieses: Sie haben ein CNN, das auf ImageNet vortrainiert ist und das Sie jetzt verwenden möchten, um Ihre linken Fußsocken von Ihren rechten Fußsocken zu unterscheiden (oder so etwas in der Art). Abhängig davon, wie viele Daten Sie haben, frieren Sie die letzten Schichten ein oder trainieren Sie das gesamte CNN auf Ihrem eigenen Sockendatensatz wieder – so weit, so gut. Aber es gibt andere Szenarien des Transferlernens, die, wenn nicht so allgegenwärtig, genauso wichtig⁵ sind.

Wenn wir statt von einer Aufgabe zur nächsten zu verallgemeinern (wie das Klassifizieren von Socken statt von Hunden und Katzen), möchten, dass unser Modell von einer Quell-Domäne zu einer Ziel-Domäne mit einer anderen Datenverteilung verallgemeinert, wird dies Domänenanpassung genannt. Um ein intuitives Verständnis dafür zu bekommen, warum dies ein schwieriges Problem sein könnte, stellen Sie sich zwei Datensätze mit nur Katzen und Hunden vor. Beide beinhalten 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. schlappe Ohren lernen, sondern nur, dass wenn es ein braunes Ding sieht, es ein Hund sein muss. Wenn ja, sollten wir nicht überrascht sein, wenn unsere Klassifizierungsgenauigkeit einen Schlag aus heiterem Himmel erleidet, wenn wir auf dem zweiten Datensatz testen⁶.
Die wichtigste Erkenntnis ist eine universelle Wahrheit des maschinellen Lernens: wenn sich Ihre Datenverteilung unter Ihrer Nase ändert, sind Sie wahrscheinlich in Schwierigkeiten.
BatchNorm will das alles nicht
Zurück zu BatchNorm und dem Googeln, was "Verringerung der internen Kovariatenverschiebung" bedeutet. "Interne Kovariatenverschiebung" ist nur ein hochtrabender Begriff für die Tatsache, dass sich die Eingangsverteilungen („Daten“) der Zwischenschichten von neuronalen Netzwerken während des Trainings ändern. Dies ist nicht überraschend, da der Eingang einer Zwischenschicht einfach der Ausgang der vorherigen Schicht ist und sich ihre Ausgabe auch ändert, sobald die Parameter dieser „Vor“-Schicht im Laufe der Zeit aktualisiert werden.
Anstatt zu versuchen, eine clevere Technik für "interne Domainsanpassung" zu finden, ist die geniale Lösung von Ioffe-Szegedy für dieses Problem sich ändernder Eingangsverteilungen einfach, es zu umgehen. Sie verwenden BatchNorm, um jeden Schichteingang zu normieren und voilà: kein Chaos mit formverändernden Verteilungen mehr.
Zum schnellen Nachschlagen hier ist der Algorithmus.

Es stellt sich heraus, dass die Verwendung von BatchNorm Ihr Modell auch robuster macht gegen weniger sorgfältige Gewichtsinitalisierung und größere Lernraten⁷. Und ein weiteres Extra:
I-S berichten, dass das Rauschen, das durch die Berechnung des Mittelwerts und der Varianz über jeden Mini-Batch anstelle des gesamten Trainingssatzes⁸ eingeführt wird, nicht nur schlechte Nachrichten sind, sondern als Regularisierung wirken und die Notwendigkeit zusätzlicher Dropout-Schichten vermeiden kann.
Warum BatchNorm Sie paranoid machen sollte
Sie wissen, 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, Alex Irpans Beitrag über die Gefahren von BatchNorm zu lesen. In jedem Fall hier ist meine Führungskraft-Zusammenfassung:
Wenn der Mittelwert des Mini-Batches (µB) und die Standardabweichung des Mini-Batches (σB) zu oft von dem Mittelwert und der Standardabweichung über den gesamten Trainingssatz abweichen, bricht BatchNorm zusammen. Denken Sie daran, dass zur Inferenzzeit die gleitenden Durchschnitte von µB und σB (als Schätzung der Statistiken des gesamten Trainingssatzes) verwendet werden, um den Normalisierungsschritt durchzuführen. Natürlich, wenn Ihre Mittelwerte und Standardabweichungen während des Trainings und des Tests unterschiedlich sind, sind auch Ihre Aktivierungen und Sie können nicht überrascht sein, wenn Ihre Ergebnisse ebenfalls unterschiedlich sind (lesen Sie schlechter). Dies kann passieren, wenn Ihre Mini-Batch-Proben nicht i.i.d. sind (oder in einfacher Sprache: wenn Ihr Auswahlverfahren voreingenommen ist – denken Sie daran, zuerst nur braune Hunde zu probieren und dann nur schwarze Hunde zu probieren) oder, häufiger, wenn Sie eine sehr kleine Batchgröße haben⁹. In beiden Fällen: Willkommen zurück im „Formverändernden Verteilungen“-Land.
BatchRenorm tritt auf den Plan
BatchRenorm geht das Problem der abweichenden Statistiken zur Trainings- und Inferenzzeit direkt an. Der entscheidende Einblick, um den Unterschied zu überbrücken, ist dieser:

Der Normalisierungsschritt zur Inferenzzeit (unter Verwendung von Schätzungen der Statistiken des Trainingssatzes µ und σ) kann tatsächlich als affine Transformation des Normalisierungsschritts zur Trainingszeit (unter Verwendung von Mini-Batch-Statistiken µB und σB) umgeschrieben werden! Und das ist im Grunde alles, was dazu gehört. Die Verwendung von Mini-Batch + affine Transformation zur Trainingszeit und gleitende Durchschnitte zur Inferenzzeit stellt sicher, dass die Ausgabe von BatchRenorm während beider Phasen gleich ist, selbst wenn σB != σ und µB != µ.
Hier ist der Algorithmus in seiner nicht-japanischen Gesamtheit.

Es ist interessant zu bemerken, dass Batch-Renormierung wirklich nur eine Verallgemeinerung von BatchNorm ist und zu seinem Vorgänger zurückkehrt, wenn σB == σ und µB == µ (bzw. r = 1 und d = 0). Dies führt uns zu der Frage, wann BatchRenorm verwendet werden soll und wann BatchNorm ausreichend ist?
BatchRenorm ≥ BatchNorm?
Die gute Nachricht ist, dass Sie sich in Bezug auf die Modellleistung darauf verlassen können, dass BatchRenorm immer besser oder gleich BatchNorm ist.

Allerdings ist die Verwendung von BatchRenorm mit dem zusätzlichen Kostenpunkt von zwei Hyperparametern verbunden (die im Untertitel unter dem BatchRenorm-Algorithmus diskutiert werden), für die Sie den richtigen Zeitplan finden müssen, um die beste Leistung zu erzielen. Da haben Sie es. Wie bei den meisten Dingen im Leben ist es ein Kompromiss zwischen Ihrer Zeit und der Leistung Ihres Modells. Wenn Sie die Abstimmung der Hyperparameter an Dinge wie die Bayes’sche Optimierung¹¹ ausgelagert haben, bleibt es zumindest immer noch ein Kompromiss zwischen Rechenressourcen und Leistung.
Ich persönlich werde ab jetzt BatchRenorm mit dem im Papier¹² erwähnten festen Zeitplan verwenden. Wenn ich sehr kleine Batchgrößen habe (oder eine seltsame Mini-Batch-Auswahlkuriosität wie in Irpans Beitrag) könnte ich mich dazu bringen, einige Hyperparametertunings selbst durchzuführen.
Lassen Sie mich wissen, wie es Ihnen geht.
[1] ^ Beachten Sie, dass ich wie, nicht warum gesagt habe. Für einen klaren, völlig nicht-technischen Bericht über die Funktionsweise von neuronalen Netzwerken ist dieser NYTimes-Artikel ein Muss. Er enthält auch ein urkomisches Zitat von Quoc V. Le, das – wenn Sie mich fragen – diesen alles durchdringenden Eindruck wunderbar einfängt, dass selbst wenn Sie die meisten Prinzipien und die Mathematik, die neuronalen Netzwerken zugrunde liegen, verstanden haben, es sich immer noch wie Zauberei anfühlt, wenn Ihr Inception-Resnet-v2 Ihren Hund erneut erfolgreich als Soft Coated Wheaten Terrier und nicht als, sagen wir, West Highland White Terrier klassifiziert [1a].
Vom Autor gedrängt, ein intuitives geistiges Bild von Wortemedding (wie Wort2vec oder GloVe) zu bekommen, antwortet Le kurz: „Gideon, […] Ich mag es im Allgemeinen nicht, tausenddimensionale Vektoren in einem dreidimensionalem Raum zu visualisieren.“
[1a] Offenlegung: Ich besitze keinen Terrier.
[2] ^ Freie Suche und ersetze mit EE, Stats, Physik, Mathe, etc.
[3] ^ Tatsächlich wurde das Ioffe-Szegedy-Papier, das die Idee der Batchnormalisierung einführte, 3397-mal zitiert (Stand: 20. Jan 2018). Dies bedeutet nicht unbedingt, dass 3397 Menschen versucht haben, auf den in 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 SOP in den meisten CNN-Architekturen geworden ist. Vorsichtshalber zitiere ich es genau hier und jetzt:
Ioffe, S., Szegedy, C., (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML.
[4] ^ Batch Renormalisierung 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 beim Lesen des ersten Satzes zu amüsieren. Wie auch immer, hier ist die Renormalisierung, mit der wir uns befassen:
Ioffe, S., (2017). Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models. NIPS.
[5] ^ Sebastian Ruder hat einen großartigen Blog-Beitrag über die verschiedenen Transferlern-Einstellungen geschrieben, mit viel präziseren Definitionen als denen, die ich hier verwende. Dort zitiert er auch Andrew Ng, der während seines NIPS 2016 Workshops vorhersagte, dass Transferlearning "der nächste Treiber des ML-Erfolgs" sein wird.
[6] ^ Ebenso könnten Sie sich vorstellen, dass wenn wir auf einem normalen Datensatz von Katzen und Hunden trainieren, aber Pech beim zufälligen Mastern haben und zuerst nur braune Hunde bekommen, es wahrscheinlich länger dauern wird, bis unser Modell geschickte Unterschiede wie spitze vs. schlappe Ohren lernt. Wir werden auf diese Idee zurückkommen, wenn wir darüber diskutieren, wie BatchNorm auf unerwartete Weise zusammenbrechen kann.
[7] ^ Eine einfache Logik, warum dies möglicherweise wahr ist, findet sich schnell im Batch Renormalization-Papier von Ioffe [4]:
Wenn x selbst das Ergebnis der Anwendung einer linearen Transformation W auf die vorherige Schicht ist, macht Batchnorm das Modell invariant gegenüber der Skala von W (ignoriert das kleine Epsilon).
Aber wenn die Skala von W keine Rolle spielt, dann ist eine ordnungsgemäße Gewichtsinitalisierung nicht so wichtig und größere Lernraten werden Ihr Training nicht so leicht brechen!
[8] ^ Wir können den Populationsmittelwert und die Varianz der Aktivierungen der Zwischenschichten nicht berechnen, da das Durchlaufen des gesamten Trainingssatzes nach jeder einzelnen Parameteraktualisierung den ganzen Zweck des stochastischen Gradientenabstiegs zunichte machen würde. Das scheint ziemlich einfach zu sein. Aber warum können wir nicht einfach die gleitenden Durchschnitte von Mittelwert und Varianz anstelle der Mini-Batch-Versionen verwenden, wenn wir die Normalisierung durchführen? Der Grund, finde ich, ist ziemlich subtil. Bitte beachten Sie: Wenn Sie noch nie von dieser Frage zur BatchNorm verfolgt wurden, ermutige ich Sie, den Rest dieser Fußnote zu überspringen, da sie sowohl ausführlich als auch etwas technisch ist.
Wenn Sie jemals den Rückwärtsdurchgang für BatchNorm selbst ableiten mussten, erinnern Sie sich vielleicht daran, dass der Grund, warum die Übung nicht ganz mühelos ist, darin besteht, dass der Mini-Batch-Mittelwert und die Varianz (offensichtlich) Funktionen der aktuellen Aktivierungen im Mini-Batch sind.
Natürlich trifft dies auch auf die gleitenden Durchschnitte zu. Nun, wenn Sie diese Abhängigkeit des Normalisierungsschritts (die Berechnung von σ und μ) von Ihren Mini-Batch-Eingaben ignorieren, während Sie Ihre Gradienten berechnen, wird Ihr Modell explodieren. Aber warum ist das so? I-S haben natürlich die Antwort:

Das Letzte, was hinzuzufügen ist, ist, dass wenn Sie die Abhängigkeit von E[x] von b berücksichtigen, Ihre Gradienten ∆b = 0 (gehen Sie ruhig und überprüfen Sie, ob dies wahr ist!) und Ihr Modell nicht explodieren wird. Yay! Zurück zum Geschäft mit gleitenden Durchschnitten: in TensorFlow werden sie mit dem Momentum α berechnet (in Worten: mean_moving_average = α * mean_moving_average + (1 − α) * mini_batch_mean). Wie Sie wahrscheinlich bereits sagen können, ist es zwar machbar, die Abhängigkeit des Mini-Batch-Mittelwerts von Ihren aktuellen Aktivierungen zu berücksichtigen, es gibt jedoch keine einfache Möglichkeit, die Gradienten des mean_moving_average in Bezug auf die Aktivierungen x zu berechnen (leider der Nachteil der Rekursion), sodass ∆b nicht gleich 0 ist, sodass b explodieren wird, und deshalb verwenden wir den mini-batch-Mittelwert und die Varianz und nicht die gleitenden Durchschnitte. So sieht's aus.
[9] ^ Kleine Batchgrößen führen zu einer hohen Varianz in µB und σB. Gehen Sie eins weiter (oder schlimmer): Im Extremfall einer Batchgröße von eins ist es nicht nur ein Problem unbeständiger Mittelwerte und Varianzen, sondern die Ausgabe von BatchNorm wird alle null sein!
[10] ^ Wenn wir das nicht tun würden, wären wir wieder bei demselben Problem, das in [8] diskutiert wurde. Wenn Sie r und d jedoch als Konstanten behandeln, können Sie die in [8] diskutierten Bewegungen durchlaufen und 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 Zeitplan für Hyperparameter:
Für Batch Renorm haben wir rmax = 1, dmax = 0 (d.h. einfach batchnorm) für die ersten 5000 Trainingsschritte verwendet, danach wurden diese allmählich entspannt, um rmax = 3 bei 40k Schritten und dmax = 5 bei 25k Schritten zu erreichen.















