V papírovém pseudokódu MuZero mají následující řádek kódu:
hidden_state = tf.scale_gradient(hidden_state, 0.5)
Co to dělá? Proč tam je?
Hledal jsem tf.scale_gradient
a v tensorflow neexistuje. A na rozdíl od scalar_loss
se nezdá, že by to definovali ve svém vlastním kódu.
V kontextu je zde celá funkce:
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 dělá škálování přechodu a proč to tam dělají?
Komentáře
Odpovědět
Autor článku zde – chybělo mi, že to zjevně není funkce TensorFlow, je to ekvivalent Sonnetova scale_gradient nebo následující funkce:
def scale_gradient(tensor, scale): """Scales the gradient for the backward pass.""" return tensor * scale + tf.stop_gradient(tensor) * (1 - scale)
Komentáře
- Děkuji vám za odpověď! Pokud byste byli ochotni se podívat na stackoverflow.com/q/60234530 (další otázka od MuZera), velmi bych to ocenil.
Odpověď
Vzhledem k tomu, že jde o kód pseude? (protože to není v TF 2.0) bych šel s přechodovým oříznutím nebo dávkovou normalizací ( „škálování aktivačních funkcí“)
Komentáře
- Z odkazu, který jste poskytli, to vypadá, že by pravděpodobně šlo o přechodové normování měřítka, což znamená nastavení parametru
clipnorm
v optimalizátoru. V kódu však dvakrát použijí změnu měřítka přechodu v kódu s různými hodnotami. Parametrclipnorm
mi to nedovolil. Víte, jak jsem mohl? - Skrytý stav modelu také nevypadá jako něco, co by mělo být oříznuto '. (Nerozumím ' tomu, proč by to ořezávání vůbec bylo užitečné.) Vysvětlení toho, co by tam ořezávání přechodů bylo, by pro mě bylo nesmírně užitečné mít jistotu, že vaše odpověď je správná.
tf.scale_gradient()
na webu TensorFlow ' s. Jak ukazují výsledky , nic nevyjde. Musí to být funkce ze starých verzí TF, která byla nyní opuštěna. Určitě ' již není k dispozici v TF 2.0.