推特旨在为您提供目前世界上正在发生的事情。这需要一个推荐算法来提炼每天发布的大约5亿条推文,这些推文最终显示在设备的“为你推荐”时间线上的少数热门推文。本博客介绍了算法如何为您的时间线选择推文。
我们的推荐系统由许多相互关联的服务和工作组成,我们将在这篇文章中详细介绍。虽然该应用程序中有许多推荐推文的领域——搜索、探索、广告——但这篇文章将重点关注主页时间线的For You提要。
Twitter建议的基础是一组核心模型和功能,这些模型和功能从推文、用户和参与数据中提取潜在信息。这些模型旨在回答有关Twitter网络的重要问题,例如“您未来与其他用户互动的可能性有多大?”或者,“推特上的社区是什么,其中有哪些热门推文?”准确回答这些问题使Twitter能够提供更相关的建议。
推荐管道由三个主要阶段组成,这些阶段使用以下功能:
- 在一个称为候选人来源的过程中,从不同的推荐来源获取最佳推文。
- 使用机器学习模型对每条推文进行排名。
- 应用启发式和过滤器,例如过滤掉您已阻止的用户的推文、NSFW内容和您已经看到的推文。
负责构建和服务For You时间线的服务称为Home Mixer。Home Mixer建立在Product Mixer上,Product Mixer是我们的自定义Scala框架,有助于构建内容提要。该服务充当连接不同候选源、评分函数、启发式和过滤器的软件骨干。
下图说明了用于构建时间线的主要组件:

让我们探索这个系统的关键部分,大致按照单个时间线请求中调用的顺序,从从候选来源检索候选人开始。
推特有几个候选来源,我们用它来为用户检索最近和相关的推文。对于每个请求,我们试图通过这些来源从数亿的池中提取最好的1500条推文。我们从您关注的人(网络内)和您不关注的人(网络外)中寻找候选人。今天,For You时间线平均由50%的网络内推文和50%的网络外推文组成,尽管这可能因用户而异。
1.内部网络来源(In-Network Source)
网络内来源是最大的候选来源,旨在提供您关注的用户最相关的最新推文。它使用逻辑回归模型根据您关注的推文的相关性对其进行有效排名。然后,热门推文将发送到下一阶段。
网络内推文排名中最重要的组成部分是Real Graph。Real Graph是一个预测两个用户之间参与可能性的模型。你和推文作者之间的真实图表分数越高,我们包含的推文就越多。
网络内来源一直是Twitter最近工作的主题。我们最近停止使用Fanout服务,这是一项已有12年历史的服务,以前用于从每个用户的推文缓存中提供网络推文。我们还正在重新设计逻辑回归排名模型,该模型是几年前最后一次更新和训练的!
2.外部网络来源(Out-of-Network Sources)
在用户网络之外查找相关推文是一个更棘手的问题:如果您不关注作者,我们如何判断某条推文是否与您相关?推特采取两种方法来解决这个问题。
2.1. 社交图表
我们的第一个方法是通过分析您关注的人或有类似兴趣的人的参与情况来估计您认为相关的内容。
我们遍历了参与的图表,并在下面回答以下问题:
- 我最近关注的人参与了哪些推文?
- 谁喜欢与我类似的推文,他们最近还喜欢什么?
我们根据这些问题的答案生成候选推文,并使用逻辑回归模型对结果推文进行排名。这种类型的图形遍历对我们的网络外建议至关重要;我们开发了GraphJet,这是一个图形处理引擎,可以维护用户和推文之间的实时交互图,以执行这些遍历。虽然这种用于搜索Twitter参与和关注网络的启发式方法已被证明是有用的(这些目前服务于约15%的家庭时间线推文),但嵌入空间方法已成为网络外推文的更大来源。
2.2. 嵌入空间(Embedding Spaces)
嵌入空间方法旨在回答一个关于内容相似性的更一般性问题:哪些推文和用户与我的兴趣相似?
嵌入通过生成用户兴趣和推文内容的数字表示来工作。然后,我们可以计算此嵌入空间中任何两个用户、推文或用户-推文对之间的相似性。只要我们生成准确的嵌入,我们就可以利用这种相似性作为相关性的替身。
Twitter最有用的嵌入空间之一是SimClusters。SimClusters使用自定义矩阵分解算法发现由一群有影响力的用户锚定的社区。有14.5万个社区,每三周更新一次。用户和推文在社区空间中都有代表,并且可以属于多个社区。社区规模从个人朋友群的数千名用户到新闻或流行文化的数亿用户不等。这些是一些最大的社区:
我们可以通过查看推文目前在每个社区中的受欢迎程度,将推文嵌入到这些社区中。来自社区的用户越喜欢推文,推文就越能与该社区相关联。
For You时间表的目标是为您提供相关推文。在筹备的这一点上,我们有大约1500名可能相关的候选人。评分直接预测每个候选人推文的相关性,并且是您在时间表上对推文进行排名的主要信号。在这个阶段,所有候选人都受到平等对待,而不考虑其来源。
排名是通过~48M参数神经网络实现的,该神经网络在推文交互上不断接受培训,以优化积极参与(例如点赞、转发和回复)。这种排名机制考虑了数千个功能,并输出十个标签,给每条推文打分,其中每个标签代表参与的概率。我们从这些分数中对推文进行排名。
排名阶段结束后,我们应用启发式和过滤器来实现各种产品功能。这些功能协同工作,创造出平衡和多样化的饲料。一些例子包括:
- 可见性过滤:根据推文的内容和您的偏好过滤掉推文。例如,从您阻止或静音的帐户中删除推文。
- 作者多样性:避免来自单个作者的太多连续推文。
- 内容平衡:确保我们提供网络内和网络外推文的公平平衡。
- 基于反馈的疲劳:如果观众围绕某些推文提供了负面反馈,则降低某些推文的分数。
- 社会证明:作为质量保障,在没有与推文有二级连接的情况下排除网络外推文。换句话说,确保您关注的人与推文互动或关注推文的作者。
- 对话:通过将回复与原始推文进行线程化,为回复提供更多上下文。
- 已编辑的推文:确定当前设备上的推文是否过时,并发送说明将其替换为已编辑的版本。
此时,Home Mixer有一组推文准备发送到您的设备。作为该过程的最后一步,系统将推文与其他非推文内容(如广告、关注建议和入职提示)混合在一起,这些内容将返回到您的设备上显示。
上面的管道每天运行约50亿次,平均在1.5秒内完成。单个管道执行需要220秒的CPU时间,几乎是您在应用程序上感知的延迟的150倍。
我们开源努力的目标是向您(我们的用户)提供有关我们系统如何工作的完全透明。我们已经发布了支持我们建议的代码,您可以在这里(和这里)查看,以更详细地了解我们的算法,我们还正在开发几个功能,以便在我们的应用程序中为您提供更大的透明度。我们计划的一些新发展包括:
- 为创作者提供更好的Twitter分析平台,提供有关覆盖范围和参与度的更多信息
- 适用于您的推文或帐户的任何安全标签的透明度更高
- 更好地了解推文为什么出现在您的时间线上
参考链接:
https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm