GradientDescentOptimizer.minimize() 是如何工作的?

How does GradientDescentOptimizer.minimize() work?

关于 TensorFlow,我对 GradientDescentOptimizer.minimize() 的实际工作方式感到困惑。通过下面的代码更具体地说,调用minimize(error)如何修改mb以便当我只调用sess.run([m, b])时,它们return修改mb值?我认为很难找到 minimize() 与变量 mb 之间的任何联系,例如以下代码末尾的结果:

#Actaul Data
x_data = np.linspace(0, 10, 10) + np.random.uniform(-1.5, 1.5, 10)
y_label = np.linspace(0, 10, 10) + np.random.uniform(-1.5, 1.5, 10)

#Random Variables --> These variables will be be modified by minimize()
m = tf.Variable(0.44)
b = tf.Variable(0.87)

error = 0

for x, y in zip(x_data, y_label):
    error += (y - (m*x + b)) ** 2

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train = optimizer.minimize(error)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    training_steps = 100

    for i in range(training_steps):
        sess.run(train)

    final_slope, final_intercept = sess.run([m, b])

    print(final_slope, final_intercept) # 0.7535087, 0.83729243

你的优化器和 mb 等可训练变量之间的 link 就是这样。

可训练变量

您可以将此参数设置为 False 以从训练中排除任何变量。在您的代码中,默认情况下 trainable 为 True。如果 trainable 不是 False.

,它将选择任何其他变量并尝试对其进行优化
m = tf.Variable(0.44,trainable=False)
b = tf.Variable(0.87)

这种情况下的输出是

0.44 2.134535

显式传递 var_list

可以使用代码收集所有可训练变量。

variables = tf.trainable_variables()
allvariables = [var for var in variables]

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train = optimizer.minimize(error,var_list=variables)

所以如果不是mx+b而是其他表达式我们可以优化任何我们想要的。

可能还有其他高级方法可以控制它。

with tf.variable_scope('discriminator'):
    c = tf.Variable(1.0)

variables = tf.trainable_variables()
allvariables = [var for var in variables if var.name.startswith("discriminator")]

这仅包括 c