Twitter 推荐系统的算法已开源,感兴趣的小伙伴可以阅读 https://github.com/twitter/the-algorithm。

Twitter 的目标是将世界上正在发生的最佳动态呈现给您。这需要一个推荐算法,将每天发布的大约 5 亿条推文筛选为一小部分顶级推文,最终显示在您设备上的 "For You" 时间线上。本博客将介绍推荐算法项您推荐推文的流程。

我们的推荐系统由许多相互连接的服务和任务组成,我们将在本文中详细介绍。虽然应用程序的许多区域都有推荐推文,例如 Search、Explore 和 Ads,但本文将重点介绍主页时间线的 "For You" 动态。

如何选择推文

Twitter 推荐系统的基础是一套核心模型和功能,它从推文、用户和互动数据中提取潜在信息。这些模型旨在回答关于 Twitter 社区的重要问题,例如:“您将来与另一个用户互动的概率是多少?”或者,“Twitter 上有什么样的社区,其中的热门推文是什么?”准确回答这些问题将使 Twitter 能够提供更相关的推荐。

推荐系统的推荐流程由以下三个主要阶段组成:

  1. 从不同的推荐来源获取最佳推文,这个过程被称为候选来源(candidate sourcing)
  2. 使用机器学习模型对每条推文进行排名(rank)
  3. 应用启发式和过滤器(heuristics and filters),例如过滤掉您屏蔽的用户发的推文、不适合工作场合(Not Suitable For Work)的内容以及您已经看过的推文。

负责构建和提供“For You”的服务称为 Home Mixer。Home Mixer 基于我们定制的 Scala 框架 Product Mixer 构建,该框架有助于构建内容动态。此服务充当软件骨干(software backbone),连接不同的候选来源、评分功能、启发式和过滤器。

下面的示意图展示了推荐流程所使用的主要组件:

让我们探讨一下这个系统的关键部分,大致按照在单个时间线请求期间调用的顺序,首先从候选来源获取候选项开始。

候选来源(Candidate Sources)

Twitter 有几个候选来源,我们用它们为用户检索最近的相关推文。对于每个请求,我们尝试通过这些来源从数亿推文中提取最佳的 1500 条推文。我们从您关注的人(In-Network)和您未关注的人(Out-of-Network)中找到候选项。如今,"For You" 平均由 50% In-Network 推文和 50% Out-of-Network 推文组成,尽管这可能因用户而异。

In-Network Source

In-Network Source 是最大的候选来源,旨在为您提供关注用户的最相关、最新的推文。它使用逻辑回归模型根据相关性高效地对您关注的用户的推文进行排序,然后将排名最高的推文发送到下一阶段。

在 In-Network 推文排名中最重要的组成部分是 Real Graph(真实图谱)。Real Graph 是一个预测两个用户之间互动可能性的模型。您与推文作者之间的 Real Graph 分数越高,包含他们的推文将越多。

In-Network Source 是 Twitter 最近的研究课题。我们最近停止使用 Fanout Service,这是一个有 12 年历史的服务,之前用于为每个用户提供 In-Network 推文的缓存。我们在重新设计逻辑回归排名模型,这个模型最后一次更新和训练是几年前!

Out-of-Network Sources

在 Out-of-Network 寻找相关推文是一个更棘手的问题:如果您没有关注作者,我们如何判断某条推文对您是否相关?Twitter 采用两种方法来解决这个问题。

  1. 社交图谱(Social Graph)

我们的第一种方法是通过分析您关注的人或具有相似兴趣的人的参与情况来估计您会觉得什么是相关的。

我们遍历参与的社交图谱,以回答以下问题:

  • 我关注的人最近参与了哪些推文?
  • 谁和我喜欢相似的推文,他们最近还喜欢了什么?

我们根据这些问题的答案生成候选推文,并使用逻辑回归模型对生成的推文进行排序。这种类型的图谱遍历对我们的 Out-of-Network 推荐至关重要;我们开发了 GraphJet,一种维护用户与推文之间实时互动图谱的图处理引擎(graph processing engine),以执行这些遍历。虽然在 Twitter 参与和关注网络中搜索这样的启发式方法已被证明是有用的(这些方法目前为 Home Timeline 推文提供了约 15% 的服务),但嵌入空间(embedding space)方法已成为 Out-of-Network 推文的更大来源。

2. 嵌入空间(Embedding Spaces)

嵌入空间方法旨在回答关于内容相似性的更一般性问题:哪些推文和用户与我的兴趣相似?

嵌入通过生成用户兴趣和推文内容的数值表示来实现。然后我们可以计算在这个嵌入空间中任意两个用户、推文或用户-推文对的相似性。只要我们生成准确的嵌入,我们就可以将这种相似性作为相关性的替代品。

Twitter 最有用的嵌入空间之一是 SimClusters。SimClusters 使用定制的矩阵分解算法发现由有影响力的用户群组成的社区。一共有 145k 个社区,每三周更新一次。用户和推文在社区空间中得到表示,并可以属于多个社区。社区的规模从几千个用户的个人朋友团体,到数亿用户的新闻或流行文化。这些是一些最大的社区:

我们可以通过查看推文在每个社区中的当前受欢迎程度将推文嵌入到这些社区中。来自一个社区的用户越喜欢一条推文,这条推文就越与该社区相关。

排名(Ranking)

“For You”的目标是为您提供相关的推文。在处理流程的这个阶段,我们有大约 1500 个可能相关的候选推文。评分直接预测每个候选推文的相关性,并成为排名推文的主要指标。在这个阶段,所有候选推文都被平等对待,而不考虑它来自哪个候选来源。

排名是通过一个约 4800 万参数的神经网络实现的,该网络不断地在推文互动(Tweet interactions)上进行训练,以优化积极参与(如点赞、转发和回复)。这个排名机制考虑了数千个特征,并输出十个标签,为每条推文打分,每个标签代表一种参与的概率。我们根据这些分数对推文进行排名。

启发式、过滤器和产品特性

在排名阶段之后,我们应用启发式和过滤器来实现各种产品特性。这些特性共同创造了一个平衡和多样化的信息流。一些例子包括:

  • 可见性过滤:根据推文内容和您的偏好过滤推文。例如,删除您屏蔽或静音的账户发出的推文。
  • 作者多样性:避免连续出现单个作者的过多推文。
  • 内容平衡:确保我们提供的内容均包含 In-Network 和 Out-of-Network。
  • 基于反馈的疲劳度:如果观众对某些推文提供了负面反馈,降低其分数。
  • 社交证明:排除没有与推文建立二度关系的 Out-of-Network 推文作为质量保障。换句话说,确保您关注的某人参与了这条推文或关注了推文的作者。
  • 对话:通过将回复与原始推文串联,为回复提供更多上下文。
  • 编辑过的推文:判断设备上当前的推文是否过时,并发送指令将其替换为编辑过的版本。

Mixing and Serving

此时,Home Mixer 已经准备好一组推文,准备发送到您的设备。作为流程的最后一步,系统将推文与其他非推文内容(如广告、关注推荐和入门提示)混合在一起,然后返回到您的设备上显示。

上述流程每天运行约 50 亿次,平均完成时间不到 1.5 秒。单次流程执行需要 220 秒的CPU时间,几乎是您在应用上感知到的延迟的 150 倍。

我们开源努力的目标是向您(我们的用户)完全透露我们的系统是如何工作的。我们已经发布了推荐系统的代码,您可以在此处(以及此处)查看,以更详细地了解我们的算法。此外,我们还在开发一些功能,以在我们的应用程序中为您提供更大的透明度。