点击上方“蓝字”关注“AI开发者”
近日,拥有 10 亿月活用户的 Instagram 分享了其内容推荐系统的关键内容,包括:Explore 基础构建模块的开发、元语言 IGQL工具、Explore 系统框架等。
据官方数据,超过一半的用户每月都会通过 Instagram Explore 来搜索视频、图片、直播和各种文章。那么,如何从亿级规模的实时推荐数据中选出最适合某个用户的媒体内容呢?针对这样的挑战, Instagram 利用机器学习做了这样的思考与操作,我们将其编译如下。
Explore 基础构建模块的开发
在构建处理 Instagram 上每天上传的大量照片和视频的推荐引擎时,我们需要满足三个重要需求:
- 大规模快速实验的能力;
- 获得用户兴趣范围内的更多信息;
- 一种高计算效率的方法来确保推荐建议既高质又新鲜(具备时效性);
因此,为了解决这三个需求,我们开发了一些基本工具,而这些技术正是实现最终推荐系统的关键。
- 工具一:运用 IGQL 实现快速迭代
构建最优推荐算法和技术是 ML 社区正在进行的一类研究。根据任务的不同,选择合适系统的过程可能会有很大的不同。例如:一种算法可以有效地识别用户的长期兴趣,而另一种算法则可以更好地根据近期浏览内容进行推荐与建议。
技术团队通过反复使用不同的算法,发现需要一种方法,既能让我们有效地尝试新的想法,又能轻松地将有潜力的想法应用到大规模系统中,而不必担心 CPU 和内存使用之类计算资源的影响。
因此,我们需要一种定制的特定于领域的元语言,它能够提供正确的抽象级别,并将一些候选算法进行集中聚合。
IGQL 正是为解决这个问题而创建的工具,它是一种专门用于在推荐系统中检索候选对象的领域特定语言。经 C 优化后,IGQL 可在不牺牲可扩展性的情况下最大程度地降低延迟,从而减少计算资源消耗。
IGQL 是经过静态验证的高级语言,工程师能够以 Python 的方式来编写推荐算法,并在 C 中快速而高效地运行它。除此之外,它还具有可扩展性和易用性。
user.let(seed_id=user_id).liked(max_num_to_retrieve=30).account_nn(embedding_config=default).posted_media(max_media_per_account=10).filter(non_recommendable_model_threshold=0.2).rank(ranking_model=default).diversify_by(seed_id, method=round_robin)
在上面的代码示例中,我们可以看到 IGQL 能够有效提供高可读性的语言,即使对于没有广泛使用该语言的工程师也能一目了然。
该工具有助于以一种原则性的方式组合多个推荐阶段和算法。例如,我们可以在查询中使用组合规则来输出多个子查询输出的加权混合,从而优化候选生成器的集合。通过调整权重,我们就可以找到最佳用户体验的组合。
IGQL 使执行复杂推荐系统中常见的任务变得简单,例如:构建组合规则的嵌套树。IGQL 允许工程师更关注于推荐背后的机器学习和业务逻辑,而不是后台工作;例如:为每个查询获取正确数量的候选项。
该方法还提供了高度的代码可重用性;例如:使用排序器就像为 IGQL 查询添加单行规则一样简单。在多个地方添加它也很简单,例如:帐户排序和这些帐户发布的媒体排序。
- 工具二:个性化账户的个性化媒体排序嵌入
人们在 Instagram 上公开分享数以十亿计的高质量媒体内容,这些内容都属于 Explore 上的合格内容。对于 Explore 中的众多感兴趣的社区来说,保持一个清晰且不断发展的目录样式分类也是一个挑战。因为社区的主题很多,从阿拉伯书法到模型训练再到 slime 的都有,所以基于内容的模型很难理解如此多样的兴趣社区。
由于 Instagram 拥有大量基于特定主题的关注兴趣的账户,比如:Devon rex cats 或 vintage tractors;因此我们创建了一个检索通道。该通道关注的是账户级别的信息,而不是媒体级别的信息。
通过构建帐户嵌入,我们能够更有效地识别哪些帐户在局部上彼此相似。我们使用类似 word2vec 的嵌入框架 Ig2vec 来推断帐户嵌入。通常,word2vec 嵌入框架会根据单词在训练语料库中句子的上下文来学习单词的表示。Ig2vec 将用户与之交互的帐户 id(例如:来自用户喜欢的帐户媒体)视为句子中的一个单词序列。
通过应用与 word2vec 中的类似技术,我们可以预测一个人在应用程序的给定会话中可能与之交互的帐户。如果一个人在同一个会话中与一系列帐户交互,那么与来自不同 Instagram 帐户范围的随机帐户序列相比,它更有可能是局部一致的。这有助于我们识别出与此相关的账户。
我们定义了两个帐户之间的距离度量——嵌入训练中使用的同一个帐户——通常是余弦距离或点积。基于此,我们做了一个 KNN 查找,以找到嵌入中任何帐户的局部相似帐户。我们的嵌入覆盖了数百万个账户,并使用 Facebook 最先进的近邻检索引擎 FAISS 作为支持检索的基础设施。
Ig2vec 预测账户内容相似性的功能演示
对于每一个版本的嵌入,我们训练一个仅根据嵌入预测一组帐户主题的分类器;通过将预测主题与保留集中帐户的人工标记主题进行比较,我们就可以评估嵌入如何捕获主题相似度。
检索与某个特定用户以前感兴趣帐户所类似的帐户,有助于我们以一种简单而有效的方式为每个人聚焦到一个更小的、个性化的排序清单。因此,我们能够利用最先进和计算密集型的机器学习模型为每个 Instagram 社区成员服务。
- 工具三:蒸馏模型预选相关候选项
在我们用 Ig2vec 去根据个人兴趣确定最相关的账户之后,我们需要一种方式对这些账户进行排序,使其对于每个人都充满新鲜感与趣味性。这需要在每个人每次滚动 Explore 页面时预测出最相关的媒体。
我们通过一个深层神经网络,对每一个滚动操作评估 500 个媒体片段。虽然这需要大量的资源;但当其对每个用户评估越多,我们就越有可能从这些的内容中找到最好的、最个性化的媒体推荐。为了能够最大化每个排序请求的媒体数量,我们引入了一个排序蒸馏模型(可参考:https://arxiv.org/abs/1809.07428),帮助在使用更复杂的排序模型之前对候选项进行重新排序。
排序问题的排序蒸馏
该方法是通过训练一个超轻量级的模型,从中学习并使其尽量接近主要排序模型。我们从更复杂的排序模型中记录其所具有的特征和输出候选项;然后用有限的特征集和简单的神经网络模型结构对蒸馏模型进行训练以复制结果。其目标函数则是优化 NDCG 排序(排序质量的一种度量)损失超过主要排序模型的输出;然后使用蒸馏模型中排序靠前的推荐作为后期高性能排序模型的排序候选。
通过建立蒸馏模型的模拟行为,可以最大限度地减少对多个参数的调整以及在不同排序阶段维护多个模型的需要。利用这一技术,我们可以有效地评估一组更大的媒体集,以便在控制计算资源的同时,找到在每个排序请求中最相关的媒体内容。
如何构建 Explore?
在创建了便于实验、有效地识别人们的兴趣并产生有效和相关的预测的关键构建模块之后,我们必须在生产中将这些系统结合起来。利用 IGQL、账户嵌入和蒸馏模型技术,我们将 Explore 推荐系统分为两个主要阶段:候选生成阶段(也称为寻源阶段)和排序阶段。
Explore 系统框架
- 阶段一:候选生成阶段
首先,我们利用人们以前在 Instagram 上互动过的账户(例如:喜欢或收藏了某个账户中的媒体内容)来识别人们可能感兴趣的其他账户,我们称之为种子账户(种子账户通常只是 Instagram 上类似或相同兴趣账户的一小部分)。
然后,我们使用帐户嵌入技术来识别类似于种子帐户的其它帐户;最后根据这些帐户,我们就可以找到这些帐户发布或参与的媒体内容。
该图展示了 Instagram Explore 的一个典型推荐内容源
人们在 Instagram 上接触账户和媒体的方式有很多种(例如:关注、喜欢、评论、保存和分享)。也有不同的媒体类型(例如:照片、视频、故事和直播),这意味着我们可以使用类似的方案来构建各种来源。利用 IGQL 会使得这个过程变得非常简单——不同的候选源只需要表示为不同的 IGQL 子查询即可。
通过不同类型的信息来源,我们能够找到成千上万的符合条件的候选项。为了确保推荐的内容既安全又适合许多年龄段的全球探索社区,我们使用了各种标记来筛选出我们可以确定为不符合推荐条件的内容,然后再为每个人建立符合条件的媒体推荐。除了阻止可能违反规则的内容和错误信息外,我们还利用机器学习系统来帮助检测和过滤垃圾邮件等内容。
然后,对于每一个排序请求,我们为个人识别出了数千个符合条件的媒体,并从符合条件的推荐中抽取 500 个候选项,然后将候选项发送到下游的排序阶段。
- 阶段二:候选项排序
当有 500 名候选项可供排序时,我们使用了三阶排序基础模结构来帮助平衡排序相关性和计算效率之间的权重。三个排序阶段如下:
- 第一阶段:蒸馏模型模仿其他两个阶段的组合,具有最小的特征;从 500 个候选项中选出 150 个质量最高、最相关的候选项;
- 第二阶段:利用具有完整的稠密特征集的轻量级神经网络模型,再从第一阶段的 150 个候选项中选择出符合条件的 50 个最高质量和最相关的候选项;
- 第三阶段:利用具有完整的稠密和稀疏特征的深度神经网络模型,从第二阶段的 50 个候选项中选出 25 个质量最高、最相关的候选项。
用来平衡排序相关性和计算效率之间的权衡的三阶排序基础模结构
如果第一阶段的蒸馏模型按照排序顺序模仿其他两个阶段,我们如何确定下两个阶段中最相关的内容呢?
因此,我们选择预测人们在每个媒体上采取的个人行为,无论是像「喜欢」和「收藏」这样的积极行为,还是像「少看这样的帖子」(SFPLT)这样的消极行为;均使用多任务多标签(MTML)的神经网络来预测这些事件,因为共享多层感知器(MLP)允许我们对来自不同行为的共同信号进行捕捉。
当前推荐模型架构示例
我们使用一个算术公式(即值模型)来结合对不同事件的预测,以捕获不同信号的突出性,从而决定内容是否相关。具体而言,即使用一个加权的预测值之和,比如:[w_like*P(like) w_save*P(save)-w_negative_action*P(negative action)]。如果我们认为一个人在 Explore 中保存一个帖子的重要性高于他们喜欢的帖子,那么「保存」行为的权重应该更高。
Explore 也利用了用户新兴趣与过去兴趣之间的平衡关系,在价值模型中加入一个简单的启发式规则,以提高内容的多样性。具体而言,模型通过添加「惩罚」因子来降低来自同一媒体或同一种子帐户帖子的排序,因此在 Explore 推荐中,很难看到来自同一个人或同一种子帐户的多个帖子;而且这种推荐方式会随着你遇到更多来自同一作者的帖子而加强。
我们根据每个排序候选项的最终价值模型得分,以迭代的方式对最相关的内容进行排序。其中,离线回放工具连同贝叶斯优化工具也会有助于我们在系统优化过程中高效地调整价值模型。
原文地址: https://ai.facebook.com/blog/powered-by-ai-instagrams-explore-recommender-system