gpt4 book ai didi

apache-spark - ALS模型增量训练

转载 作者:行者123 更新时间:2023-11-30 08:22:07 28 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

因此,知道这一点后,我们可以寻找替代方案,单一评级不应改变矩阵太多,而且我们有增量优化方法,例如 SGD。有一个有趣的(仍然是实验性的)库为 Explicit Ratings 的情况编写,它为 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

关于apache-spark - ALS模型增量训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27734329/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com