2016-02-18 8 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)'を更新しますが、テンソルフローコードは実際にそれを減算します。 [this](http://sebastianruder.com/optimizing-gradient-descent/)によると、テンソルフローコードはより正しいようです。 –