2016-06-28 11 views
3

私は2次元Rosenbrock関数を解決するためにTensorFlowのグラデーション降下オプティマイザを使用しようとしているが、私はプログラムを実行したとして、オプティマイザは時々無限大の方に行きます。またいつか、何も変更せずに、それは右の近所を見つけるが、最適解を特定することはできません。次のように最適化問題を解決するためにTensorFlowの勾配降下オプティマイザを使用する方法

私のコードは次のとおり

import tensorflow as tf 

x1_data = tf.Variable(initial_value=tf.random_uniform([1], -10, 10),name='x1') 
x2_data = tf.Variable(initial_value=tf.random_uniform([1], -10, 10), name='x2') 

y = tf.add(tf.pow(tf.sub(1.0, x1_data), 2.0), 
tf.mul(100.0, tf.pow(tf.sub(x2_data, tf.pow(x1_data, 2.0)), 2.0)), 'y') 

opt = tf.train.GradientDescentOptimizer(0.0035) 
train = opt.minimize(y) 

sess = tf.Session() 

init = tf.initialize_all_variables() 
sess.run(init) 

for step in xrange(200): 
    sess.run(train) 
    if step % 10 == 0: 
     print(step, sess.run(x1_data), sess.run(x2_data), sess.run(y)) 

ローゼン問題をy =(1 - X1)として定義される^ 2 + 100 *(X2 - X1^2)^ 2、上の最適解を与えますX1 = X2 = 1

私はこれで間違って何をしていますか?あるいは、私はTensorFlowの使い方を完全に誤解していますか?

答えて

4

あなたが最初のX1/X2の変動を減少させる(例えば、使用-3/3の代わり-10/10の)と10倍の学習率を減少させた場合、それはできるだけ頻繁に爆破べきではありません。物事が分かれているのを見て、学習率を下げることは、しばしば試してみると良いことです。また、あなたが最適化している機能はありませんので、それは谷を見つけることが驚きではなくグローバルな最適な、大域的最小値を見つけることは困難であるために行われていない

;)

3

はい、@etarionはこのことを言うようにあなたのTensorFlowコードは最適です。

確認勾配が爆発したことがないようにする一つの方法は、例えば範囲[-10., 10.]でそれらをクリップすることです:

opt = tf.train.GradientDescentOptimizer(0.0001) 
grads_and_vars = opt.compute_gradients(y, [x1_data, x2_data]) 
clipped_grads_and_vars = [(tf.clip_by_value(g, -10., 10.), v) for g, v in grads_and_vars] 

train = opt.apply_gradients(clipped_grads_and_vars) 
+0

ああは探索空間を制限します。私はそれも考えていたが、それをどうやって行うのか分からなかった。ありがとう! –

関連する問題