Die ursprüngliche Frage bezog sich speziell auf TensorFlow-Implementierungen. Die Antworten beziehen sich jedoch auf Implementierungen im Allgemeinen. Diese allgemeine Antwort ist auch die richtige Antwort für TensorFlow.
Muss ich mir bei der Verwendung von Batch-Normalisierung und Dropout in TensorFlow (insbesondere unter Verwendung der Contrib.Layer) Sorgen um die Bestellung machen?
Es scheint möglich, dass es Probleme gibt, wenn ich Dropout gefolgt von einer Batch-Normalisierung verwende. Wenn beispielsweise die Verschiebung in der Chargennormalisierung auf die größeren Skalennummern der Trainingsausgaben umgestellt wird, diese Verschiebung jedoch auf die kleineren Skalennummern (aufgrund der Kompensation für mehr Ausgaben) ohne Ausfall während des Tests angewendet wird, dann ist dies der Fall Schaltung kann ausgeschaltet sein. Kompensiert die TensorFlow-Chargennormalisierungsschicht dies automatisch? Oder passiert das nicht aus irgendeinem Grund, den ich vermisse?
Gibt es auch andere Fallstricke, auf die Sie achten müssen, wenn Sie diese beiden zusammen verwenden? Wenn Sie beispielsweise davon ausgehen, dass ich sie in der oben genannten Reihenfolge in der richtigen Reihenfolge verwende (vorausgesetzt, es liegt eine korrekte Reihenfolge vor), kann es dann zu Problemen bei der Verwendung von Batch-Normalisierung und Dropout auf mehreren aufeinanderfolgenden Ebenen kommen? Ich sehe nicht sofort ein Problem damit, aber mir fehlt möglicherweise etwas.
Vielen Dank!
AKTUALISIEREN:
Ein experimenteller Test scheint zu zeigen , dass Ordnung tut Angelegenheit. Ich habe dasselbe Netzwerk zweimal mit nur der Batch-Norm und dem umgekehrten Ausfall betrieben. Wenn der Ausfall vor der Chargennorm liegt, scheint der Validierungsverlust zu steigen, da der Trainingsverlust sinkt. Im anderen Fall gehen sie beide unter. Aber in meinem Fall sind die Bewegungen langsam, so dass sich die Dinge nach mehr Training ändern können und es nur ein einziger Test ist. Eine endgültigere und fundiertere Antwort wäre weiterhin willkommen.
quelle
Wie in den Kommentaren erwähnt, eine erstaunliche Ressource in der Größenordnung von Schichten zu lesen , ist hier . Ich habe die Kommentare durchgesehen und es ist die beste Ressource zum Thema, die ich im Internet gefunden habe
Meine 2 Cent:
Dropout soll Informationen von bestimmten Neuronen vollständig blockieren, um sicherzustellen, dass sich die Neuronen nicht gemeinsam anpassen. Die Batch-Normalisierung muss also nach dem Ausfall erfolgen, da Sie sonst Informationen durch die Normalisierungsstatistik weiterleiten.
Wenn Sie darüber nachdenken, berechnen wir bei typischen ML-Problemen nicht den Mittelwert und die Standardabweichung über die gesamten Daten und teilen sie dann in Zug-, Test- und Validierungssätze auf. Wir teilen und berechnen dann die Statistiken über den Zugsatz und verwenden sie, um die Validierungs- und Testdatensätze zu normalisieren und zu zentrieren
daher schlage ich Schema 1 vor (dies berücksichtigt Pseudomarvins Kommentar zur akzeptierten Antwort)
-> CONV / FC -> ReLu (oder andere Aktivierung) -> Dropout -> BatchNorm -> CONV / FC
im Gegensatz zu Schema 2
-> CONV / FC -> BatchNorm -> ReLu (oder andere Aktivierung) -> Dropout -> CONV / FC -> in der akzeptierten Antwort
Bitte beachten Sie, dass dies bedeutet, dass das Netzwerk unter Schema 2 im Vergleich zum Netzwerk unter Schema 1 eine Überanpassung aufweisen sollte, OP jedoch einige Tests wie in Frage gestellt durchgeführt hat und Schema 2 unterstützt
quelle
Normalerweise lassen Sie einfach die
Dropout
(wenn Sie habenBN
) fallen:Dropout
in einigen Fällen überflüssig, weil BN intuitiv ähnliche Regularisierungsvorteile bietet wie Dropout intuitiv."Dropout
Weitere Einzelheiten finden Sie in diesem Artikel [ Verständnis der Disharmonie zwischen Dropout und Chargennormalisierung durch Varianzverschiebung], wie bereits von @Haramoz in den Kommentaren erwähnt.
quelle
what about MLPs is it useful to combine them
, meinen Sie , dassIs it useful to combine Dropout and BN when using MLPs
? Mein Gefühl dabei ist, dass es hauptsächlich von der Größe Ihres Modells und der Menge Ihrer Trainingsdaten abhängt.Ich habe ein Papier gefunden, das die Disharmonie zwischen Dropout und Batch Norm (BN) erklärt. Die Schlüsselidee ist das, was sie "Varianzverschiebung" nennen . Dies ist auf die Tatsache zurückzuführen, dass Dropout zwischen Trainings- und Testphase ein anderes Verhalten aufweist, wodurch sich die von BN gelernten Eingabestatistiken verschieben. Die Hauptidee findet sich in dieser Abbildung, die diesem Papier entnommen ist .
Eine kleine Demo zu diesem Effekt finden Sie in diesem Notizbuch .
quelle
Basierend auf dem Forschungsbericht für eine bessere Leistung sollten wir BN verwenden, bevor wir Dropouts anwenden
quelle
Die richtige Reihenfolge lautet: Conv> Normalisierung> Aktivierung> Dropout> Pooling
quelle
Conv - Activation - DropOut - BatchNorm - Pool -> Test_loss: 0.04261355847120285
Conv - Activation - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396
Conv - Activation - BatchNorm - Pool - DropOut -> Test_loss: 0.04911309853196144
Conv - Activation - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665
Conv - BatchNorm - Aktivierung - DropOut - Pool -> Test_loss: 0.038886815309524536
Conv - BatchNorm - Aktivierung - Pool - DropOut -> Test_loss: 0.04126095026731491
Conv - BatchNorm - DropOut - Aktivierung - Pool -> Testverlust: 0.05142546817660332
Conv - DropOut - Aktivierung - BatchNorm - Pool -> Test_loss: 0.04827788099646568
Conv - DropOut - Aktivierung - Pool - BatchNorm -> Test_loss: 0.04722036048769951
Conv - DropOut - BatchNorm - Aktivierung - Pool -> Testverlust: 0.03238215297460556
Trainiert auf dem MNIST-Datensatz (20 Epochen) mit 2 Faltungsmodulen (siehe unten), gefolgt von jeweils mit
Die Faltungsschichten haben eine Kernelgröße von
(3,3)
Standardauffüllung, die Aktivierung istelu
. Das Pooling ist ein MaxPooling des Pools(2,2)
. Verlust istcategorical_crossentropy
und der Optimierer istadam
.Die entsprechende Dropout Wahrscheinlichkeit ist
0.2
oder0.3
sind. Die Menge an Features Maps32
oder64
ist.Bearbeiten: Wenn ich das Dropout fallen ließ, wie in einigen Antworten empfohlen, konvergierte es schneller, hatte aber eine schlechtere Generalisierungsfähigkeit als bei Verwendung von BatchNorm und Dropout.
quelle
ConV / FC - BN - Sigmoid / Tanh - Ausfall. Wenn die Aktivierungsfunktion Relu oder eine andere Funktion ist, hängt die Reihenfolge der Normalisierung und des Abbrechens von Ihrer Aufgabe ab
quelle
Ich habe die empfohlenen Artikel in der Antwort und den Kommentaren von https://stackoverflow.com/a/40295999/8625228 gelesen
Verwenden Sie aus Sicht von Ioffe und Szegedy (2015) nur BN in der Netzwerkstruktur. Li et al. (2018) geben die statistischen und experimentellen Analysen an, dass es eine Varianzverschiebung gibt, wenn die Praktiker Dropout vor BN verwenden. So haben Li et al. (2018) empfehlen, Dropout nach allen BN-Schichten anzuwenden.
Aus Sicht von Ioffe und Szegedy (2015) befindet sich BN innerhalb / vor der Aktivierungsfunktion. Chen et al. (2019) verwenden eine IC-Schicht, die Dropout und BN kombiniert, und Chen et al. (2019) empfiehlt die Verwendung von BN nach ReLU.
Aus Sicherheitsgründen verwende ich Dropout oder BN nur im Netzwerk.
Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao und Shengyu Zhang. 2019. „Überdenken der Verwendung von Chargennormalisierung und -abbruch beim Training tiefer neuronaler Netze.“ AdRR abs / 1905.05928. http://arxiv.org/abs/1905.05928 .
Ioffe, Sergey und Christian Szegedy. 2015. „Chargennormalisierung: Beschleunigung des tiefen Netzwerktrainings durch Reduzierung der internen Kovariatenverschiebung.“ AdRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .
Li, Xiang, Shuo Chen, Xiaolin Hu und Jian Yang. 2018. „Die Disharmonie zwischen Ausfall und Chargennormalisierung durch Varianzverschiebung verstehen.“ AdRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .
quelle