如何加速随机梯度下降?

2024-05-16 08:51:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我在想,是不是有什么事情我很蠢,导致发作需要很长时间。有人告诉我,SGD通常是因为它的效率(大约是O(n_iter*n_samp*n_feat))而使用的,尽管到目前为止,我还没有看到比套索有多大的改进。在

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

  1. 减少néiter,但这通常会导致一个非常糟糕的解决方案,因为它还没有收敛。在
  2. 增加步长(并减小nˉiter),但这通常会使损失函数爆炸
  3. 改变学习率的类型(从逆比例到基于迭代次数的数量),这似乎也没有造成巨大的区别。在

有什么加快这个过程的建议吗?似乎部分匹配可能是答案的一部分,尽管关于这方面的文献并不多见。我很希望不用等三天就能把这些型号的车都装上。在


Tags: 数据方法模型l1数量时间sklearn建议
1条回答
网友
1楼 · 发布于 2024-05-16 08:51:03

部分匹配不是答案。它不会加速任何事情。如果有的话,它会让它变慢。在

实现是相当有效的,我很惊讶你说收敛速度很慢。我想你做了很多次迭代。你看过目标是如何降低的吗?在

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

你可以试试vopalwabbit,这是一个更快的实现,但它不应该是必要的。在

相关问题 更多 >