如何加速随机梯度下降



我试图用L1惩罚拟合一个回归模型,但是我很难在合理的时间内找到一个适合的python实现。我得到的数据大约是100k × 500(旁注;几个变量是相当相关的),但是运行sklearn Lasso实现需要12个小时以上来拟合一个模型(我实际上不确定确切的时间,我已经让它运行了好几次,它从来没有完成)。

我一直在研究随机梯度下降作为一种更快完成工作的方法。然而,当我使用1e5次迭代时,sklearn中的SGDRegressor实现需要8小时才能适应。这似乎是一个相对较小的量(文档甚至建议模型通常需要大约1e6升才能收敛)。

我在想是不是我做了什么蠢事,导致痉挛持续了很长时间。我被告知SGD经常被用于它的效率(大约是0 (n_iter * n_samp * n_feat),尽管到目前为止我还没有看到比Lasso有很大的改进。

为了加快速度,我试过:

  1. 减小n_iter,但这通常导致一个非常糟糕的解决方案,因为它还没有收敛。
  2. 增加步长(并减少n_iter),但这通常会使损失函数爆炸
  3. 改变学习率类型(从逆比例到基于迭代次数的数量),这似乎也没有很大的不同。
有什么建议可以加快这个过程吗?partial_fit似乎是答案的一部分,尽管这方面的文档有些稀疏。我希望能试穿这些模型,而不用等三天。

Partial_fit不是答案。它不会加速任何东西。如果有的话,它会使它变慢。

实现非常有效,我很惊讶你说收敛很慢。我认为你做了很多次迭代。你有没有注意到目标是如何减少的?

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

您可以尝试vopal rabbit,这是一个更快的实现,但它不应该是必需的。

相关内容

  • 没有找到相关文章

最新更新