2016-02-18 21 views
6

Sto provando a utilizzare TensorFlow con il mio progetto di apprendimento approfondito.
Qui ho bisogno di implementare il mio aggiornamento gradiente in questa formula:Cosa c'è di diverso nell'aggiornamento della quantità di moto a Tensorflow e Theano in questo modo?

enter image description here

Ho anche implementare questa parte a Teano, e ne è venuto fuori la risposta attesa. Ma quando provo a usare TensorFlow's MomentumOptimizer, il risultato è davvero pessimo. Non so cosa c'è di diverso tra loro.

Theano:

def gradient_updates_momentum_L2(cost, params, learning_rate, momentum, weight_cost_strength): 
    # Make sure momentum is a sane value 
    assert momentum < 1 and momentum >= 0 
    # List of update steps for each parameter 
    updates = [] 
    # Just gradient descent on cost 
    for param in params: 
     param_update = theano.shared(param.get_value()*0., broadcastable=param.broadcastable) 
     updates.append((param, param - learning_rate*(param_update + weight_cost_strength * param_update))) 
     updates.append((param_update, momentum*param_update + (1. - momentum)*T.grad(cost, param))) 
    return updates 

tensorflow:

l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()]) 
cost = cost + WEIGHT_COST_STRENGTH * l2_loss 
train_op = tf.train.MomentumOptimizer(LEARNING_RATE, MOMENTUM).minimize(cost) 

risposta

5

Se si guarda alla realizzazione di slancio ottimizzatore in tensorflow [link], è implementato come segue:

accum = accum * momentum() + grad; 
var -= accum * lr(); 

Come vedi, le formule sono un po 'diverse. Il tempo di inerzia di ridimensionamento per il tasso di apprendimento dovrebbe risolvere le tue differenze.

È anche molto semplice implementare tale ottimizzatore da solo. Il codice risultante sembrerebbe simile allo snippet in Theano che hai incluso.

+0

Non è l'unica differenza. La formula pubblicata da OP aggiorna 'w (t)' aggiungendo il termine slancio '\ alpha v (t-1)', mentre il codice tensorflow in realtà lo sottrae. Secondo [questo] (http://sebastianruder.com/optimizing-gradient-descent/) il codice di tensorflow sembra essere più corretto. –