Skip to content

2025

亿级用户相似度计算:Faiss与Spark的实践探索

在系列前作中,我们已经探讨了如何利用ALS算法为海量用户及其兴趣标签构建向量表征(Embeddings)(详见《机器学习实践:ALS的矩阵分解》),并进一步研究了如何让这些向量模型具备动态适应线上数据更新的能力

手握这些用户画像向量,一个新的工程挑战摆在了面前:如何在两亿级别的用户海洋中,为每一位用户精准且高效地“捞”出与其兴趣图谱最为契合的Top-K“知己”?这对于个性化推荐系统(例如“猜你认识”或关联内容推荐)而言,无疑是核心一环。

面对如此庞大的用户基数,传统的“两两握手”式比较方法,在计算资源和时间成本上显然力不从心。本文将聚焦于一种结合Faiss与Spark的分布式解决方案,旨在攻克这一大规模用户相似度计算的难题

漫漫长路:那些年我们踩过的“坑”

在抵达“光明顶”之前,咱们也曾在崎岖小路上摸索过。

机器学习实践:ALS的矩阵分解-Part II

在之前「机器学习实践:ALS的矩阵分解」中,我们通过ALS矩阵分解,对用户兴趣标签进行向量化,得到了接近word2vec的效果。

但是遗留了一个重要的问题,矩阵分解模型是对user_iditem_id进行建模的,只有把对全量的id的数据都喂给模型,才能获得id向量。这个id向量是静态的,一次性的,但在推荐系统使用时,建模数据每天变化,user_iditem_id集合也是不断变化的,导致ALS直接使用并不方便,两方面的挑战:

  • 如果只关心item的向量,可以对user集合进行了10%的抽样,但如果需要user集合的向量,就需要对全量数据分解,训练时间就会大大增加。
  • 行为数据每天更新,每次训练ALS学出来的向量都会与旧数据完全不同,没有连续性。

这个挑战类似于GNN之于node2vec的改进,也就是 inductive(不使用node_id)和 transductive(使用node_id)的区别。

那么,这篇讨论的问题是,ALS算法能不能改造成inductive的? 也就是能否满足下面两点性质,