【问题标题】:Stochastic gradient descent converges too smoothly随机梯度下降收敛太平滑
【发布时间】:2017-08-03 15:59:15
【问题描述】:

作为作业的一部分,我被要求实施随机梯度下降来解决线性回归问题(尽管我只有 200 个训练示例)。我的问题是随机梯度下降收敛太平滑,几乎与批量梯度下降完全一样,这让我想到了我的问题:考虑到通常它更嘈杂的事实,为什么它看起来如此平滑。是因为我只用了 200 个例子吗?

收敛图:

Stochastic gradient descent

Gradient descent

具有随机梯度下降权重的 MSE:2.78441258841

权重来自梯度下降的 MSE:2.78412631451(与权重来自正规方程的 MSE 相同)

我的代码:

def mserror(y, y_pred):

    n = y.size
    diff = y - y_pred
    diff_squared = diff ** 2
    av_er = float(sum(diff_squared))/n

    return av_er

.

def linear_prediction(X, w):
    return dot(X,np.transpose(w))

.

def gradient_descent_step(X, y, w, eta):

    n = X.shape[0]

    grad = (2.0/n) * sum(np.transpose(X) * (linear_prediction(X,w) - y), axis = 1)

    return w - eta * grad

.

def stochastic_gradient_step(X, y, w, train_ind, eta):

    n = X.shape[0]

    grad = (2.0/n) * np.transpose(X[train_ind]) * (linear_prediction(X[train_ind],w) - y[train_ind])

    return  w - eta * grad    

def gradient_descent(X, y, w_init, eta, max_iter):

    w = w_init
    errors = []
    errors.append(mserror(y, linear_prediction(X,w)))

    for i in range(max_iter):
        w = gradient_descent_step(X, y, w, eta)
        errors.append(mserror(y, linear_prediction(X,w)))

    return w, errors

.

def stochastic_gradient_descent(X, y, w_init, eta, max_iter):

    n = X.shape[0] 
    w = w_init

    errors = []
    errors.append(mserror(y, linear_prediction(X,w)))

    for i in range(max_iter):

        random_ind = np.random.randint(n)

        w = stochastic_gradient_step(X, y, w, random_ind, eta)
        errors.append(mserror(y, linear_prediction(X,w)))

    return w, errors

【问题讨论】:

  • 链接到数据集以防它是相关的link

标签: algorithm machine-learning linear-regression gradient-descent stochastic-process


【解决方案1】:

您的图表没有什么异常。您还应该注意,您的批处理方法需要更少的迭代来收敛。

您可能让来自神经网络的 SGD 图模糊了您对 SGD“应该”是什么样子的看法。大多数神经网络都是更复杂的模型(难以优化),用于处理更难的问题。这会导致您可能期望的“锯齿状”。

线性回归是一个简单的问题,并且有一个凸解。这意味着任何会降低我们的错误率的步骤都保证是朝着最佳解决方案迈出的一步。这比神经网络复杂得多,也是您看到平滑错误减少的部分原因。这也是您看到几乎相同的 MSE 的原因。 SGD 和批处理收敛到完全相同的解决方案。

如果您想尝试强制一些不平滑,您可以不断提高学习率 eta,但这是一种愚蠢的做法。最终你会到达一个你不收敛的点,因为你总是在解决方案上采取措施。

【讨论】:

  • 是的,我注意到我的批量梯度下降收敛于更少的迭代,尽管每次迭代更昂贵(我猜,n 倍更昂贵 - 由于矢量化而进行的优化)。有趣的。使用 MSE 的线性回归不仅有解析解,而且非常简单,随机梯度下降也很容易收敛。
  • 这就是总体主题。 SGD 通常对于 ML 需求“足够好”,在解决方案中不需要很多有效数字。对于其他领域,批处理方法可能更重要,并且存在更智能的批处理方法,例如 LBFGS,可以更好地利用额外信息。
  • 我使用了几次 LBFGS,尽管我还没有研究过它是如何工作的。你能告诉我你所说的“额外信息”是什么意思吗?
  • 评论部分不适合讨论这种细节。简而言之,除了使用梯度之外,还有更多的优化 - 使用整个数据集来计算梯度可以为您提供更多信息,而不是单个数据点。如果您想了解更多信息,可以查看这本免费书籍stanford.edu/~boyd/cvxbook
  • 我会的。谢谢!
猜你喜欢
  • 2015-05-27
  • 2015-02-18
  • 2019-01-31
  • 1970-01-01
  • 2013-06-21
  • 2021-11-16
  • 2020-04-28
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多