Betrachtet man den Beispielcode .
Ich würde gerne wissen, wie man Gradientenbeschneidungen in diesem Netzwerk auf dem RNN anwendet, wo die Möglichkeit besteht, dass Gradienten explodieren.
tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)
Dies ist ein Beispiel, das verwendet werden könnte, aber wo führe ich das ein? In der Def von RNN
lstm_cell = rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0)
# Split data because rnn cell needs a list of inputs for the RNN inner loop
_X = tf.split(0, n_steps, _X) # n_steps
tf.clip_by_value(_X, -1, 1, name=None)
Dies ist jedoch nicht sinnvoll, da der Tensor _X die Eingabe und nicht der Grad ist. Was soll abgeschnitten werden?
Muss ich dafür meinen eigenen Optimierer definieren oder gibt es eine einfachere Option?
quelle
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
und anschließend wird eine Iteration des Optimierers durchgeführt,optimizer.run()
aber die Verwendungoptimizer.run()
scheint in diesem Fall nicht zu funktionieren.optimizer.apply_gradients(capped_gvs)
muss etwas zugewiesen werden,x = optimizer.apply_gradients(capped_gvs)
dann können Sie innerhalb Ihrer Sitzung trainieren alsx.run(...)
UserWarning: Converting sparse IndexedSlices to a dense Tensor with 148331760 elements. This may consume a large amount of memory.
also irgendwie meine spärlichen Farbverläufe in dichte umgewandelt. Irgendeine Idee, wie man dieses Problem überwinden kann?tf.clip_by_global_norm
, wie von @danijarTrotz allem, was populär zu sein scheint, möchten Sie wahrscheinlich den gesamten Farbverlauf nach seiner globalen Norm abschneiden:
Das Abschneiden jeder Gradientenmatrix ändert einzeln ihre relative Skalierung, ist aber auch möglich:
In TensorFlow 2 berechnet ein Band die Farbverläufe, die Optimierer stammen von Keras, und wir müssen das Update nicht speichern, da es automatisch ausgeführt wird, ohne es an eine Sitzung zu übergeben:
quelle
clip_by_global_norm()
! Dies wird auch wiethe correct way to perform gradient clipping
in den Tensorflow-Dokumenten beschrieben: tensorflow.org/versions/r1.2/api_docs/python/tf/…tf.global_norm(gradients)
, um den üblichen Bereich zu sehen, und dann etwas darüber zu schneiden, um zu verhindern, dass Ausreißer das Training durcheinander bringen.opt.minimize()
oder würden Sie etwas anderes anrufen, wieopt.run()
es in einigen Kommentaren zu anderen Antworten vorgeschlagen wird?optimizer.minimize(loss)
ist nur eine Abkürzung zum Berechnen und Anwenden der Verläufe. Sie können das Beispiel in meiner Antwort mit ausführensess.run(optimize)
.tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
innerhalb einer Experimentfunktion verwendenoptimize
würde, würde Ihre meinetrain_op
korrekte ersetzen ? Im Momenttrain_op = optimizer.minimize(loss, global_step=global_step))
versuche ich sicherzustellen, dass ich mich entsprechendDies wird in der Dokumentation tatsächlich richtig erklärt. ::
In dem von ihnen bereitgestellten Beispiel verwenden sie diese drei Schritte:
Hier
MyCapper
ist jede Funktion, die Ihren Farbverlauf begrenzt. Die Liste der nützlichen Funktionen (außertf.clip_by_value()
) finden Sie hier .quelle
opt.minimize()
oder würden Sie etwas anderes anrufen, wieopt.run()
es in einigen Kommentaren zu anderen Antworten vorgeschlagen wird?opt.apply_gradients(...)
einer Variablen wietrain_step
zum Beispiel zuweisen (genau wie Sie es füropt.minimize()
sess.run([train_step, ...], feed_dict)
tf.clip_by_global_norm(list_of_tensors)
. B. mit ).Für diejenigen, die die Idee des Gradientenschneidens (nach Norm) verstehen möchten:
Immer wenn die Gradientennorm größer als ein bestimmter Schwellenwert ist, schneiden wir die Gradientennorm so ab, dass sie innerhalb des Schwellenwerts bleibt. Dieser Schwellenwert wird manchmal auf gesetzt
5
.Der Gradient sei g und der max_norm_threshold sei j .
Nun, wenn || g || > j , wir machen:
g = ( j * g ) / || g ||
Dies ist die Implementierung in
tf.clip_by_norm
quelle
IMO ist die beste Lösung, Ihren Optimierer mit dem Schätzer-Dekorator von TF zu versehen
tf.contrib.estimator.clip_gradients_by_norm
:Auf diese Weise müssen Sie dies nur einmal definieren und nicht nach jeder Gradientenberechnung ausführen.
Dokumentation: https://www.tensorflow.org/api_docs/python/tf/contrib/estimator/clip_gradients_by_norm
quelle
Gradient Clipping hilft im Grunde bei explodierenden oder verschwindenden Gradienten. Sagen Sie, Ihr Verlust ist zu hoch, was dazu führt, dass exponentielle Gradienten durch das Netzwerk fließen, was zu Nan-Werten führen kann. Um dies zu überwinden, schneiden wir Farbverläufe innerhalb eines bestimmten Bereichs (-1 bis 1 oder eines beliebigen Bereichs gemäß der Bedingung).
clipped_value=tf.clip_by_value(grad, -range, +range), var) for grad, var in grads_and_vars
Dabei sind Absolventen _und_vars die Gradientenpaare (die Sie über tf.compute_gradients berechnen) und ihre Variablen, auf die sie angewendet werden.
Nach dem Abschneiden wenden wir den Wert einfach mit einem Optimierer an.
optimizer.apply_gradients(clipped_value)
quelle