Dans le pseudocode papier MuZero , ils ont la ligne de code suivante:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Quest-ce que cela fait? Pourquoi est-ce là?
Jai recherché tf.scale_gradient
et il nexiste pas dans tensorflow. Et, contrairement à scalar_loss
, ils ne semblent pas lavoir défini dans leur propre code.
Pour le contexte, voici la fonction entière:
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)
À quoi sert la mise à léchelle du dégradé et pourquoi le font-ils là-bas?
Commentaires
Réponse
Auteur de larticle ici – Jai manqué que ce nest apparemment pas une fonction TensorFlow, cest léquivalent de Sonnet « s scale_gradient , ou la fonction suivante:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Commentaires
- Merci beaucoup pour la réponse! Si vous êtes prêt à regarder stackoverflow.com/q/60234530 (une autre question MuZero), je lapprécierais beaucoup.
Réponse
Étant donné que son pseude code? (puisque ce nest pas dans TF 2.0) Jirais avec dégradé de découpage ou normalisation par lots ( « mise à léchelle des fonctions dactivation »)
Commentaires
- Daprès le lien que vous avez fourni, il semble que ce soit probablement une mise à léchelle de la norme de gradient, qui se traduit par définition dun paramètre
clipnorm
dans loptimiseur. Cependant, dans le code, ils utilisent la mise à léchelle du gradient deux fois dans le code avec des valeurs différentes à chaque fois. Le paramètreclipnorm
ne me permettrait pas de faire cela. Savez-vous comment je pourrais? - De plus, létat caché dun modèle ne ' semble pas être quelque chose qui devrait être découpé. (Je ne ' pas comprendre pourquoi le découpage serait utile du tout.) Expliquer ce que le découpage de dégradé y ferait serait extrêmement utile pour que je sois certain que votre réponse est correcte.
tf.scale_gradient()
sur le site Web de TensorFlow '. Comme le montrent les résultats , rien ne sort. Ce doit être une fonction danciennes versions de TF qui a maintenant été abandonnée. Bien sûr, il ' nest plus disponible dans TF 2.0.