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\u batch=n//mini\u batch\u size+(n%mini\u batch\u size!=0)
如果mini batch的大小不除以数据集的大小,则第一部分应该很明显,第二部分只需添加一个,这样我们就不会忘记最后的样本。