No pseudocódigo do papel MuZero , eles têm a seguinte linha de código:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
O que isso faz? Por que está lá?
Eu pesquisei por tf.scale_gradient
e ele não existe no tensorflow. E, ao contrário de scalar_loss
, eles não parecem ter definido em seu próprio código.
Para contexto, aqui está a função inteira:
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)
O que escalar o gradiente faz e por que eles estão fazendo isso lá?
Comentários
Resposta
Autor do artigo aqui – não percebi que esta aparentemente não é uma função do TensorFlow, é equivalente ao Sonnet “s scale_gradient ou a seguinte função:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Comentários
- Muito obrigado pela resposta! Se você estiver disposto a consultar stackoverflow.com/q/60234530 (outra pergunta do MuZero), eu agradeceria muito.
Resposta
Dado que seu código pseude? (já que não está no TF 2.0), eu iria com recorte de gradiente ou normalização em lote ( “dimensionamento das funções de ativação”)
Comentários
- Pelo link que você forneceu, parece que provavelmente seria o dimensionamento da norma gradiente, que se traduz em definir um parâmetro
clipnorm
no otimizador. No entanto, no código, eles usam a escala de gradiente duas vezes no código com valores diferentes a cada vez. O parâmetroclipnorm
não me permitiria fazer isso. Você sabe como eu poderia? - Além disso, o estado oculto de um modelo não ' t parece algo que deve ser cortado. (Eu não ' não entendo por que o corte seria útil.) Explicar o que o corte de gradiente estaria fazendo seria extremamente útil para mim ter certeza de que sua resposta está correta.
tf.scale_gradient()
no site TensorFlow '. Como mostram os resultados , não sai nada. Deve ser uma função de versões antigas do TF que agora foram abandonadas. Com certeza, ele ' não está mais disponível no TF 2.0.