【问题标题】:minimize a function in Tensorflow最小化 Tensorflow 中的函数
【发布时间】:2018-11-30 00:00:58
【问题描述】:

如何使用 tf.gradients 获得函数的渐变?当我使用 GradientDescentOptimizer.minimize() 时,下面的工作正常,tf.gradients 似乎在 x^2+2 的导数处评估 1,即 2x

我错过了什么?

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

grad = tf.gradients(y, x)
#grad = tf.train.GradientDescentOptimizer(0.1).minimize(y)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    grad_value = sess.run(grad)
    print(grad_value)

【问题讨论】:

  • 我使用您的代码得到了正确答案 (2)。我觉得还可以。
  • 我想知道如何使用 tf.gradients 获取渐变,例如我可以使用它手动下降到 x^2+2 = 0

标签: python tensorflow gradient


【解决方案1】:

如果我正确理解您的问题,您希望找到最小化 x^2 + 2x 的值。

为此,您需要反复调用GradientDescentOptimizer,直到x 收敛到最小化函数的值。这是因为梯度下降是一种迭代技术。

此外,在 tensorflow 中,GradientDescentOptimizer 的方法 minimize 会计算梯度,然后将它们应用于相关变量(在您的情况下为 x)。所以代码应该是这样的(注意我注释了grad 变量,除非你想查看梯度值,否则不需要):

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

# grad = tf.gradients(y, x)
grad_op = tf.train.GradientDescentOptimizer(0.2).minimize(y)

init = tf.global_variables_initializer()

n_iterations = 10
with tf.Session() as sess:
    sess.run(init)
    for i in range(n_iterations):
        _, new_x = sess.run([grad_op, x])
        print('Iteration:', i,', x:', new_x)

你会得到:

Iteration: 0 , x: 1.0
Iteration: 1 , x: 0.6
Iteration: 2 , x: 0.36
Iteration: 3 , x: 0.216
Iteration: 4 , x: 0.07776
Iteration: 5 , x: 0.07776
Iteration: 6 , x: 0.046656
Iteration: 7 , x: 0.01679616
Iteration: 8 , x: 0.010077696
Iteration: 9 , x: 0.010077696

你在收敛到真正的答案时看到的是 0。

如果你将GradientDescentOptimizer的学习率从0.2提高到0.4,它会更快地收敛到0。

编辑

好的,根据我对问题的新理解,要手动实现梯度下降,你不能做x = x - alpha * gradient,因为这是简单地替换对象x的python操作。您需要告诉 tensorflow 将 op 添加到图中,这可以使用 x.assign 来完成。它看起来像:

x = tf.Variable(1.0, trainable=True)
y = x**2 + 2

grad = tf.gradients(y, x)
# grad_op = tf.train.GradientDescentOptimizer(0.5).minimize(y)

update_op = x.assign(x - 0.2*grad[0])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(10):
        new_x = sess.run([update_op, x])
        print('Iteration:', i,', x:', new_x)

我们得到了和原生GradientDescentOptimizer一样的答案:

Iteration: 0 , x: 1.0
Iteration: 1 , x: 0.6
Iteration: 2 , x: 0.36
Iteration: 3 , x: 0.1296
Iteration: 4 , x: 0.1296
Iteration: 5 , x: 0.077759996
Iteration: 6 , x: 0.046655998
Iteration: 7 , x: 0.027993599
Iteration: 8 , x: 0.01679616
Iteration: 9 , x: 0.010077696

【讨论】:

  • 谢谢,我正在尝试手动做这部分“grad_op = tf.train.GradientDescentOptimizer(0.2).minimize(y)”,比如“x = x - gradient”,是这样吗可能吗?
  • 好的,如果这次我答对了,你可以在上面的 EDIT 下看到我更新的答案。
  • @Gerges 我们不能添加停止条件吗?例如。使用 L-无穷范数
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 2023-03-25
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多