17

我想知道是否可以在Apache Spark中使用MLlib进行数据“增量培训”。ALS模型增量式培训

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

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

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

+0

PIO是否支持星火流和从StreamRDD的增加现有的预测结果? – javadba

+3

我刚刚检查过,在线/增量培训已实施[流式线性回归](http://spark.apache.org/docs/latest/mllib-linear-methods.html#streaming-linear-regression)和[流式聚类(http://spark.apache.org/docs/latest/mllib-clustering.html#streaming-clustering)。不幸的是,还没有流式协作过滤(ALS)和其他流式分类/回归方法。 – mucaho

+0

[Streaming k-means](http://spark.apache.org/docs/latest/mllib-clustering.html#streaming-k-means) –

回答

0

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

瓯你可以看一下的代码:

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

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

2

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

假设我们将收到一个带有隐含情况的评级或交易数据流,此模型的实际(100%)在线更新将更新这两个矩阵,以通过触发一个新的评级信息再次对整个数据+新的评分进行ALS模型的全面再培训。在这种情况下,人们受限于以下事实:运行整个ALS模型的计算成本很高,并且传入的数据流可能会频繁出现,所以它会经常触发全面重新训练。

因此,知道这一点,我们可以寻找替代方案,单一评级不应该更改矩阵,我们还有增量的优化方法,例如SGD。没有为明确的评级,其确实为一个DSTREAM每批增量更新的情况下写了一个有趣的(尚处于实验阶段)库:

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

采用渐进的方法,如SGD的想法如下的想法只要朝向梯度(最小化问题)移动,就可以保证正在朝着最小误差函数移动。因此,即使我们对单个新评级进行了更新,也只对该特定用户的用户特征矩阵进行了更新,并且只对该特定项目的项目特征矩阵进行了评级,并且更新是针对渐变的,但我们保证我们移动当然是作为一个近似值,但仍然趋向于最小值。

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

更详细信息,如果您使用Prediction.IO例如,你可以做它使用普通列车的离线训练和部署内置的功能,但如果你想拥有的在线更新,你将不得不同时访问这些功能当然不在Prediction.IO中,您必须自行构建它。

为SGD更新的有趣说明:

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

+0

这是一个非常合理的答案! +1 – eliasah