ALS模型的增量训练

问题描述 投票:17回答:3

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

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

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

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

apache-spark machine-learning prediction apache-spark-mllib predictionio
3个回答
2
投票

我想你正在使用火花MLlib的ALS模型,它执行矩阵分解。模型的结果是两个矩阵,即用户特征矩阵和项目特征矩阵。

假设我们将收到针对隐式情况的评级或交易的数据流,该模型的真实(100%)在线更新将通过触发完全再培训来更新每个新评级信息的两个矩阵。 ALS模型再次对整个数据+新评级。在这种情况下,一个受到以下事实的限制:运行整个ALS模型在计算上是昂贵的并且输入的数据流可能是频繁的,因此它将经常触发完全重新训练。

因此,知道这一点我们可以寻找替代方案,单个评级不应该更改矩阵,加上我们有增量的优化方法,例如SGD。有一个有趣的(仍然是实验性的)库为显式评级的情况编写,它为每批DStream执行增量更新:

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

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

另一个问题来自spark本身,分布式系统,理想情况下,应该按顺序为每个新的传入评级进行更新,但spark将传入流视为批处理,将其作为RDD分发,因此完成更新操作将完成整个批次,不保证顺序性。

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

有关SGD更新的有趣说明:

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


0
投票

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

你可以看看代码:

  • MyMediaLite
  • Oryx - 使用Lambda Architecture范例构建框架。它应该有新用户/项目折叠的更新。

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


0
投票

在用于推荐系统中的矩阵分解的增量学习中,他们使用单侧最小二乘法来进行ALS中的增量学习。

http://ieeexplore.ieee.org/document/7840707/

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