Erklärung der Spitzen bei Trainingsverlust im Vergleich zu Iterationen mit Adam Optimizer

15

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-8und ein batch_size = 32.

i) Mit SGD ii) Mit AdamMit SGD Mit Adam

Abdul Fatir
quelle
Für zukünftige Hinweise kann eine Senkung Ihrer anfänglichen Lernrate dazu beitragen, Spitzen in Adam zu beseitigen
fett am

Antworten:

12

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 Verwendung batch_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:

Kostenfunktionen

xboard
quelle
2
"SGD ... verwendet alle Trainingsdaten" - sind Sie sich dessen sicher? Dies bedeutet, dass die Gewichte aktualisiert werden, nachdem alle Daten weitergeleitet wurden. Dies wird jedoch als Full-Batch-gd und nicht als sgd bezeichnet. Stochastisch impliziert Minibatch
Alex
Vielen Dank an @Alex, dass Sie auf meinen Fehler hingewiesen haben. Ich habe ihn bereits behoben und die Antwort mit Bezug auf weitere Informationen verbessert.
xboard
@xboard - Nein, ich verwende für den ersten einen Mini-Batch-Gradientenabstieg.
Abdul Fatir
6

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.

  • Verlustabhängig. Loglikelihood-Verluste müssen abgeschnitten werden. Wenn dies nicht der Fall ist, werden möglicherweise 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.
  • Ausreißer im Datensatz.
  • ϵy=(xu)/(s+ϵ)sϵy
  • Der endgültige Stapel in einer Epoche kann klein sein, wenn der Datensatz nach Stapelgröße nicht teilbar ist. Im Fackeldatenlader gibt es eine Flagge drop_last. Kleine Chargengröße = hohe Varianz

Warum 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+1Schritte 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.

ragulpr
quelle