如何加快随机梯度下降?

时间:2014-06-09 15:45:26

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

我正在尝试使用带有L1惩罚的回归模型,但是我很难在python中找到适合合理时间的实现。我得到的数据大约是100k乘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. 更改学习率类型(从反向缩放到基于迭代次数的量),这似乎也没有产生太大的影响。
  4. 有关加快此过程的建议吗?似乎partial_fit可能是答案的一部分,尽管这方面的文档有些稀疏。我希望能够在不等待三天的情况下适应这些模型。

1 个答案:

答案 0 :(得分:3)

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

实施非常有效,我很惊讶你说收敛很慢。我认为你可以进行多次迭代。你看过目标是如何减少的吗?

通常调整初始学习率可以提高速度。您的数据集确实应该不是问题。我不确定SGDRegressor是否在内部执行此操作,但将目标重新调整为单位差异可能会有所帮助。

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