Die Sache hier ist, dass ich nicht weiß, wie man eine Aktualisierungsregel für die Lernrate oder einen Abklingwert dafür festlegt.
Wie kann ich hier eine adaptive Lernrate verwenden?
Es ist eine gute Angewohnheit, alle Variablen zu initialisieren nach Sie geben Ihren Optimierer an, da einige Optimierer wie AdamOptimizer eigene Variablen verwenden, die ebenfalls initialisiert werden müssen. Andernfalls erhalten Sie möglicherweise einen Fehler, der wie folgt aussieht: FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
– JYun
7. Februar ’18 um 0:02
Ich erhalte diesen oben genannten Fehler, wenn ich versuche, eine neue Lernrate in Tensorflow einzustellen von tf.train.GradientDescentOptimizer(new_lr).minimize(loss). Es scheint, dass das Festlegen einer neuen Lernrate die Initialisierung des Modells mit den bereits trainierten Variablen erfordert. Kann aber nicht rausfinden wie das geht.
– Siladittya
31. März ’18 um 13:00
mrry
Zunächst, tf.train.GradientDescentOptimizer wurde entwickelt, um eine konstante Lernrate für alle Variablen in allen Schritten zu verwenden. TensorFlow bietet auch sofort einsatzbereite adaptive Optimierer, einschließlich der tf.train.AdagradOptimizer und das tf.train.AdamOptimizer, und diese können als Drop-in-Ersatz verwendet werden.
Wenn Sie jedoch die Lernrate mit dem ansonsten Vanille-Gradientenabstieg steuern möchten, können Sie sich die Tatsache zunutze machen, dass die learning_rate Argument gegen die tf.train.GradientDescentOptimizer Konstrukteur kann sein Tensor Objekt. Auf diese Weise können Sie in jedem Schritt einen anderen Wert für die Lernrate berechnen, zum Beispiel:
learning_rate = tf.placeholder(tf.float32, shape=[])
# ...
train_step = tf.train.GradientDescentOptimizer(
learning_rate=learning_rate).minimize(mse)
sess = tf.Session()
# Feed different values for learning rate to each training step.
sess.run(train_step, feed_dict={learning_rate: 0.1})
sess.run(train_step, feed_dict={learning_rate: 0.1})
sess.run(train_step, feed_dict={learning_rate: 0.01})
sess.run(train_step, feed_dict={learning_rate: 0.01})
Alternativ können Sie einen Skalar erstellen tf.Variable die die Lernrate enthält, und weisen Sie sie jedes Mal zu, wenn Sie die Lernrate ändern möchten.
Gute Antwort. Kann dieselbe Technik für das Beschneiden von Farbverläufen verwendet werden? tf.clip_by_norm akzeptiert keinen Tensor für die Clipnorm, also wie wäre es mit? [(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)], wo ct = tf.placeholder('float32', shape=[])
– richizy
21. Dezember ’15 um 4:42
Das sollte funktionieren, ja. (Obwohl es sich anschaut tf.clip_by_norm, das einzige, was es daran hindert, einen Tensor als Eingabe zu akzeptieren, ist die constant_op.constant(1.0 / clip_norm). Ersetze diesen Ausdruck durch math_ops.inv(clip_norm) würde es mit einer Platzhaltereingabe (oder einem anderen Tensor) funktionieren lassen.)
– mrry
21. Dezember ’15 um 5:57
@mrry Ich habe es wie gesagt gemacht und irgendwie ist die Trainingsgeschwindigkeit viel langsamer. Wird es bitte erwartet?
– tnq177
17. September ’18 um 14:05
dga
Tensorflow bietet eine Option zum automatischen Anwenden eines exponentiellen Abfalls auf einen Lernratentensor: tf.train.exponential_decay. Ein Anwendungsbeispiel finden Sie unter diese Zeile im Beispiel des MNIST-Faltungsmodells. Verwenden Sie dann den obigen Vorschlag von @mrry, um diese Variable als Parameter für die Lernrate an Ihren Optimierer Ihrer Wahl zu übergeben.
Der wichtigste Auszug ist:
# Optimizer: set up a variable that's incremented once per batch and
# controls the learning rate decay.
batch = tf.Variable(0)
learning_rate = tf.train.exponential_decay(
0.01, # Base learning rate.
batch * BATCH_SIZE, # Current index into the dataset.
train_size, # Decay step.
0.95, # Decay rate.
staircase=True)
# Use simple momentum for the optimization.
optimizer = tf.train.MomentumOptimizer(learning_rate,
0.9).minimize(loss,
global_step=batch)
Beachten Sie das global_step=batch Parameter zu minimieren. Das weist den Optimierer an, den Parameter ‘batch’ bei jedem Training hilfreich für Sie zu erhöhen.
Normalerweise ist die Variable, die Sie aufrufen batch wird genannt global_step und es gibt mehrere Komfortfunktionen, eine zum Erstellen tf.train.create_global_step() (was einfach eine ganze Zahl erzeugt tf.Variable und fügt es dem hinzu tf.GraphKeys.GLOBAL_STEP Sammlung) und tf.train.get_global_step().
– Lenar Hoyt
31. August ’17 um 1:39
Salvador Dali
Der Gradientenabstiegsalgorithmus verwendet die konstante Lernrate, die Sie in . bereitstellen können während der Initialisierung. Sie können verschiedene Lernraten auf eine von Mrry gezeigte Weise bestehen.
Aber stattdessen kannst du auch verwenden fortgeschrittenere Optimierer die eine schnellere Konvergenzrate haben und sich der Situation anpasst.
Hier eine kurze Erklärung nach meinem Verständnis:
Schwunghilft SGD navigiert entlang der relevanten Richtungen und mildert die Schwingungen im Unwichtigen. Es fügt einfach einen Bruchteil der Richtung des vorherigen Schritts zu einem aktuellen Schritt hinzu. Dadurch wird die Geschwindigkeitsverstärkung in die richtige Richtung erreicht und Schwingungen in die falsche Richtung abgeschwächt. Dieser Bruchteil liegt normalerweise im Bereich (0, 1). Es ist auch sinnvoll, adaptives Momentum zu verwenden. Zu Beginn des Lernens wird ein großer Schwung nur Ihren Fortschritt behindern, daher ist es sinnvoll, etwa 0,01 zu verwenden, und wenn alle hohen Gradienten verschwunden sind, können Sie einen größeren Schwung verwenden. Beim Momentum gibt es ein Problem: Wenn wir dem Ziel sehr nahe sind, ist unser Momentum in den meisten Fällen sehr hoch und es weiß nicht, dass es sich verlangsamen soll. Dies kann dazu führen, dass es die Minima verfehlt oder um die Minima schwingt
Nesterov-beschleunigter Gradient behebt dieses Problem, indem es frühzeitig beginnt, langsamer zu werden. Im Momentum berechnen wir zuerst den Gradienten und machen dann einen Sprung in diese Richtung, verstärkt durch das Momentum, das wir zuvor hatten. NAG macht dasselbe, aber in einer anderen Reihenfolge: Zuerst machen wir einen großen Sprung basierend auf unseren gespeicherten Informationen, dann berechnen wir die Steigung und nehmen eine kleine Korrektur vor. Diese scheinbar irrelevante Änderung führt zu erheblichen praktischen Beschleunigungen.
AdaGrad oder adaptiver Gradient ermöglicht die Anpassung der Lernrate basierend auf Parametern. Es führt größere Updates für seltene Parameter und kleinere Updates für häufige durch. Aus diesem Grund ist es gut geeignet für spärliche Daten (NLP oder Bilderkennung). Ein weiterer Vorteil besteht darin, dass die Lernrate grundsätzlich nicht angepasst werden muss. Jeder Parameter hat seine eigene Lernrate und aufgrund der Besonderheiten des Algorithmus nimmt die Lernrate monoton ab. Dies verursacht das größte Problem: Irgendwann ist die Lernrate so gering, dass das System aufhört zu lernen
AdaDelta löst das Problem der monoton abnehmenden Lernrate in AdaGrad. In AdaGrad wurde die Lernrate ungefähr als eins dividiert durch die Summe der Quadratwurzeln berechnet. In jeder Phase addieren Sie eine weitere Quadratwurzel zur Summe, wodurch der Nenner ständig kleiner wird. In AdaDelta verwendet es, anstatt alle vergangenen Quadratwurzeln zu summieren, ein Schiebefenster, das es ermöglicht, die Summe zu verringern. RMSprop ist AdaDelta . sehr ähnlich
Adam oder adaptives Momentum ist ein Algorithmus ähnlich AdaDelta. Aber zusätzlich zum Speichern der Lernraten für jeden der Parameter speichert es auch Impulsänderungen für jeden von ihnen separat
@DimaLituiev können Sie zwei Optimierer gleichzeitig verwenden? Wenn nein, verwenden Sie Optimierer1 anstelle von Optimierer2.
– Salvador Dali
14. März ’18 um 2:08
das ist nicht das, was ich sage, und das war hier auch nicht die Frage. Sie schlagen vor, erweiterte Optimierer anstelle der adaptiven Lernrate zu verwenden. Ich sage, Sie würden lieber erweiterte Optimierer zusätzlich zur adaptiven Lernrate verwenden
global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
100000, 0.96, staircase=True)
# Passing global_step to minimize() will increment it at each step.
learning_step = (
tf.train.GradientDescentOptimizer(learning_rate)
.minimize(...my loss..., global_step=global_step))
Wenn Sie bestimmte Lernraten für Intervalle von Epochen wie 0 < a < b < c < .... Dann können Sie Ihre Lernrate als bedingten Tensor, bedingt vom globalen Schritt, definieren und diesen wie gewohnt dem Optimierer zuführen.
Sie könnten dies mit einer Reihe von verschachtelten tf.cond -Anweisungen, aber es ist einfacher, den Tensor rekursiv aufzubauen:
Dann müssen Sie für die Nutzung wissen, wie viele Trainingsschritte es in einer einzelnen Epoche gibt, damit wir mit dem globalen Schritt zum richtigen Zeitpunkt wechseln und schließlich die gewünschten Epochen und Lernraten definieren können. Also wenn ich die Lernraten will [0.1, 0.01, 0.001, 0.0001] während der Epochenintervalle von [0, 19], [20, 59], [60, 99], [100, infty] bzw. würde ich tun:
Es ist eine gute Angewohnheit, alle Variablen zu initialisieren nach Sie geben Ihren Optimierer an, da einige Optimierer wie AdamOptimizer eigene Variablen verwenden, die ebenfalls initialisiert werden müssen. Andernfalls erhalten Sie möglicherweise einen Fehler, der wie folgt aussieht:
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
– JYun
7. Februar ’18 um 0:02
Ich erhalte diesen oben genannten Fehler, wenn ich versuche, eine neue Lernrate in Tensorflow einzustellen von
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Es scheint, dass das Festlegen einer neuen Lernrate die Initialisierung des Modells mit den bereits trainierten Variablen erfordert. Kann aber nicht rausfinden wie das geht.– Siladittya
31. März ’18 um 13:00