Unterschied zwischen GradientDescentOptimizer und AdamOptimizer (TensorFlow)?

45

Ich habe ein einfaches MLP in TensorFlow geschrieben, das ein XOR-Gate modelliert .

So für:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

es sollte folgendes erzeugen:

output_data = [[0.], [1.], [1.], [0.]]

Das Netzwerk hat eine Eingangsschicht, eine versteckte Schicht und eine Ausgangsschicht mit jeweils 2, 5 und 1 Neuronen.

Derzeit habe ich folgende Kreuzentropie:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

Ich habe auch diese einfachere Alternative ausprobiert:

cross_entropy = tf.square(n_output - output)

zusammen mit einigen anderen Versuchen.


Unabhängig von meinem Setup GradientDescentOptimizerverringerte sich der Fehler mit a jedoch viel langsamer als mit a AdamOptimizer.

Tatsächlich tf.train.AdamOptimizer(0.01)wurden nach 400-800 Lernschritten (in Abhängigkeit von der Lernrate, wo 0.01die besten Ergebnisse erzielt wurden) wirklich gute Ergebnisse erzielt, während tf.train.GradientDescentOptimizerimmer mehr als 2000 Lernschritte benötigt wurden, unabhängig davon, welche Kreuzentropieberechnung oder Lernrate verwendet wurde.

Warum ist das so? Es scheint, dass das AdamOptimizerimmer eine bessere Wahl ist ?!

daniel451
quelle
2
Der Adam-Optimierer ist ausgefeilter als der Gradientenabstieg (er basiert auf diesem Artikel ).
Marc Claesen

Antworten:

77

Der tf.train.AdamOptimizerverwendet den Adam-Algorithmus von Kingma und Ba , um die Lernrate zu steuern. Adam bietet mehrere Vorteile gegenüber dem Einfachen tf.train.GradientDescentOptimizer. In erster Linie werden gleitende Durchschnitte der Parameter (Impuls) verwendet. Bengio diskutiert die Gründe, warum dies von Vorteil ist, in Abschnitt 3.1.1 dieses Papiers . Einfach ausgedrückt ermöglicht dies Adam, eine größere effektive Schrittgröße zu verwenden, und der Algorithmus wird ohne Feinabstimmung zu dieser Schrittgröße konvergieren.

Der Hauptnachteil des Algorithmus besteht darin, dass Adam für jeden Parameter in jedem Trainingsschritt mehr Berechnungen durchführen muss (um die gleitenden Durchschnitte und die Varianz beizubehalten und den skalierten Gradienten zu berechnen). und mehr Zustand, der für jeden Parameter beizubehalten ist (ungefähr Verdreifachung der Größe des Modells, um den Durchschnitt und die Varianz für jeden Parameter zu speichern). Ein einfaches tf.train.GradientDescentOptimizerElement könnte ebenfalls in Ihrem MLP verwendet werden, würde jedoch mehr Hyperparameter-Tuning erfordern, bevor es so schnell konvergiert.

mrry
quelle
5
Danke für diese Antwort! Könnten Sie hinzufügen, was genau Sie meinen, wenn Sie über " Hyperparameter-Tuning " sprechen ?
Daniel451
12
Entschuldigung für den Jargon! In etwa meinte ich "das learning_rateArgument für den tf.train.GradientDescentOptimizerKonstruktor so lange ändern, bis es schneller konvergiert". :)
Mrry