最小化 Tensorflow 中的函数

minimize a function in Tensorflow

如何使用 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)

如果我对你的问题的理解正确,你想找到使 x^2 + 2 最小的 x 的值。

为此,您需要重复调​​用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。

编辑

OK,根据我对问题的新理解,手动实现梯度下降,你不能做x = x - alpha * gradient,因为这是python操作,只是简单地替换对象x。您需要告诉 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