【问题标题】:Stochastic Gradient Decent vs. Gradient Decent for x**2 functionx**2 函数的随机梯度下降与梯度下降
【发布时间】:2021-12-18 23:11:18
【问题描述】:

想了解SGD和GD的区别就最简单的函数例子:y=x**2

GD的作用在这里:

def gradient_descent(
    gradient, start, learn_rate, n_iter=50, tolerance=1e-06
):
    vector = start
    for _ in range(n_iter):
        diff = -learn_rate * gradient(vector)
        if np.all(np.abs(diff) <= tolerance):
            break
        vector += diff
    return vector

为了找到 x**2 函数的最小值,我们接下来应该做(答案几乎是 0,这是正确的):

gradient_descent(gradient=lambda v: 2 * x, start=10.0, learn_rate=0.2)

我的理解是,在经典 GD 中,梯度是根据所有数据点精确计算的。我上面展示的实现中的“所有数据点”是什么?

此外,我们应该如何对这个函数进行现代化改造,以便将其称为 SGD(SGD 使用单个数据点来计算梯度。gradient_descent 函数中的“单个点”在哪里?)

【问题讨论】:

    标签: python machine-learning gradient-descent sgd


    【解决方案1】:

    您的示例中最小化的函数不依赖于任何数据,因此说明 GD 和 SGD 之间的区别没有帮助。

    考虑这个例子:

    import numpy as np
    
    rng = np.random.default_rng(7263)
    
    y = rng.normal(loc=10, scale=4, size=100)
    
    
    def loss(y, mean):
        return 0.5 * ((y-mean)**2).sum()
    
    
    def gradient(y, mean):
        return (mean - y).sum()
    
    
    def mean_gd(y, learning_rate=0.005, n_iter=15, start=0):
        """Estimate the mean of y using gradient descent"""
    
        mean = start
    
        for i in range(n_iter):
    
            mean -= learning_rate * gradient(y, mean)
    
            print(f'Iter {i} mean {mean:0.2f} loss {loss(y, mean):0.2f}')
    
        return mean
    
    
    def mean_sgd(y, learning_rate=0.005, n_iter=15, start=0):
        """Estimate the mean of y using stochastic gradient descent"""
    
        mean = start
    
        for i in range(n_iter):
    
            rng.shuffle(y)
            for single_point in y:
                mean -= learning_rate * gradient(single_point, mean)
    
            print(f'Iter {i} mean {mean:0.2f} loss {loss(y, mean):0.2f}')
    
        return mean
    
    
    mean_gd(y)
    mean_sgd(y)
    y.mean()
    

    GD 和 SGD 的两个(非常简单的)版本用于估计随机样本 y 的平均值。通过最小化loss 的平方来估计平均值。 正如您正确理解的那样,在 GD 中,每次更新都使用在整个数据集上计算的梯度,而在 SGD 中,我们一次只查看一个随机点。

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2016-09-25
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2019-06-19
      • 2011-07-04
      • 2016-05-16
      相关资源
      最近更新 更多