Python 如何在tensorflow中实现多元线性随机梯度下降算法?

Python 如何在tensorflow中实现多元线性随机梯度下降算法?,python,machine-learning,linear-regression,tensorflow,Python,Machine Learning,Linear Regression,Tensorflow,我从简单的单变量线性梯度下降算法开始,但不知道如何将其推广到多元随机梯度下降算法 单变量线性回归 import tensorflow as tf import numpy as np # create random data x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.5 # Find values for W that compute y_data = W * x_data W = tf.Vari

我从简单的单变量线性梯度下降算法开始,但不知道如何将其推广到多元随机梯度下降算法

单变量线性回归

import tensorflow as tf
import numpy as np

# create random data
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.5

# Find values for W that compute y_data = W * x_data 
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
y = W * x_data

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

# Before starting, initialize the variables
init = tf.initialize_all_variables()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in xrange(2001):
    sess.run(train)
    if step % 200 == 0:
        print(step, sess.run(W))

你的问题有两个部分:

  • 如何将这个问题转化为更高维的空间
  • 如何从批量梯度下降转变为随机梯度下降
要获得更高的维度设置,可以定义线性问题
y=
。然后,您只需更改变量
W
的维度以匹配
W
中的一个维度,并用标量积
tf.matmul(x_data,W)
替换乘法
W*x_data
,您的代码应该运行正常

要将学习方法更改为随机梯度下降,您需要使用
tf.placeholder

一旦定义了
X
y
以在每个步骤保留输入,就可以构造相同的成本函数。然后,您需要通过输入适当的小批量数据来调用步骤

下面是一个如何实现这种行为的示例,它应该显示
W
快速收敛到
W

import tensorflow as tf
import numpy as np

# Define dimensions
d = 10     # Size of the parameter space
N = 1000   # Number of data sample

# create random data
w = .5*np.ones(d)
x_data = np.random.random((N, d)).astype(np.float32)
y_data = x_data.dot(w).reshape((-1, 1))

# Define placeholders to feed mini_batches
X = tf.placeholder(tf.float32, shape=[None, d], name='X')
y_ = tf.placeholder(tf.float32, shape=[None, 1], name='y')

# Find values for W that compute y_data = <x, W>
W = tf.Variable(tf.random_uniform([d, 1], -1.0, 1.0))
y = tf.matmul(X, W, name='y_pred')

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y_ - y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

# Before starting, initialize the variables
init = tf.initialize_all_variables()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
mini_batch_size = 100
n_batch = N // mini_batch_size + (N % mini_batch_size != 0)
for step in range(2001):
    i_batch = (step % n_batch)*mini_batch_size
    batch = x_data[i_batch:i_batch+mini_batch_size], y_data[i_batch:i_batch+mini_batch_size]
    sess.run(train, feed_dict={X: batch[0], y_: batch[1]})
    if step % 200 == 0:
        print(step, sess.run(W))
将tensorflow导入为tf
将numpy作为np导入
#定义尺寸
d=10#参数空间的大小
N=1000#数据样本数
#创建随机数据
w=.5*np.ones(d)
x_data=np.random.random((N,d)).astype(np.float32)
y_数据=x_数据。点(w)。重塑(-1,1))
#定义占位符以馈送小批量
X=tf.placeholder(tf.float32,shape=[None,d],name='X')
占位符(tf.float32,shape=[None,1],name='y')
#查找计算y_数据的W值=
W=tf.变量(tf.随机统一([d,1],-1.0,1.0))
y=tf.matmul(X,W,name='y_pred')
#最小化均方误差。
损失=tf.减少平均值(tf.平方(y_u-y))
优化器=tf.train.GradientDescentOptimizer(0.01)
列车=优化器。最小化(损失)
#在开始之前,初始化变量
初始化所有变量()
#启动图表。
sess=tf.Session()
sess.run(初始化)
#符合要求。
最小批量大小=100
n\u batch=n//mini\u batch\u size+(n%mini\u batch\u size!=0)
对于步进范围(2001年):
i_批次=(步骤%n_批次)*最小批次大小
批次=x_数据[i_批次:i_批次+最小批次大小],y_数据[i_批次:i_批次+最小批次大小]
sess.run(train,feed_dict={X:batch[0],y:batch[1]})
如果步骤%200==0:
打印(步骤,分段运行(W))
两个旁注:

  • 下面的实现称为小批量梯度下降,因为在每一步中,梯度都是使用我们的数据子集size
    mini\u batch\u size
    计算的。这是随机梯度下降的一种变体,通常用于稳定每一步的梯度估计。通过设置
    mini\u batch\u size=1
    可以获得随机梯度下降

  • 数据集可以在每一个时代进行洗牌,以使实现更接近理论考虑。一些最近的工作也只考虑使用一个通过您的数据集,因为它防止过拟合。如需更详细的数学解释,请参见。这可以很容易地根据您的问题设置和您正在寻找的统计属性进行更改


我们不是必须在每一步随机洗牌数据吗?根据维基百科的文章,对于迭代版本,我们必须在每次迭代中的每一点进行训练,尽管训练只需要一个或一批数据点进行更新,但我无法得到你在n_batch=n//100+行中所做的(n%100!=0)我对前两条评论给出了我的答案。批数的计算只需确保您在每个历元看到所有数据:
n\u batch=n//mini\u batch\u size+(n%mini\u batch\u size!=0)
如果mini batch的大小不除以数据集的大小,则第一部分应该很明显,第二部分只需添加一个,这样我们就不会忘记最后的样本。