首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >渐进式ALS模型训练

渐进式ALS模型训练
EN

Stack Overflow用户
提问于 2015-01-02 04:21:14
回答 1查看 4.6K关注 0票数 18

我想知道是否有可能在Apache Spark中使用MLlib对数据进行“增量训练”。

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-04-28 22:36:04

我假设您正在使用spark 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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27734329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档