【问题标题】:How to use TensorFlow gradient descent optimizer to solve optimization problems如何使用 TensorFlow 梯度下降优化器解决优化问题
【发布时间】:2016-10-30 06:19:27
【问题描述】:

我正在尝试使用 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 2.4.1。

标签: python optimization tensorflow


【解决方案1】:

如果您减少初始 x1/x2 的变化(例如,使用 -3/3 而不是 -10/10)并将学习率降低 10 倍,它不应该经常爆炸。当你看到事物分歧时降低学习率通常是一件好事。

此外,您正在优化的函数是因为难以找到全局最小值,所以它找到谷值而不是全局最优值也就不足为奇了;)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 啊限制搜索空间。我也是这么想的,但是不知道怎么做。谢谢!
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2021-07-16
    • 2019-01-31
    • 2021-12-20
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多