Tensorflow中的随机梯度下降在概念上似乎是错误的



我正在探索使用Tensorflow的线性回归。这是我笔记本上的代码。

import tensorflow as tf
import numpy as np
learning_rate = 0.01
x_train = np.linspace(-1,1,101)
y_train = 2*x_train + np.random.randn(*x_train.shape) * 0.33
X = tf.placeholder("float")
Y = tf.placeholder("float")
def model(X, w):
return tf.multiply(X,w)
w = tf.Variable(0.0, name = "weights")
training_epochs = 100
y_model = model(X,w)
cost = tf.reduce_mean(tf.square(Y-y_model))
train_op = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
for epoch in range(training_epochs):
for (x,y) in zip(x_train,y_train):
sess.run(train_op, feed_dict = {X:x, Y: y})
print(sess.run(w))

它试图最小化成本函数。根据这个问题的答案,我认为tf.reduce_mean()会像np.mean()一样工作。

然而,每当一对(x,y)被馈送到train_op时,权重w似乎不是根据该对而是根据所有先前的对来更新。

对此有何解释?这与与优化器一起工作有关吗?

我想回答我自己的问题。如果你认为这确实是线性回归,这不是一个微不足道的问题。

  1. 我误解了tf.train.GradientDescentOptimizer的性能。它只运行一步来最小化损失函数,而不是最小化最小值。如果是这样的话,@UmangGupta说得对。

  2. 在每个历元中,优化器都会"稍微"优化每个数据点的损失函数。因此,将数据馈送到优化器的顺序很重要。因此,下面的代码将给出不同的答案。

    for (x,y) in list(zip(x_train,y_train))[::-1]: sess.run(train_op, feed_dict = {X:x, Y: y})

总之,这段代码运行的不是严格的线性回归,而是它的近似值。

如果您更改这段代码

for epoch in range(training_epochs):
for (x,y) in zip(x_train,y_train):
sess.run(train_op, feed_dict = {X:x, Y: y})

通过这个

for (x,y) in zip(x_train,y_train):
for epoch in range(training_epochs):
sess.run(train_op, feed_dict = {X:x, Y: y})

你得到你所期望的了吗?

在你的原始代码中,第一个循环指的是迭代,所以你要修复梯度下降的第一次迭代,然后将其应用于所有先前的对(因为你的第二个循环指代所有先前的配对(,然后你要修复第二次迭代,再次将梯度下降应用于所有之前的配对,以此类推

如果你如上所述交换循环,那么你就固定了一对,然后将梯度下降的所有迭代应用于这一对。我不确定这是否是你想要的。

最新更新