Ich trainiere ein neuronales Netzwerk mit i) SGD und ii) Adam Optimizer. Bei Verwendung von normalem SGD erhalte ich eine glatte Kurve zwischen Trainingsverlust und Iteration (siehe unten) (die rote). Wenn ich jedoch den Adam Optimizer verwendet habe, weist die Trainingsverlustkurve einige Spitzen auf. Was ist die Erklärung für diese Spitzen?
Modelldetails:
14 Eingangsknoten -> 2 versteckte Ebenen (100 -> 40 Einheiten) -> 4 Ausgabeeinheiten
Ich verwende Standardparameter für Adam beta_1 = 0.9
, beta_2 = 0.999
, epsilon = 1e-8
und ein batch_size = 32
.
neural-networks
deep-learning
adam
Abdul Fatir
quelle
quelle
Antworten:
Die Spitzen sind eine unvermeidbare Folge des Mini-Batch-Gradientenabfalls in Adam (
batch_size=32
). Einige Mini-Batches haben zufällig unglückliche Daten für die Optimierung, wodurch die Spitzen induziert werden, die Sie in Ihrer Kostenfunktion mit Adam sehen. Wenn Sie einen stochastischen Gradientenabstieg versuchen (wie bei der Verwendungbatch_size=1
), werden Sie feststellen, dass die Kostenfunktion noch mehr Spitzen enthält. Dasselbe passiert in (Voll-) Batch-GD nicht, da alle Trainingsdaten (dh die Batch-Größe entspricht der Kardinalität Ihres Trainingssatzes) in jeder Optimierungsepoche verwendet werden. Wie in Ihrer ersten Grafik sinken die Kosten monoton reibungslos. Es scheint, dass der Titel ( i) Mit SGD ) falsch ist und Sie anstelle von SGD den (vollständigen) Batch-Gradientenabstieg verwenden.In seinem großartigen Deep Learning-Kurs bei Coursera erklärt Andrew Ng dies anhand des folgenden Bildes ausführlich:
quelle
Ich habe wahnsinnig viel Zeit damit verbracht, explodierende Farbverläufe und ähnliches Verhalten zu debuggen. Ihre Antwort hängt von der Verlustfunktion, den Daten, der Architektur usw. ab. Es gibt Hunderte von Gründen. Ich werde einige nennen.
log(0)
schlechte Vorhersagen / Ausreißer im Datensatz ermittelt, was zu explodierenden Gradienten führt. Die meisten Pakete (Brenner, Tensorflow usw.) implementieren standardmäßig Clipping für ihre Verluste.drop_last
. Kleine Chargengröße = hohe VarianzWarum sehen Sie das bei Adam und nicht bei SGD? Offensichtlich haben Sie mit Adam einen geringeren Verlust erreicht. Wie bereits erwähnt, können 99,9% des Datensatzes zu einem bestimmten Zeitpunkt Optima aufweisen, mit Ausnahme einiger Beobachtungen. Dies kann die Beobachtung sein, die "NEIN" schreit und aus den lokalen Minima herausspringt, wenn sie zufällig zu einer Charge ausgewählt werden. Wenn Sie es alle
dataset_size//batch_size+1
Schritte sehen, liegt es wahrscheinlich daran, dass die endgültige Chargengröße klein ist. Ich wette, Sie werden auch einen SGD-Anstieg sehen, wenn Sie ihn einen geringeren Verlust erreichen lassen.Bonus: Ihre wirklich schnelle Abnahme mit dem Momentum-Optimierer (Adam) könnte bedeuten, dass eine Ebene (Eingabeebene? Ausgabeebene?) Außerhalb des Maßstabs (auf große / kleine Gewichte) initialisiert wird.
quelle