En el pseudocódigo de papel MuZero , tienen la siguiente línea de código:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
¿Qué hace esto? ¿Por qué está ahí?
He buscado tf.scale_gradient
y no existe en tensorflow. Y, a diferencia de scalar_loss
, no parece que lo hayan definido en su propio código.
Para el contexto, aquí está la función completa:
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)
¿Qué hace el escalado del degradado y por qué lo hacen allí?
Comentarios
Respuesta
Autor del artículo aquí: me perdí que aparentemente no es una función de TensorFlow, es equivalente a Sonnet «s scale_gradient , o la siguiente función:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Comentarios
- ¡Muchas gracias por la respuesta! Si estaría dispuesto a consultar stackoverflow.com/q/60234530 (otra pregunta de MuZero), se lo agradecería mucho.
Respuesta
Dado que su pseudo código? (ya que no está en TF 2.0) iría con recorte de gradiente o normalización por lotes ( «escala de funciones de activación»)
Comentarios
- Desde el enlace que proporcionaste, parece que esto probablemente sería una escala de norma de gradiente, que se traduce establecer un parámetro
clipnorm
en el optimizador. Sin embargo, en el código, usan la escala de gradiente dos veces en el código con valores diferentes cada vez. El parámetroclipnorm
no me permitiría hacer esto. ¿Sabe cómo podría hacerlo? - Además, el estado oculto de un modelo no ' parece algo que deba recortarse. (No ' entiendo por qué el recorte sería útil en absoluto). Explicar qué haría el recorte de degradado allí sería extremadamente útil para estar seguro de que su respuesta es correcta.
tf.scale_gradient()
en el sitio web de TensorFlow '. Como muestran los resultados , no sale nada. Debe ser una función de versiones antiguas de TF que ahora se ha abandonado. Por supuesto, ' ya no está disponible en TF 2.0.