【问题标题】:How to implement multivariate linear stochastic gradient descent algorithm in tensorflow?如何在tensorflow中实现多元线性随机梯度下降算法?
【发布时间】:2016-07-02 01:49:20
【问题描述】:

我从单变量线性梯度下降的简单实现开始,但不知道将其扩展到多元随机梯度下降算法?

单变量线性回归

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

【问题讨论】:

    标签: python machine-learning linear-regression tensorflow


    【解决方案1】:

    你的问题有两个部分:

    • 如何将此问题转化为更高维度的空间。
    • 如何从批量梯度下降更改为随机梯度下降。

    要获得更高维度的设置,您可以定义线性问题y = <x, w>。然后,您只需更改变量 W 的维度以匹配 w 之一,并将乘法 W*x_data 替换为标量积 tf.matmul(x_data, W),您的代码应该可以正常运行。

    要将学习方法更改为随机梯度下降,您需要使用 tf.placeholder 抽象成本函数的输入。
    一旦你定义了Xy_ 在每一步保存你的输入,你就可以构建相同的成本函数。然后,您需要通过提供适当的小批量数据来调用您的步骤。

    这是一个如何实现此类行为的示例,它应该表明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))
    

    两个旁注:

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

    • 数据集可以在每个 epoch 进行混洗,以使实现更接近理论考虑。最近的一些工作还考虑只使用一次数据集,因为它可以防止过度拟合。有关更数学和更详细的解释,您可以查看Bottou12。这可以根据您的问题设置和您正在寻找的统计属性轻松更改。

    【讨论】:

    • 我们不是必须在每一步随机打乱数据吗?
    • 根据维基百科的文章,对于迭代版本,我们必须在每次迭代中在每个点执行训练,尽管训练只需要单个或一批数据点进行更新
    • 我无法得到你在第 n_batch = N // 100 + (N % 100 != 0) 行中所做的事情
    • 我为前两个 cmets 编辑了我的答案。批次数量的计算只是确保您在每个时期都能看到所有数据:n_batch = N//mini_batch_size + (N%mini_batch_size != 0) 第一部分应该很明显,如果小批量的大小不除大小,第二部分只需添加一个你的数据集,所以我们不会忘记最后的样本。
    猜你喜欢
    • 2016-06-13
    • 2016-09-25
    • 2021-02-20
    • 2011-07-04
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多