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 GradientDescentOptimizer
verringerte 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.01
die besten Ergebnisse erzielt wurden) wirklich gute Ergebnisse erzielt, während tf.train.GradientDescentOptimizer
immer mehr als 2000 Lernschritte benötigt wurden, unabhängig davon, welche Kreuzentropieberechnung oder Lernrate verwendet wurde.
Warum ist das so? Es scheint, dass das AdamOptimizer
immer eine bessere Wahl ist ?!
Antworten:
Der
tf.train.AdamOptimizer
verwendet den Adam-Algorithmus von Kingma und Ba , um die Lernrate zu steuern. Adam bietet mehrere Vorteile gegenüber dem Einfachentf.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.GradientDescentOptimizer
Element könnte ebenfalls in Ihrem MLP verwendet werden, würde jedoch mehr Hyperparameter-Tuning erfordern, bevor es so schnell konvergiert.quelle
learning_rate
Argument für dentf.train.GradientDescentOptimizer
Konstruktor so lange ändern, bis es schneller konvergiert". :)