2016-09-25 4 views
29

Wenn ich Batch-Normalisierung und Dropout in TensorFlow verwende (speziell mit den contrib.layern) muss ich mir Sorgen um die Bestellung machen?Bestellung von Batch-Normalisierung und Dropout in TensorFlow?

Es scheint möglich, dass, wenn ich Dropout sofort gefolgt von Batch-Normalisierung verwenden, es Probleme geben könnte. Wenn beispielsweise die Verschiebung in der Chargennormalisierung zu den größeren Nummern der Trainingsausgaben führt, dann aber diese gleiche Verschiebung auf die kleineren (aufgrund der Kompensation für mehr Ausgaben) Staffelzahlen ohne Dropout während des Testens angewendet wird, dann gilt dies Schicht kann aus sein. Vermeidet die TensorFlow Batch-Normalisierungsschicht das automatisch? Oder passiert das nicht aus irgendeinem Grund, den ich vermisse?

Gibt es noch weitere Probleme bei der Verwendung dieser beiden zusammen? Angenommen, ich benutze sie in der richtigen Reihenfolge in Bezug auf die oben genannten (vorausgesetzt, ist eine korrekte Reihenfolge), könnte es Probleme mit der Verwendung sowohl Batch-Normalisierung und Dropout auf mehrere aufeinanderfolgende Schichten? Ich sehe nicht sofort ein Problem damit, aber ich vermisse etwas.

Vielen Dank!

UPDATE:

Ein experimenteller Test scheint darauf hinzudeuten, dass tut Sache der Bestellung. Ich habe das gleiche Netzwerk zweimal mit nur der Batch-Norm und Dropout-Reverse ausgeführt. Wenn der Dropout vor der Chargennorm liegt, scheint der Validierungsverlust zu steigen, da der Trainingsverlust sinkt. Sie gehen beide in dem anderen Fall unter. Aber in meinem Fall sind die Bewegungen langsam, also können sich die Dinge nach dem Training ändern und es ist nur ein einziger Test. Eine definitive und informierte Antwort würde immer noch geschätzt werden.

Antwort

32

In der Ioffe and Szegedy 2015 stellen die Autoren fest, dass "wir sicherstellen möchten, dass das Netzwerk für beliebige Parameterwerte immer Aktivierungen mit der gewünschten Verteilung erzeugt". Daher wird die Stapelnormalisierungsschicht tatsächlich direkt nach einer Conv-Schicht/vollständig verbundenen Schicht eingefügt, jedoch vor dem Einspeisen in ReLu (oder irgendeine andere Art von) Aktivierung. Siehe this video um etwa 53 Minuten für weitere Details.

Soweit Dropout geht, glaube ich, Dropout nach der Aktivierungsschicht angewendet wird. In der Figur 3b wird die Ausfallfaktor/Wahrscheinlichkeitsmatrix r (1) für die verborgene Schicht 1 auf y (1) angewendet, wobei y (l) das Ergebnis nach dem Anwenden der Aktivierungsfunktion f ist.

Also zusammenfassend, die Reihenfolge Chargen Normalisierung der Verwendung und Dropout ist:

-> CONV/FC -> BatchNorm -> relu (oder andere Aktivierung) -> Dropout -> CONV/FC ->

+5

Es scheint, dass selbst Christian Szegedy nun BatchNorm nach der ReLU (nicht davor) ausführt. Zitat von F. Chollet, dem Autor von Keras: "Ich bin nicht zurückgegangen, um zu überprüfen, was sie in ihrer ursprünglichen Arbeit vorschlagen, aber ich kann garantieren, dass neuerer Code, der von Christian geschrieben wurde, Relg vor BN anwendet. Es ist immer noch gelegentlich ein Thema der Debatte jedoch. " [source] (https://github.com/fchollet/keras/issues/1802#issuecomment-187966878) – pseudomarvin

+0

Aus dem gleichen Thread wie @pseudomarvin bietet, hier sind einige Ergebnisse aus der Platzierung der Batch-Normalisierung vor und nach der ReLU. Diese Ergebnisse zeigen, dass * nach * die ReLU besser ist: [Ergebnisse] (https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md#bn~vor- oder-nach -Relu) – golmschenk

+0

Was ist mit Pooling, würde das zwischen Batchnorm und der Aktivierung gehen? – wordsforthewise

Verwandte Themen