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