I MuZero-papir-pseudokode har de følgende linje kode:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Hvad gør dette? Hvorfor er det der?
Jeg har søgt på tf.scale_gradient
, og det findes ikke i tensorflow. Og i modsætning til scalar_loss
synes de ikke at have defineret det i deres egen kode.
For kontekst er her hele funktionen:
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)
Hvad gør skalering af gradienten, og hvorfor gør de det der?
Kommentarer
Svar
Forfatteren af papiret her – Jeg savnede, at dette tilsyneladende ikke er en TensorFlow-funktion, det svarer til Sonnet “s scale_gradient eller følgende funktion:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Kommentarer
- Mange tak for svaret! Hvis du er villig til at se på stackoverflow.com/q/60234530 (endnu et MuZero-spørgsmål), vil jeg sætte stor pris på det.
Svar
Givet at dens pseudekode? (da det ikke er i TF 2.0) ville jeg gå med gradientklip eller batchnormalisering ( “skalering af aktiveringsfunktioner”)
Kommentarer
- Fra det link, du har angivet, ser det ud til, at dette sandsynligvis ville være gradueringsnormskalering, som oversættes til indstilling af en
clipnorm
-parameter i optimeringsværktøjet. Men i koden bruger de gradientskalering to gange i koden med forskellige værdier hver gang.clipnorm
-parameteren tillader ikke mig at gøre dette. Ved du, hvordan jeg kunne? - Desuden ser en skjult tilstand af en model ikke ' ud som noget, der skal klippes. (Jeg forstår ikke ' hvorfor klipning overhovedet vil være nyttigt.) At forklare, hvad gradientklipning ville gøre der, ville være yderst nyttigt for mig at være sikker på, at dit svar er korrekt.
tf.scale_gradient()
på TensorFlow ' s hjemmeside. Som resultaterne viser , kommer der ikke noget ud. Det skal være en funktion fra gamle TF-versioner, der nu er opgivet. Det er bestemt ' ikke mere tilgængeligt i TF 2.0.