Nello pseudocodice di carta MuZero , hanno la seguente riga di codice:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Che cosa fa? Perché è presente?
Ho cercato tf.scale_gradient
e “non esiste in tensorflow. E, a differenza di scalar_loss
, sembra che non lo abbiano definito nel proprio codice.
Per contesto, ecco lintera funzione:
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)
Che cosa fa il ridimensionamento del gradiente e perché lo fanno lì?
Commenti
Risposta
Autore del documento qui – Mi è sfuggito che questa apparentemente non è una funzione TensorFlow, è equivalente a Sonnet s scale_gradient o la seguente funzione:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Commenti
- Grazie mille per la risposta! Se fossi disposto a dare unocchiata a stackoverflow.com/q/60234530 (unaltra domanda su MuZero), lo apprezzerei molto.
Risposta
Dato che il suo pseudonimo? (poiché non è in TF 2.0) sceglierei gradiente di ritaglio o normalizzazione batch ( “ridimensionamento delle funzioni di attivazione”)
Commenti
- Dal link che hai fornito, sembra che questo sarebbe probabilmente il ridimensionamento della norma del gradiente, che si traduce in impostazione di un parametro
clipnorm
nellottimizzatore. Tuttavia, nel codice usano due volte il ridimensionamento del gradiente nel codice con valori diversi ogni volta. Il parametroclipnorm
non mi consente di farlo. Sai come potrei? - Inoltre, lo stato nascosto di un modello non ' sembra qualcosa che dovrebbe essere ritagliato. (Non ' t capisco perché il ritaglio sarebbe utile.) Spiegare cosa farebbe il ritaglio del gradiente sarebbe estremamente utile per me per essere certo che la tua risposta sia corretta.
tf.scale_gradient()
sul sito web di TensorFlow '. Come mostrano i risultati , non viene fuori nulla. Deve essere una funzione delle vecchie versioni di TF che ora è stata abbandonata. Di sicuro, ' non è più disponibile in TF 2.0.