Spark 不再使用 SGD 作为优化器?

问题描述 投票:0回答:1

我使用的是Spark 2.4及以前的版本,spark mllib正在使用SGD作为回归问题的优化器,并且有

LinearRegressionWithSGD
LassoWithSGD
,它们使用SGD作为优化器。

在我看来,Spark 现在正在使用

L-BFGS
Normal equation solver for weighted least squares
Iteratively reweighted least squares (IRLS)
作为优化器(https://spark.apache.org/docs/latest/ml-advanced.html)。

我想问为什么 Spark 放弃了 SGD,以及 Spark 转向上述优化器的动机是什么。 SGD 有限制吗?

谢谢

apache-spark apache-spark-mllib
1个回答
0
投票

此说明适用于 Spark 版本 3.4.1,这是撰写本文时的最新版本。

如果您查看此文档页面,您会发现 SGD 实际上仍然支持线性方法(如您提到的那些),并且实际上是大多数算法实现的方法:

在底层,线性方法使用凸优化方法来优化目标函数。 Spark.mllib 使用两种方法:SGD 和 L-BFGS,如优化部分所述。目前,大多数算法API都支持随机梯度下降(SGD),少数支持L-BFGS。有关选择优化方法的指南,请参阅此优化部分。

您确实可以在源代码中看到您的示例仍然支持这些:

LinearRegressionWithSGD
LassoWithSGD

现在,即使这些仍然受支持,我确实找到了一些提示,说明为什么您更喜欢使用 L-BFGS 而不是 SGD。

来自文档

线性方法内部使用优化,spark.mllib 中的一些线性方法同时支持 SGD 和 L-BFGS。根据目标函数的属性,不同的优化方法可以有不同的收敛保证,这里我们无法涵盖文献。一般来说,当 L-BFGS 可用时,我们建议使用它而不是 SGD,因为 L-BFGS 往往收敛得更快(迭代次数更少)。

而且这个提交包含一些动机。该提交消息的相关部分:

PR 包括将结果与有/无正则化的 SGD 进行比较的测试。

我们对 LBFGS 和 SGD 进行了比较,我们经常看到 10 倍以下 LBFGS 中的步骤,而每一步的成本是相同的(只需计算 梯度)。

以下是斯坦福大学Ng教授比较不同的论文 优化器包括 LBFGS 和 SGD。他们在以下背景下使用它们 深度学习,但值得参考。 http://cs.stanford.edu/~jngiam/papers/LeNgiamCoatesLahiriProchnowNg2011.pdf

当然,这始终取决于您的具体情况,但这可能会为您最初想知道的内容提供更多背景信息。

© www.soinside.com 2019 - 2024. All rights reserved.