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

时间:2018-07-13 21:33:03

标签: python tensorflow

我正在使用Tensorflow探索线性回归。这是我来自this notebook的代码。

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))

它试图最小化成本函数。根据这个问题的answers,我认为tf.reduce_mean()的工作方式类似于np.mean()

但是,每次将一对(x,y)馈入train_op时,权重w似乎并不是根据THE对而更新,而是根据之前的所有对进行更新。

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

2 个答案:

答案 0 :(得分:0)

我想回答我自己的问题。如果您认为这确实是线性回归,那么这不是一个小问题。

  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})

简而言之,这段代码并没有进行严格的线性回归,而是近似的回归。

答案 1 :(得分:-1)

如果您更改这段代码

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})

您能得到您所期望的吗?

在您的原始代码中,第一个循环引用迭代,因此您要修复梯度下降的第一个迭代,然后将其应用于所有先前的对(因为第二个循环引用所有先前的对),那么您'正在修复第二个迭代,然后再次对所有先前的对应用梯度下降,依此类推。

如果您按上述方式交换循环,则将固定一对,然后将所有梯度下降迭代应用于该一对。我不确定这是否是您想要的。