W pseudokodzie MuZero paper mają następujący wiersz kodu:

hidden_state = tf.scale_gradient(hidden_state, 0.5) 

Co to robi? Dlaczego tam jest?

Szukałem hasła tf.scale_gradient i nie istnieje w tensorflow. W przeciwieństwie do scalar_loss, wygląda na to, że nie zdefiniowali go w swoim własnym kodzie.

W kontekście, oto cała funkcja:

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) 

Co robi skalowanie gradientu i dlaczego to robi?

Komentarze

  • Szukałem tf.scale_gradient() w witrynie TensorFlow '. Jak pokazują wyniki , nic nie wychodzi. To musi być funkcja ze starych wersji TF, które teraz zostały porzucone. Na pewno ' nie jest już dostępny w TF 2.0.
  • Nie ' nie wierzę w to ' była kiedykolwiek funkcją w tensorflow, biorąc pod uwagę brak wyników wyszukiwania w Google.

Odpowiedź

Autor artykułu tutaj – przegapiłem, że to najwyraźniej nie jest funkcja TensorFlow, jest ona odpowiednikiem scale_gradient lub następującą funkcją:

 def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)  

Komentarze

  • Bardzo dziękuję za odpowiedź! Jeśli zechciałbyś spojrzeć na stackoverflow.com/q/60234530 (kolejne pytanie MuZero), byłbym bardzo wdzięczny.

Odpowiedź

Biorąc pod uwagę, że jest to kod pseude? (ponieważ nie ma go w TF 2.0) wybrałbym obcinanie gradientu lub normalizację wsadową ( „skalowanie funkcji aktywacyjnych”)

Komentarze

  • Z podanego linku wynika, że prawdopodobnie będzie to gradientowe skalowanie norm, co przekłada się na ustawienie parametru clipnorm w optymalizatorze. Jednak w kodzie używają skalowania gradientowego dwukrotnie w kodzie z różnymi wartościami za każdym razem. Parametr clipnorm nie pozwalał mi na to. Czy wiesz, jak mogłem?
  • Poza tym ukryty stan modelu nie ' nie wygląda na coś, co powinno zostać przycięte. (Nie ' w ogóle nie rozumiem, dlaczego obcinanie byłoby pomocne). Wyjaśnienie, jakie działanie ma tam obcinanie gradientu, byłoby dla mnie niezwykle pomocne, aby upewnić się, że Twoja odpowiedź jest poprawna.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *