În pseudocodul de hârtie MuZero , acestea au următoarea linie de cod:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Ce face asta? De ce este acolo?
Am „căutat tf.scale_gradient
și nu există în tensorflow. Și, spre deosebire de scalar_loss
, nu par să fi definit-o în propriul cod.
Pentru context, aici este întreaga funcție:
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)
Ce face scalarea gradientului și de ce o fac acolo?
Comentarii
Răspuns
Autor al lucrării de aici – mi-a fost dor că aparent nu este o funcție TensorFlow, este „echivalentă cu Sonnet” s scale_gradient , sau următoarea funcție:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Comentarii
- Vă mulțumim foarte mult pentru răspuns! Dacă ați fi dispus să vă uitați la stackoverflow.com/q/60234530 (o altă întrebare MuZero), aș aprecia-o foarte mult.
Răspuns
Având în vedere că codul său pseudologic? (deoarece nu este în TF 2.0) aș merge cu decupare gradient sau normalizare lot ( „scalarea funcțiilor de activare”)
Comentarii
- Din linkul pe care l-ați furnizat, se pare că aceasta ar fi probabil scalarea normelor în gradient, care se traduce prin setarea unui parametru
clipnorm
în optimizator. Cu toate acestea, în cod, ele folosesc gradarea de gradient de două ori în cod, cu valori diferite de fiecare dată. Parametrulclipnorm
nu mi-ar permite să fac acest lucru. Știți cum aș putea? - De asemenea, starea ascunsă a unui model nu pare ' să pară ceva ce ar trebui tăiat. (Nu ' nu înțeleg de ce ar fi utilă decuparea.) Explicarea a ceea ce ar face decuparea în gradient ar fi extrem de util pentru mine să fiu sigur că răspunsul tău este corect.
tf.scale_gradient()
pe site-ul TensorFlow '. După cum arată rezultatele , nu iese nimic. Trebuie să fie o funcție din vechile versiuni TF care acum a fost abandonată. Cu siguranță, ' nu mai este disponibil în TF 2.0.