Im MuZero-Papierpseudocode haben sie die folgende Codezeile:

hidden_state = tf.scale_gradient(hidden_state, 0.5) 

Was macht das? Warum ist es dort?

Ich habe nach tf.scale_gradient gesucht und es existiert nicht im Tensorflow. Und im Gegensatz zu scalar_loss scheinen sie es nicht in ihrem eigenen Code definiert zu haben.

Für den Kontext ist hier die gesamte Funktion:

def update_weights(optimizer: tf.train.Optimizer, network: Network, batch, weight_decay: float): loss = 0 for image, actions, targets in batch: # Initial step, from the real observation. value, reward, policy_logits, hidden_state = network.initial_inference( image) predictions = [(1.0, value, reward, policy_logits)] # Recurrent steps, from action and previous hidden state. for action in actions: value, reward, policy_logits, hidden_state = network.recurrent_inference( hidden_state, action) predictions.append((1.0 / len(actions), value, reward, policy_logits)) # THIS LINE HERE hidden_state = tf.scale_gradient(hidden_state, 0.5) for prediction, target in zip(predictions, targets): gradient_scale, value, reward, policy_logits = prediction target_value, target_reward, target_policy = target l = ( scalar_loss(value, target_value) + scalar_loss(reward, target_reward) + tf.nn.softmax_cross_entropy_with_logits( logits=policy_logits, labels=target_policy)) # AND AGAIN HERE loss += tf.scale_gradient(l, gradient_scale) for weights in network.get_weights(): loss += weight_decay * tf.nn.l2_loss(weights) optimizer.minimize(loss) 

Was bewirkt die Skalierung des Verlaufs und warum wird er dort ausgeführt?

Kommentare

  • Ich habe auf der Website von TensorFlow ' nach tf.scale_gradient() gesucht. Wie die Ergebnisse zeigen , kommt nichts heraus. Es muss eine Funktion aus alten TF-Versionen sein, die jetzt aufgegeben wurde. Sicherlich ist ' in TF 2.0 nicht mehr verfügbar.
  • Ich ' glaube es nicht ' war schon immer eine Funktion im Tensorflow, da bei einer Google-Suche keine Ergebnisse erzielt wurden.

Antwort

Autor des Papiers hier – Ich habe übersehen, dass dies anscheinend keine TensorFlow-Funktion ist, sondern Sonnets scale_gradient oder die folgende Funktion:

 def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)  

Kommentare

  • Vielen Dank für die Antwort! Wenn Sie bereit wären, sich stackoverflow.com/q/60234530 (eine weitere MuZero-Frage) anzusehen, würde ich mich sehr darüber freuen.

Antwort

Angesichts des Pseude-Codes? (da es nicht in TF 2.0 enthalten ist) Ich würde mit Gradienten-Clipping oder Batch-Normalisierung ( „Skalierung von Aktivierungsfunktionen“)

Kommentare

  • Aus dem von Ihnen angegebenen Link geht hervor, dass dies wahrscheinlich eine Gradientennorm-Skalierung ist, die sich in übersetzt Festlegen eines clipnorm -Parameters im Optimierer. Im Code wird jedoch die Gradientenskalierung im Code zweimal mit jeweils unterschiedlichen Werten verwendet. Der Parameter clipnorm würde mir dies nicht erlauben. Wissen Sie, wie ich es könnte?
  • Außerdem scheint der verborgene Zustand eines Modells ' nicht etwas zu sein, das abgeschnitten werden sollte. (Ich verstehe ' nicht, warum das Abschneiden überhaupt hilfreich wäre.) Es wäre äußerst hilfreich, zu erklären, welche Gradientenbeschneidung dort ausgeführt wird, um sicherzugehen, dass Ihre Antwort korrekt ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.