我试图使用TensorFlow的渐变下降优化器来解决二维Rosenbrock函数,但是当我运行程序时,优化器有时会走向无穷大。有时候,在不改变任何东西的情况下,它可以找到合适的邻域但不能找到最佳解决方案。
我的代码如下:
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')
# Loss function
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?
答案 0 :(得分:4)
如果你减少初始x1 / x2的变化(例如使用-3/3而不是-10/10)并将学习率降低10倍,它不应该经常爆炸。当你看到事情发生分歧时降低学习率往往是一件好事。
此外,您正在优化的功能是为了难以找到全局最小值,因此没有惊喜,它找到了山谷而不是全局最优;)
答案 1 :(得分: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)