In de MuZero papieren pseudocode hebben ze de volgende regel code:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Wat doet dit? Waarom is het daar?
Ik “heb gezocht naar tf.scale_gradient
en het bestaat niet in tensorflow. En, in tegenstelling tot scalar_loss
, lijken ze het niet in hun eigen code te hebben gedefinieerd.
Voor de context is hier de hele functie:
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)
Wat doet het schalen van het verloop en waarom doen ze het daar?
Opmerkingen
Antwoord
Auteur van het artikel hier – ik heb gemist dat dit blijkbaar geen TensorFlow-functie is, het is gelijk aan Sonnets scale_gradient , of de volgende functie:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Reacties
- Hartelijk dank voor het antwoord! Als je zou willen kijken naar stackoverflow.com/q/60234530 (een andere MuZero-vraag), zou ik dat enorm op prijs stellen.
Antwoord
Gezien het feit dat het pseudocode is? (aangezien het niet in TF 2.0 zit) zou ik gaan met verloop knippen of batch normalisatie ( “schalen van activeringsfuncties”)
Opmerkingen
- Van de link die je hebt opgegeven, lijkt het erop dat dit waarschijnlijk gradiëntnormschalen zou zijn, wat zich vertaalt naar het instellen van een
clipnorm
parameter in de optimizer. In de code gebruiken ze echter tweemaal gradiëntschaling in de code met elke keer verschillende waarden. De parameterclipnorm
stond me dit niet toe. Weet je hoe ik dat zou kunnen? - Ook lijkt de verborgen toestand van een model niet ' iets dat moet worden afgekapt. (Ik begrijp niet ' waarom knippen überhaupt nuttig zou zijn.) Als ik uitleg wat het knippen van gradiënten daar zou doen, zou ik er zeker van zijn dat je antwoord juist is.
tf.scale_gradient()
op de TensorFlow ' s website. Zoals de resultaten laten zien , komt er niets uit. Het moet een functie zijn van oude TF-versies die nu is verlaten. Zeker, het ' is niet meer beschikbaar in TF 2.0.