最小化 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
如何使用 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