如何使用TensorFlow梯度下降优化器来解决优化问题

5

我正在尝试使用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时做错了什么?还是我完全误解了如何使用TensorFlow?


这段代码不再适用于tensorflow 2.4.1。 - SriK
2个回答

4
如果您减少初始x1/x2的变化(例如使用-3/3而不是-10/10),并将学习速率降低10倍,则不应经常出现崩溃。当您看到事物分歧时,降低学习速率通常是一个不错的尝试。
另外,您正在优化的函数是为了难以找到全局最小值而设计的,因此发现山谷而不是全局最优解没有什么奇怪的地方 ;)

4

是的,就像@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)

啊,限制搜索空间。我也在考虑这个问题,但不知道如何实现。谢谢! - K. Lindholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接