2016-06-20 36 views
14

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?

risposta

8

La regola di aggiornamento che si applica effettivamente al metodo apply_gradients dipende dallo specifico ottimizzatore. Dai un'occhiata all'implementazione di apply_gradients nella classe tf.train.Optimizerhere. Si basa sulle classi derivate che implementano la regola di aggiornamento nei metodi _apply_dense e _apply_spares. La regola di aggiornamento a cui si fa riferimento è implementata dal GradientDescentOptimizer.

Per quanto riguarda l'aggiornamento additivo positivo desiderato: Se si sta chiamando opt è un'istanza di GradientDescentOptimizer, allora si potrebbe davvero ottenere ciò che si vuole fare da

grads_and_vars = opt.compute_gradients(E, [v]) 
eta = opt._learning_rate 
my_grads_and_vars = [(g-(1/eta)*p, v) for g, v in grads_and_vars] 
opt.apply_gradients(my_grads_and_vars) 

Il più elegante modo per fare questo è probabilmente scrivere un nuovo ottimizzatore (ereditato da tf.train.Optimizer) che implementa direttamente la regola di aggiornamento desiderata.

+0

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

+0

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? –

+0

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