Ich versuche Adversarial NN zu implementieren, die erfordert, den einen oder anderen Teil des Graphen während alternierender Trainingsminibatches 'einzufrieren'. I.e. zwei Teilnetze: G und D."Einfrieren" einiger Variablen/Bereiche in Tensorflow: stop_gradient vs Variablen übergeben, um zu minimieren
G(Z) -> Xz
D(X) -> Y
wo Verlustfunktion von G
auf D[G(Z)], D[X]
abhängt.
Zuerst muss ich Parameter in D mit allen G Parameter festgelegt trainieren, und dann Parameter in G mit Parametern in D fixiert. Die Verlustfunktion im ersten Fall ist eine negative Verlustfunktion im zweiten Fall und die Aktualisierung muss für die Parameter des ersten oder zweiten Teilnetzes gelten.
sah ich, dass tensorflow tf.stop_gradient
Funktion hat. Zum Zweck der Ausbildung der D (downstream) Sub-Netzwerk kann ich diese Funktion verwenden, um die Gradientenfluss zu
Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
Die tf.stop_gradient
ist sehr kurz und bündig kommentiert ohne in-line Beispiel zu blockieren (und Beispiel seq2seq.py
ist zu lang und nicht, dass leicht zu lesen), sieht aber so aus, als müsste es während der Graphenerstellung aufgerufen werden. Bedeutet dies, dass ich das Diagrammmodell neu erstellen und neu initialisieren muss, wenn ich Gradientenfluss in alternierenden Batches blockieren/entsperren möchte?
Auch scheint es, dass man kann nicht den Gradientenblock fließt durch das Netzwerk G (upstream) mittels tf.stop_gradient
, nicht wahr?
Als Alternative habe ich gesehen, dass man die Liste der Variablen an den Optimierer Anruf als opt_op = opt.minimize(cost, <list of variables>)
übergeben kann, was eine einfache Lösung wäre, wenn man alle Variablen in den Bereichen jedes Subnetzes bekommen könnte. Kann man einen <list of variables>
für ein tf.scope bekommen?
Ich benutze dieses Rezept zum Trainieren, und wenn ich Graphen in "Tensorboard" untersuche, sehe ich, dass mein Graph verdoppelt wird, z. Ich bekomme "Gradienten" und "Gradienten_1". Ist das Ergebnis erwartet? –