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

  • Ik heb gezocht naar 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.
  • Ik ' geloof het niet ' is ooit een functie geweest in tensorflow, gezien het gebrek aan resultaten van een Google-zoekopdracht ernaar.

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 parameter clipnorm 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *