2016-06-28 41 views
3

我想使用TensorFlow的梯度下降優化器來解決二維Rosenbrock函數,但是當我運行該程序時,優化程序有時會走向無窮大。有時候,沒有改變任何東西,它可以找到合適的鄰居,但不能找出最佳的解決方案。如何使用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)) 

的的ROSENBROCK問題被定義爲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

啊限制搜索空間。我也在想,但不知道該怎麼做。謝謝! –