作者:Ivan Medvedev, Haotian Wu, Taylor Gordon 编译:ronghuaiyang
导读
给大家介绍一下Instagram的Explore智能推荐系统的一些概要。
超过半数的 Instagram 用户每个月都会浏览 Instagram,寻找与他们兴趣相关的新照片、视频和故事。大规模实时推荐数十亿个选项中最相关的内容,会带来多种需要新的工程解决方案的机器学习(ML)挑战。
我们通过创建一系列自定义查询语言、轻量级建模技术和支持高速实验的工具来解决这些挑战。这些系统支持大规模的探索,同时提高了开发人员的效率。总的来说,这些解决方案代表了一个基于 3 部分排名漏斗的高效人工智能系统,该系统提取 650 亿个特征,每秒做出 9000 万个模型预测。
在这篇博客文章中,我们将分享 Explore 中的关键元素的详细概述,以及我们如何在 Instagram 上为人们提供个性化的内容。
开发 Explore 的基础构建模块
在我们着手建立一个推荐引擎来处理每天上传到 Instagram 上的大量照片和视频之前,我们开发了一些基本的工具来满足三个重要的需求。我们需要进行大规模快速试验的能力,我们需要在人们的兴趣范围内获得更强的信号,我们需要一种计算效率高的方法来确保我们的推荐是高质量和新鲜的。这些定制技术是实现我们目标的关键:
使用 IGQL 快速迭代:一种新的领域特定语言
构建最优推荐算法和技术是 ML 社区正在进行的一个研究领域,根据任务的不同,选择正确的系统的过程可能会有很大的不同。例如,一种算法可能有效地识别长期兴趣,而另一种算法可能在根据最近的内容识别推荐方面表现得更好。我们的工程团队反复使用不同的算法,我们需要一种方法,既能有效地尝试新思想,又能轻松地将有前途的思想应用到大型系统中,而不必过多地担心 CPU 和内存使用等计算资源的影响。我们需要一种特定于域的自定义元语言,它提供正确的抽象级别并将所有算法组装到一个地方。
为了解决这个问题,我们创建并提供了 IGQL,这是一种专门用于在推荐系统中检索候选对象的领域特定语言。它的执行是在 c 中优化的,这有助于最小化延迟和计算资源。它还具有可扩展性,在测试新的研究想法时易于使用。IGQL 是经过静态验证的高级语言。工程师可以像 python 那样编写推荐算法,并在 c 中快速高效地执行。
代码语言:javascript复制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 允许工程师关注建议背后的 ML 和业务逻辑,而不是后台的工作,比如为每个查询获取适当数量的候选者。它还提供了高度的代码可重用性。例如,使用排序器就像在 IGQL 查询中添加一行规则一样简单。在多个地方添加它是很简单的,比如排名账户和这些账户发布的排名媒体。
个性化的帐户嵌入个性化排名内容
人们在 Instagram 上公开分享数十亿条高质量的媒体内容,这些内容对 Explore 都是合格的内容。保持一个清晰和不断发展的目录样式的分类法对于探索上的各种兴趣团体来说是具有挑战性的 —— 有各种各样的主题,从阿拉伯书法到模型训练到 slime 都有。因此,基于内容的模型很难把握如此多样的基于兴趣的群体。
因为 Instagram 有大量基于特定主题的关注兴趣的账户,比如德文郡的雷克斯猫或古董拖拉机,我们创建了一个检索 pipeline,关注账户级别的信息,而不是媒体级别的信息。通过构建帐户嵌入,我们能够更有效地识别哪些帐户在主题上彼此相似。我们使用 ig2vec(一种类似 word2vecd 的嵌入框架)来得到帐户嵌入。通常,word2vec 嵌入框架根据训练语料库中句子的上下文来学习单词的表示。Ig2vec 将用户与之交互的帐户 id(例如,用户喜欢来自帐户的媒体)视为句子中的单词序列。
采用与 word2vec 相同的技术,我们可以预测特定帐户在给定的回话场景中是否和一个人发生关联。如果一个人与一个账户在同一个会话序列中,相比于从各种各样的 Instagram 账户中得到的随机序列,它更有可能是主题连贯的。这有助于我们识别局部相似的帐户。
我们定义了两个账户之间的距离度量 — 嵌入训练中使用的相同的度量 — 通常是余弦距离或点积。基于此,我们做一个 KNN 查找来查找嵌入中的任何帐户的主题相似的帐户。我们的嵌入覆盖了数百万个账户,我们使用 Facebook 最先进的近邻检索引擎 FAISS作为支持的检索基础设施。
对于每个版本的嵌入,我们训练一个分类器仅基于嵌入来预测一组帐户的主题。通过将预测主题与验证集中的人工标记主题进行比较,我们可以评估嵌入在多大程度上捕获了主题相似性。
检索与某个特定的人以前表示过的兴趣相似的帐户,可以帮助我们以一种简单而有效的方式缩小到每个人的更小的、个性化的排序清单。因此,我们能够利用最先进的和计算密集型的 ML 模型来服务每一个 Instagram 社区成员。
使用模型蒸馏来预先选择相关的候选项
在我们使用 ig2vec 根据个人兴趣来识别最相关的帐户之后,我们需要一种方法来对这些帐户进行排序,使其对每个人来说都是新鲜和有趣的。这需要在每个人每次滚动 Explore 页面时预测出最相关的媒体。
例如,通过深度神经网络对每个滚动动作进行评估,即使只有 500 个媒体片段,也需要大量的资源。然而,我们为每个用户评估的帖子越多,我们就越有可能从他们的库存中找到最好的、最个性化的媒体。
为了能够最大化每个排名请求的媒体数量,我们引入了一个排名蒸馏模型,该模型帮助我们在使用更复杂的排名模型之前预先选择候选对象。我们的方法是训练一个超轻量级的模型,它从我们的主要排名模型中学习并尽可能地接近它们。我们从更复杂的排序模型中记录具有特征和输出的候选输入。然后,用一组有限的特征和一种更简单的神经网络模型结构对这些记录数据进行训练,以复制结果。其目标函数是优化 NDCG 排名(排名质量的衡量)损失超过主要排名模型的输出。我们使用蒸馏模型中排名最高的帖子作为后期高性能排名模型的候选排名。
建立蒸馏模型的模拟行为可以最大限度地减少调整多个参数和在不同的分级阶段维护多个模型的需要。利用这一技术,我们可以有效地评估更大的媒体集,以在控制计算资源的同时找到每个排名请求中最相关的媒体。
如何构建 Explore
在创建了便于实验、有效识别人们的兴趣并产生有效且相关的预测所需的关键构件之后,我们必须在生产中将这些系统结合在一起。利用 IGQL、account embeddings 和我们的蒸馏技术,我们将 Explore 推荐系统分为两个主要阶段:候选生成阶段(也称为采购阶段)和排名阶段。
Explore系统框架
候选生成
首先,我们利用人们以前在 Instagram 上互动过的账户(例如,喜欢或保存某个账户上的媒体)来识别人们可能感兴趣的其他账户。我们称之为种子账户。种子账户通常只是 Instagram 上兴趣相似或相同的账户的一小部分。然后,我们使用帐户嵌入技术来识别类似于种子帐户的帐户。最后,根据这些帐户,我们可以找到这些帐户发布或参与的媒体。
这张图展示了Instagram Explore推荐的一个典型的召回过程。
人们可以通过许多不同的方式来使用 Instagram 上的账号和媒体(比如关注、点赞、评论、保存和分享)。还有不同的媒体类型(例如,照片、视频、故事和现场直播),这意味着我们可以使用类似的方案构建多种来源。利用 IGQL,这个过程变得非常简单 —— 不同的候选源只表示为不同的 IGQL 子查询。
通过不同类型的信息来源,我们能够为普通人找到成千上万的合格候选人。我们想要确保我们推荐的内容既安全又适合探索的全球社区的许多年龄。使用各种信号,我们在为每个人建立合适的目录之前,过滤掉我们认为不适合推荐的内容。除了阻止可能违反策略的内容和错误信息外,我们还利用 ML 系统来帮助检测和过滤垃圾邮件等内容。
然后,对于每个排名请求,我们为一个普通人识别数千个合格的媒体,从合格的目录中抽取 500 个候选人作为样本,然后将候选人发送到下游的排名阶段。
候选排序
有 500 个候选对象可供排序,我们使用一个三阶段的排序基础结构来帮助平衡排序相关性和计算效率之间的权衡。我们的三个排名阶段如下:
- 第一遍:蒸馏模型模仿其他两个阶段的组合,具有最小的特征,从 500 名候选人中选出 150 名最优秀、最相关的候选人。
- 第二步:一种轻量级的神经网络模型,具有完整的稠密特征集,挑选 50 个最优秀和最相关的候选人。
- 最后一步:深度神经网络模型,具有完整的稠密和稀疏特征。选择 25 个最高质量和最相关的候选者(用于 Explore grid 的第一页)。
如果第一步的蒸馏模型在排序顺序上模仿其他两个阶段,我们如何决定接下来两个阶段中最相关的内容?我们预测人们在每一种媒体上的行为,无论是积极的行为,如“喜欢”和“保存”,还是消极的行为,如“少看这样的帖子”。我们使用一个多任务多标签(MTML)神经网络来预测这些事件。共享多层感知器(MLP)允许我们捕获来自不同操作的公共信号。
我们使用一个算术公式(称为值模型)来结合对不同事件的预测,以捕获不同信号的显著性,从而决定内容是否相关。我们使用预测的加权和,如[w_like * P(Like) w_save * P(Save) - w_negative_action * P(Negative Action)]。例如,如果我们认为一个人在 Explore 上保存一个帖子的重要性高于他喜欢的帖子,那么保存动作的权重应该更高。
我们还希望 Explore 成为一个人们可以发现新利益和现有利益之间的丰富平衡的地方。我们在价值模型中加入一个简单的启发式规则来增加内容的多样性。我们通过添加惩罚因子来降低来自同一作者或同一种子账户的帖子的排名,这样你就不会在 Explore 中看到来自同一作者或同一种子账户的多个帖子。当你在同一作者的文章中遇到更多的文章时,这个惩罚就会增加。
我们根据每个排序候选的最终价值模型得分,以后代的方式对最相关的内容进行排序。离线回放工具——连同(贝叶斯优化工具) —— 帮助我们调整有效的价值模型,经常作为我们的系统进化工具。
正在进行的 ML 挑战
构建 Explore 最令人兴奋的部分之一,就是不断寻找新的、有趣的方式,帮助我们的群体在 Instagram 上发现最有趣、最相关的内容。我们一直在不断改进 Instagram 的探索方式,比如在购物帖子和 IGTV 视频等新内容中加入故事和入口点等媒体格式。
Instagram 社区和库存的规模要求建立一种高速实验的文化和开发人员的效率,以可靠地为每个人的个人兴趣推荐最好的 Instagram。我们的自定义工具和系统为我们提供了一个强大的基础,不断学习和迭代,这对于构建和扩展 Instagram Explore 是必不可少的。
—END—
英文原文:https://ai.facebook.com/blog/powered-by-ai-instagrams-explore-recommender-system