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

  • Pesquisei 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.
  • Eu não ' não acredito ' s sempre foi uma função no tensorflow, devido à falta de resultados de uma pesquisa no Google para isso.

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

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âmetro clipnorm 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *