I MuZero papir-pseudokode har de følgende linje med kode:

hidden_state = tf.scale_gradient(hidden_state, 0.5) 

Hva gjør dette? Hvorfor er det der?

Jeg har søkt etter tf.scale_gradient, og det eksisterer ikke i tensorflow. Og i motsetning til scalar_loss, ser de ikke ut til å ha definert det i sin egen kode.

For kontekst, her er hele funksjonen:

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) 

Hva gjør skalering av gradienten, og hvorfor gjør de det der?

Kommentarer

  • Jeg har søkt på tf.scale_gradient() på nettstedet til TensorFlow '. Som resultatene viser , kommer ingenting ut. Det må være en funksjon fra gamle TF-versjoner som nå er forlatt. Visst er det ' ikke lenger tilgjengelig i TF 2.0.
  • Jeg tror ikke ' t tror det ' har noen gang vært en funksjon i tensorflow, gitt mangelen på resultater fra et Google-søk etter den.

Svar

Forfatteren av papiret her – Jeg savnet at dette tilsynelatende ikke er en TensorFlow-funksjon, det tilsvarer Sonnet «s scale_gradient , eller følgende funksjon:

 def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)  

Kommentarer

  • Tusen takk for svaret! Hvis du er villig til å se på stackoverflow.com/q/60234530 (et annet spørsmål fra MuZero), vil jeg sette stor pris på det.

Svar

Gitt at det er pseudekoden? (siden det ikke er i TF 2.0) vil jeg gå med gradientklipping eller batch normalisering ( «skalering av aktiveringsfunksjoner»)

Kommentarer

  • Fra lenken du oppga, ser det ut til at dette sannsynligvis vil være gradering av normskalering, som oversettes til angi en clipnorm -parameter i optimalisereren. Imidlertid bruker de gradientskalering to ganger i koden med forskjellige verdier hver gang i koden. clipnorm -parameteren tillater ikke meg å gjøre dette. Vet du hvordan jeg kunne?
  • Også ser den skjulte tilstanden til en modell ' ut som noe som skal klippes ut. (Jeg forstår ikke ' hvorfor det i det hele tatt ville være nyttig å klippe det.) Å forklare hva graderingsklipping ville gjøre der, vil være ekstremt nyttig for meg å være sikker på at svaret ditt er riktig.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *