【问题标题】:How to speed up up Stochastic Gradient Descent?如何加快随机梯度下降?
【发布时间】:2014-07-30 04:53:48
【问题描述】:

我正在尝试使用 L1 惩罚来拟合回归模型,但我无法在 python 中找到适合合理时间的实现。我得到的数据大约是 100k x 500(旁注;其中几个变量非常相关),但是在此上运行 sklearn Lasso 实现需要 12 个小时以上才能拟合单个模型(我实际上不是确定确切的时间,我已经让它通宵运行了好几次,它从未完成)。

我一直在研究 Stochastic Gradient Descent,以作为更快完成工作的一种方式。但是,当我使用 1e5 次迭代时,sklearn 中的 SGDRegressor 实现需要大约 8 小时才能适应。这似乎是一个相对较小的数量(文档甚至建议该模型通常需要大约 1e6 次迭代才能收敛)。

我想知道是否有什么我很愚蠢的事情导致发作需要很长时间。有人告诉我,SGD 经常用于提高效率(大约 O(n_iter * n_samp * n_feat),但到目前为止我还没有看到与 Lasso 相比有多大改进。

为了加快速度,我试过了:

  1. 减小 n_iter,但这通常会导致非常糟糕的解决方案,因为它尚未收敛。
  2. 增加步长(并减少 n_iter),但这通常会使损失函数爆炸
  3. 更改学习率类型(从反向缩放到基于迭代次数的量),这似乎也没有太大的区别。

对于加快这个过程有什么建议吗?似乎 partial_fit 可能是答案的一部分,尽管这方面的文档有些稀疏。我希望能够在不等待三天的情况下安装这些模型。

【问题讨论】:

  • 微软研究院在Stochastic Gradient Descent Tricks 上有一篇有趣的论文可能会有所帮助
  • 嗯,很有用。我还查看了 sklearn SGD 代码,看起来实际上每次迭代都会通过整个数据集,所以实际上收敛速度比我想象的要快得多。
  • Partial_fit 不是答案。它不会加快任何速度。如果有的话,它会使它变慢。实现非常有效,我很惊讶你说收敛速度很慢。您运行了多少次迭代,目标是什么样的?通常调整初始学习率可以提高速度。你的数据集真的不应该是一个问题。您可以尝试 vopal wabbit,这是一个更快的实现,但应该没有必要。

标签: python machine-learning scikit-learn linear-regression


【解决方案1】:

Partial_fit 不是答案。它不会加速任何事情。如果有的话,它会让它变慢。

实现非常有效,我很惊讶你说收敛速度很慢。我认为你做了很多迭代。你看过目标是如何降低的吗?

通常调整初始学习率可以提高速度。你的数据集真的不应该是一个问题。我不确定 SGDRegressor 是否在内部这样做,但将目标重新调整为单位方差可能会有所帮助。

您可以尝试 vopal wabbit,这是一个更快的实现,但应该没有必要。

【讨论】:

  • 同意 - 请参阅我上面的评论。我没有意识到的是,每次调用 partial_fit 时,SGD 都会遍历整个数据集(并且 fit 方法基本上只调用 partial_fit n_iter 次)。我认为我最初的速度问题被夸大了。现在我只需要在调整梯度下降迭代参数的丛林中导航:P
  • 根据我的经验,调整初始学习率就足够了。
猜你喜欢
  • 2016-06-13
  • 2016-09-25
  • 2018-12-10
  • 2021-02-20
  • 2021-12-18
  • 1970-01-01
  • 2011-07-04
  • 2016-05-16
  • 2019-06-19
相关资源
最近更新 更多