如果我正确理解您的问题,您希望找到最小化 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。
编辑
好的,根据我对问题的新理解,要手动实现梯度下降,你不能做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