2016-02-18 14 views
6

Ich versuche, TensorFlow mit meinem Deep Learning-Projekt zu verwenden.
Hier muß ich mein Gradient Update in dieser Formel implementieren:Was ist anders an Dynamik-Gradienten-Update in Tensorflow und Theano wie folgt?

enter image description here

Ich habe auch diesen Teil in Theano implementieren, und es kam die erwartete Antwort aus. Aber wenn ich versuche, TensorFlow MomentumOptimizer zu verwenden, ist das Ergebnis wirklich schlecht. Ich weiß nicht, was zwischen ihnen ist.

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) 

Antwort

5

Wenn Sie bei der Umsetzung des Momentum-Optimierer in TensorFlow aussehen [link], es wird wie folgt implementiert:

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

Wie Sie sehen, sind die Formeln ein bisschen anders. Scaling Momentum durch die Lernrate sollte Ihre Unterschiede lösen.

Es ist auch sehr einfach, solche Optimierer selbst zu implementieren. Der resultierende Code würde ähnlich wie das Snippet in Theano aussehen, das Sie eingefügt haben.

+0

Es ist nicht der einzige Unterschied. Die von OP gepostete Formel aktualisiert "w (t)", indem sie den Impulsterm "\ alpha v (t-1)" hinzufügt, während der Tensorflow-Code ihn subtrahiert. Nach [diesem] (http://sebastianruder.com/optimizing-gradient-descent/) scheint der Tensorflow-Code korrekter zu sein. –