La documentazione non è abbastanza chiara a riguardo. Suppongo che i gradienti che è possibile ottenere per opt.compute_gradients(E, [v])
contengano lo ∂E/∂x = g(x)
per ogni elementodel tensore per gli archivi v
. Il opt.apply_gradients(grads_and_vars)
esegue essenzialmente x ← -η·g(x)
, dove η
è il tasso di apprendimento? Ciò implicherebbe che se voglio aggiungere una variazione additiva positiva p
alla variabile, avrei bisogno di cambiare g(x) ← g(x) - (1/η)p
, ad es. In questo modo:Cosa fa opt.apply_gradients() in TensorFlow?
opt = tf.train.GradientDescentOptimizer(learning_rate=l)
grads_and_vars = opt.compute_gradients(loss, var_list)
for l, gv in enumerate(grads_and_vars):
grads_and_vars[l] = (gv[0] - (1/l) * p, gv[1])
train_op = opt.apply_gradients(grads_and_vars)
C'è un modo migliore per farlo?
Spiacente, ho ignorato la riga '' opt = tf.train.GradientDescentOptimizer (learning_rate = l) '' nel frammento di codice che hai fornito, il che rende il primo paragrafo della mia risposta in qualche modo irrilevante. Lasciandolo per contesto, tuttavia. – lballes
Grazie. Ad esempio, altri ottimizzatori di gradiente potrebbero essere calcolati ad es. momenta in base al mio gradiente aggiornato, o perché sarebbero incompatibili con tale approccio? –
Altri ottimizzatori implementano le regole di aggiornamento come la discesa del gradiente con quantità di moto, AdaGrad e così via. Ovviamente, l'aggiunta di un valore costante alla fase di aggiornamento è compatibile con qualsiasi regola di aggiornamento (quanto è ragionevole che si tratti di una domanda separata). – lballes