2016-02-18 48 views
6

我正在嘗試在我的深度學習項目中使用TensorFlow。
在這裏我需要實現我的梯度更新此公式中:Tensorflow和Theano的動量梯度更新有什麼不同?

enter image description here

我也實現這部分Theano,它走出了預期的答案。但是當我嘗試使用TensorFlow的MomentumOptimizer時,結果非常糟糕。我不知道他們之間有什麼不同。

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) 

回答

5

如果你看看勢頭優化的TensorFlow [link]的實現,它是實現如下:

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

如你所見,公式有點不同。通過學習速率縮放動量術語應該可以解決您的差異。

自己實現這樣的優化器也很容易。生成的 代碼看起來與您包含的Theano中的代碼段相似。

+0

這不是唯一的區別。 OP發佈的公式通過添加動量項'\ alpha v(t-1)'來更新'w(t)',而tensorflow代碼實際上減去了它。根據[this](http://sebastianruder.com/optimizing-gradient-descent/),tensorflow代碼似乎更加正確。 –