I MuZero-pappers-pseudokod har de följande rad kod:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Vad gör detta? Varför finns det?
Jag har letat efter tf.scale_gradient
och det finns inte i tensorflöde. Och till skillnad från scalar_loss
verkar de inte ha definierat det i sin egen kod.
För kontext är här hela 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)
Vad gör skalning av lutningen och varför gör de det där?
Kommentarer
Svar
Upphovsmannen till tidningen här – jag saknade att detta tydligen inte är en TensorFlow-funktion, det motsvarar Sonnet ”s skala_gradient , eller följande funktion:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Kommentarer
- Tack så mycket för svaret! Om du skulle vara villig att titta på stackoverflow.com/q/60234530 (en annan fråga från MuZero) skulle jag uppskatta det mycket.
Svar
Med tanke på att dess pseudekod? (eftersom det inte finns i TF 2.0) skulle jag gå med gradientklipp eller batchnormalisering ( ”skalning av aktiveringsfunktioner”)
Kommentarer
- Från länken du angav ser det ut som att detta sannolikt skulle vara gradientskalning, vilket översätts till ställa in en parameter
clipnorm
i optimeraren. Men i koden använder de gradientskalning två gånger i koden med olika värden varje gång. Parameternclipnorm
tillåter mig inte att göra detta. Vet du hur jag kunde? - Det dolda tillståndet hos en modell verkar inte ' som något som ska klippas. (Jag förstår inte ' varför det skulle vara bra att klippa det.) Att förklara vilken gradientklippning som skulle göras där skulle vara extremt bra för mig att vara säker på att ditt svar är korrekt.
tf.scale_gradient()
på TensorFlow ' webbplats. Som resultaten visar kommer inget fram. Det måste vara en funktion från gamla TF-versioner som nu har övergivits. Visst är det ' inte längre tillgängligt i TF 2.0.