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 Parameterclipnorm
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.