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
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. Parametrclipnorm
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.
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.