我试图找出是否有可能进行"增量训练" Apache Spark中使用MLlib的数据。
我的平台是Prediction IO,它基本上是Spark(MLlib),HBase,ElasticSearch和其他一些Restful部件的包装器。
在我的应用数据"事件"实时插入,但为了获得更新的预测结果,我需要" pio train"和" pio deploy"。这需要一些时间,服务器在重新部署期间会脱机。
我试图弄清楚是否可以在"预测"期间进行增量训练。阶段,但找不到答案。
答案 0 :(得分:2)
我想你正在使用火花MLlib的ALS模型,它执行矩阵分解。模型的结果是两个矩阵,即用户特征矩阵和项目特征矩阵。
假设我们将收到针对隐式案例的评级或交易的数据流,此模型的真实(100%)在线更新将通过触发完整来更新每个新评级信息的两个矩阵再次对整个数据进行再培训ALS模型+新评级。在这种情况下,一个受到以下事实的限制:运行整个ALS模型的计算成本很高,并且传入的数据流可能很频繁,因此它会过于频繁地重新训练。
因此,知道这一点我们可以寻找替代方案,单个评级不应该更改矩阵,加上我们有增量的优化方法,例如SGD。有一个有趣的(仍然是实验性的)库为显式评级的情况编写,它为每批DStream执行增量更新:
https://github.com/brkyvz/streaming-matrix-factorization
使用增量方法(如SGD)的想法遵循这样的想法:只要向梯度(最小化问题)移动,就会向最小的误差函数移动。因此,即使我们对单个新评级进行更新,仅对该特定用户的用户特征矩阵进行更新,并且仅对该特定项目的项目特征矩阵进行评级,并且更新朝向渐变,我们保证我们移动最小的,当然是近似值,但仍然是最小的。
另一个问题来自spark本身,分布式系统,理想情况下应该按顺序为每个新的传入评级进行更新,但spark将传入流视为批处理,将其作为RDD分发,因此操作完成更新将完成整批,不保证顺序性。
如果您正在使用Prediction.IO,则可以进行更多详细信息,您可以使用常规列车和部署内置功能进行离线培训,但如果您想要在线更新,则必须访问两个矩阵对于每批流,并使用SGD运行更新,然后要求部署新模型,当然这个功能不在Prediction.IO中,你必须自己构建它。
有关新元更新的有趣说明:
http://stanford.edu/~rezab/classes/cme323/S15/notes/lec14.pdf
答案 1 :(得分:0)
通过使用折叠技术来更新您的模型近在线(我写近,因为面对它,真正的在线更新是不可能的),例如: Online-Updating Regularized Kernel Matrix Factorization Models for Large-Scale Recommender Systems.
你可以查看以下代码:
这是我对类似question的答案的一部分,其中两个问题:近线培训和处理新用户/项目是混合的。