【问题标题】:Incremental training of ALS modelALS模型的增量训练
【发布时间】:2015-01-01 20:21:14
【问题描述】:

我正在尝试找出是否可以在 Apache Spark 中使用 MLlib 对数据进行“增量训练”。

我的平台是 Prediction IO,它基本上是 Spark (MLlib)、HBase、ElasticSearch 和其他一些 Restful 部分的包装器。

在我的应用数据中实时插入“事件”,但要获得更新的预测结果,我需要“pio train”和“pio deploy”。这需要一些时间,并且在重新部署期间服务器会脱机。

我试图弄清楚我是否可以在“预测”阶段进行增量训练,但找不到答案。

【问题讨论】:

标签: apache-spark machine-learning prediction apache-spark-mllib predictionio


【解决方案1】:

我想您正在使用 spark MLlib 的 ALS 模型,该模型正在执行矩阵分解。该模型的结果是两个矩阵,一个用户特征矩阵和一个项目特征矩阵。

假设我们将在隐式情况下接收带有评级或交易的数据流,则此模型的真正(100%)在线更新将通过触发一个完整的更新来为每个新的评级信息更新两个矩阵再次对整个数据重新训练 ALS 模型 + 新评级。在这种情况下,受限于运行整个 ALS 模型的计算成本很高,并且传入的数据流可能很频繁,因此会过于频繁地触发完全重新训练。

因此,知道这一点后,我们可以寻找替代方案,单个评级不会对矩阵造成太大影响,而且我们有增量优化方法,例如 SGD。有一个为 Explicit Ratings 案例编写的有趣(仍处于试验阶段)库,它为每批 DStream 进行增量更新:

https://github.com/brkyvz/streaming-matrix-factorization

使用诸如 SGD 之类的增量方法的想法遵循的想法是,只要朝着梯度(最小化问题)移动,就可以保证朝着误差函数的最小值移动。因此,即使我们对单个新评分进行更新,仅对这个特定用户的用户特征矩阵进行更新,并且只对这个特定项目评分的项目特征矩阵进行更新,并且更新是朝向梯度的,我们保证我们移动接近最小值,当然是一个近似值,但仍然接近最小值。

另一个问题来自 spark 本身,以及分布式系统,理想情况下,更新应该按顺序完成,对于每个新的传入评级,但是 spark 将传入流视为一个批处理,它作为一个 RDD 分发,所以操作done for update 将在不保证顺序的情况下对整个批次进行。

例如,如果您使用的是 Prediction.IO,则更详细地说,您可以使用内置的常规训练和部署功能进行离线训练,但如果您想要在线更新,则必须访问这两个矩阵对于每批流,并使用 SGD 运行更新,然后要求部署新模型,此功能当然不在 Prediction.IO 中,您必须自己构建它。

SGD 更新的有趣说明:

http://stanford.edu/~rezab/classes/cme323/S15/notes/lec14.pdf

【讨论】:

  • 这是一个非常合理的答案! +1
【解决方案2】:

使用折叠技术更新您的模型接近在线(我写接近,因为面对现实,真正的在线更新是不可能的),例如: Online-Updating Regularized Kernel Matrix Factorization Models for Large-Scale Recommender Systems.

你可以看一下代码:

  • MyMediaLite
  • Oryx - 使用 Lambda 架构范例构建的框架。并且它应该包含新用户/项目的更新。

这是我对类似question 的回答的一部分,其中两个问题:近在线培训和处理新用户/项目混合在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2015-10-27
    • 1970-01-01
    • 2017-08-19
    • 2017-10-19
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多