最小化 Tensorflow 中的函数

ZKA*_*ZKA 2 python gradient 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)
Run Code Online (Sandbox Code Playgroud)

Ger*_*ges 5

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

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

此外,在tensorflow,该方法 minimizeGradientDescentOptimizer同时做两计算的梯度,然后将其应用到相关变量(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)
Run Code Online (Sandbox Code Playgroud)

你会得到:

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
Run Code Online (Sandbox Code Playgroud)

您在收敛到 0 的真实答案时看到的。

如果将 的学习率GradientDescentOptimizer从 0.2 增加到 0.4,它将更快地收敛到 0。

编辑

好的,根据我对这个问题的新理解,手动实现梯度下降,你不能这样做,x = x - alpha * gradient因为这是简单地替换 object 的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)
Run Code Online (Sandbox Code Playgroud)

我们得到与本地人相同的答案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
Run Code Online (Sandbox Code Playgroud)