Ich benutze TensorFlow, um ein neuronales Netzwerk zu trainieren. So initialisiere ich GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
Die Sache hier ist, dass ich nicht weiß, wie ich eine Aktualisierungsregel für die Lernrate oder einen Abklingwert dafür festlegen soll.
Wie kann ich hier eine adaptive Lernrate verwenden?
python
tensorflow
Anzeigename
quelle
quelle
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Es scheint, dass zum Festlegen einer neuen Lernrate das Modell mit den bereits trainierten Variablen initialisiert werden muss. Aber ich kann nicht herausfinden, wie das geht.Antworten:
Zunächst
tf.train.GradientDescentOptimizer
soll eine konstante Lernrate für alle Variablen in allen Schritten verwendet werden. TensorFlow bietet auch sofort einsatzbereite adaptive Optimierer, einschließlich destf.train.AdagradOptimizer
und destf.train.AdamOptimizer
, und diese können als Ersatz verwendet werden.Wenn Sie jedoch die Lernrate mit einem ansonsten Vanille-Gradientenabstieg steuern möchten, können Sie die Tatsache nutzen, dass das
learning_rate
Argument an dentf.train.GradientDescentOptimizer
Konstruktor einTensor
Objekt sein kann. Auf diese Weise können Sie in jedem Schritt einen anderen Wert für die Lernrate berechnen, zum Beispiel:Alternativ können Sie einen Skalar erstellen
tf.Variable
, der die Lernrate enthält, und ihn jedes Mal zuweisen, wenn Sie die Lernrate ändern möchten.quelle
tf.clip_by_norm
akzeptiert keinen Tensor für die Clip-Norm, also wie wäre es[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, woct = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, ist das einzige, was es daran hindert, einen Tensor als Eingabe zu akzeptieren, dasconstant_op.constant(1.0 / clip_norm)
. Wenn Sie diesen Ausdruck durch ersetzen,math_ops.inv(clip_norm)
funktioniert er mit einem Platzhalter (oder einem anderen Tensor).)Tensorflow bietet eine Option zum automatischen Anwenden eines exponentiellen Abfalls auf einen Lernratentensor :
tf.train.exponential_decay
. Ein Beispiel für die Verwendung finden Sie in dieser Zeile im Beispiel für das MNIST-Faltungsmodell . Verwenden Sie dann den obigen Vorschlag von @ mrry, um diese Variable als Parameter learning_rate an den Optimierer Ihrer Wahl anzugeben.Der wichtigste Auszug ist:
Beachten Sie den
global_step=batch
zu minimierenden Parameter. Dadurch wird der Optimierer angewiesen, den Parameter "Batch" bei jedem Training hilfreich zu erhöhen.quelle
batch
aufgerufenglobal_step
und es gibt mehrere praktische Funktionen, eine zum Erstellentf.train.create_global_step()
(die einfach eine Ganzzahl erstellttf.Variable
und dertf.GraphKeys.GLOBAL_STEP
Sammlung hinzufügt ) undtf.train.get_global_step()
.Der Gradientenabstiegsalgorithmus verwendet die konstante Lernrate, die Sie während der Initialisierung angeben können . Sie können verschiedene Lernraten auf eine von Mrry gezeigte Weise bestehen.
Stattdessen können Sie aber auch erweiterte Optimierer verwenden, die eine schnellere Konvergenzrate aufweisen und sich an die Situation anpassen.
Hier ist eine kurze Erklärung, die auf meinem Verständnis basiert:
Adam oder adaptiver Impuls ist ein Algorithmus ähnlich wie AdaDelta. Zusätzlich zum Speichern der Lernraten für jeden der Parameter werden auch Impulsänderungen für jeden von ihnen separat gespeichert
Ein paar Visualisierungen :
quelle
Aus offiziellen Tensorflow- Dokumenten
quelle
Wenn Sie bestimmte Lernraten für Intervalle von Epochen wie einstellen möchten
0 < a < b < c < ...
. Anschließend können Sie Ihre Lernrate als bedingten Tensor definieren, der vom globalen Schritt abhängig ist, und diesen wie gewohnt dem Optimierer zuführen.Sie könnten dies mit einer Reihe verschachtelter
tf.cond
Anweisungen erreichen, aber es ist einfacher, den Tensor rekursiv zu erstellen:Um es dann verwenden zu können, müssen Sie wissen, wie viele Trainingsschritte es in einer einzelnen Epoche gibt, damit wir den globalen Schritt verwenden können, um zum richtigen Zeitpunkt zu wechseln und schließlich die gewünschten Epochen und Lernraten zu definieren. Wenn ich also die Lernraten
[0.1, 0.01, 0.001, 0.0001]
während der Epochenintervalle von[0, 19], [20, 59], [60, 99], [100, \infty]
jeweils möchte, würde ich tun:quelle