Twitter开源时间线推荐架构整理(Twitter‘s Recommendation Algorithm)

2023-10-27

马斯克最近开源了部分 Twitter的代码,主要有两个仓库,

  • main repo(https://github.com/twitter/the-algorithm/)
  • ml repo(https://github.com/twitter/the-algorithm-ml)
  • 官方介绍:https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm

此次发布的大部分代码是推荐算法,包括给用户在时间线上推文的机制等等。并且看起来这个github会持续更新,本篇文章也尝试理一下这部分的推荐机制。

时间线推文(For You timeline)的整体框架如下图所示,
在这里插入图片描述
其主要分为三个模块:

  • DATA。数据部分主要是三大块:用户、推文、社交网络。
  • FEATRUE。特征部分除了计算用户和推文的特征外,社交图中的社区发现特征等十分重要,另外还有一些信用和安全的特征。
  • HOME MIXER。执行推荐的整个服务,基于scala,执行推文召回、粗/精排序、重/混排

最后实现Timeline、Who to follow、Ads的三个任务,即给用户推文、推用户、推广告

下面分别简要介绍一下各个模块。

DATA
在推特这种社交属性明显的场景中,数据几乎就是由用户之间的互动、用户和推文之间的互动所构成的。因此DATA部分分为Follow graph、Tweet engagement、User data。

  • Follow graph。社交图,也是推特场景中十分重要的数据。
  • Tweet engagement。Engagement单词的本意是「约定、婚约」,在行销领域中常被用于表示企业品牌、消费者和企业之间的关系,延伸到社交平台中的含义变为「互动」。如facebook中的互动主要包括:获赞、评论、分享、点击次数等。而在twitter中主要是点击、转发、点赞和关注等。
  • User data。用户画像,包含用户的一些基础数据。

在这里插入图片描述

FEATRUES
FEATRUES指特征工程,包括embedding嵌入、社交图特征如聚类和社区发现、用户信用和违规检测等,这些特征后续可以用于召回、排序、安全等等具体模块(具体可见下一节的HOME MIXER)。

特征主要分为:GraphJet、SimClusters、TwHIN、RealGraph、TweepGred、Trust&Safety。

  • 社交特征。GraphJet是社交图特征。通过分析用户已经关注的人或具有相似兴趣的人,如关注的人所浏览的内容,即社交图中的二跳关系U2U2I。因此为了实现高效动态图构造和游走,Twitter内部自研了GraphJet图引擎(VLDB 2016)。

  • 嵌入特征。目标得到user embedding和item embedding,主要分为稀疏嵌入和稠密嵌入两种,前者通过聚类、后者基于图学习。具体是两种算法:

    • SimClusters(稀疏),做社区检测和稀疏嵌入,如上图所示。其根据流行度和用户行为将推文、用户划分到不同空间(聚类),发表于KDD 2020,共有14.5w个社区、每3周更新一次。
    • TwHIN(稠密),基于图学习做稠密嵌入,如下图所示。该异构图包括四种类型的实体(user、tweet、advertiser、ad),和七种不同的互动关系(follows、authors、favorites、replies、retweets、promotes、clicks),通过该异构图得到的稠密特征可以在具体模块中负责图召回、排序等。
      在这里插入图片描述
  • RealGraph用于偏好预测,主要进行边预测,即用户是否互动。这个特征主要用于粗排模块中,作为LR粗排的一个辅助,具体在粗排模型中进行介绍。

  • TweepGred用于信用预测,基于pagerank评价用户的声誉。

  • Trust&Safety用于检测不可信和不安全等违规内容。

在这里插入图片描述

HOME MIXER
HOME MIXER是推特推荐的核心服务(Scala框架),其分为Candidate Source、Heavy Ranker、Heuristics & Filtering三个大块(分别对应召回、粗/精排、重/混排),其中每一小块内有多种小组件,如上图所示。

Candidate Source(即召回)。目的是从不同的源(量级亿万)召回一些最新、质量高的推文,主要是利用社交图召回,有两个召回路,一路是已经关注的社交圈(in-network),和待探索的社交圈(out-of-network),理论比例是各50%出现在用户的时间流推文中,实际上这个比例会根据用户的兴趣而适配。

召回模块的各小组件主要有如下,其中Search Index是社交图内的,CR Mixer,UTEG和FRS是社交图网络外的内容。

  • Search Index (in-network)。使用Real Graph(用户是否互动),Trust&Safety(是否安全),TweepGred(是否可信)的特征。基于推文搜索系统 (Earlybird) 查找某个用户已经过关注人的所有推文。
  • UTEG (in-network)。UTEG是user-tweet-entity-graph的缩写,使用GraphJet特征(社交图特征)做协同过滤进行推文。
  • CR Mixer (out-of-network)。用于社交网络外的内容召回,使用SimClusters、TwHIN、Trust&Safety和GraphJet特征,可以看到都是社区检测的相关特征。
  • FRS (out-of-network)。也用于社交网络外的内容召回,FRS是follow-recommendation-service的缩写,因此它是一个给用户推荐关注的服务(Who-To-Follow ),使用GraphJet、RealGraph、SimClusters等社区发现的特征。

在这里插入图片描述

Heavy Ranker(即粗/精排)。Candidate Source中的两路召回in-network、out-network得到的推文,会先进粗排再进精排。

负责粗排有两个模型,第一个是LR模型,预测用户和推文有互动的概率,如上图所示,具体特征有

  • search context features。搜索上下文时间,包括用户语言,时间等等。
  • tweet data。推文的特征,包括推文所用语言,用户id等。
  • static features。评价推文的静态文本质量,如是否有url等等。
  • realtime features。实时推文被转发、回复、关注等等。
  • user table features。用户的信誉、粉丝数目等等。

不同特征会有不同的权重,如点击的权重为1,点赞的权重为2等,如下表所示。

INDEX_BY_LABEL = {
  "is_clicked": 1,
  "is_favorited": 2,
  "is_open_linked": 3,
  "is_photo_expanded": 4,
  "is_profile_clicked": 5,
  "is_replied": 6,
  "is_retweeted": 7,
  "is_video_playback_50": 8
}

在这里插入图片描述

第二个粗排模型是基于RealGraph: User Interaction Prediction at Twitter,如上图所示,本质是个链接预测任务,去预测用户和用户交互的概率。包括图构成、模型训练和应用。

  • Graph Generation。RealGraph是一个有向带权同构图,节点是用户、边是用户与用户的交互关系(follow graph、addressbook、interaction data)。
  • Model Learning。基于边特征,仍然使用使用逻辑回归模型来训练。
  • Application。预测用户之间的交互概率,交互概率越高,就会推该用户更多的推文。

过粗排模型后,两路召回会各自排出750条推文,然后将共1500的数量进精排。

在这里插入图片描述
精排模型来自新浪KDD 2021,MaskNet: Introducing Feature-Wise Multiplication to CTR Ranking Models by Instance-Guided Mask,如上图所示。主要提出了一种instance-guided mask方法将全局上下文信息进行动态融入。首先,所有输入的特征会被concat在一起, V e m b = c o n c a t ( e 1 , e 2 , … , e i , … , e f ) V_{emb}=concat(e_1,e_2,…,e_i,…,e_f) Vemb=concat(e1,e2,,ei,,ef)为了充分利用全局上下文,Instance-Guided Mask使用两层FC来投影,
V m a s k = W d 2 ( W d 1 V e m b + β d 1 ) + β d 2 V_{mask}=W_{d2}(W_{d1}V_{emb}+\beta_{d1})+\beta_{d2} Vmask=Wd2(Wd1Vemb+βd1)+βd2再利用element-wise product来融合全局上下文信息, V m a s k e d E M B = V m a s k ⊙ V e m b V_{maskedEMB}=V_{mask}\odot V_{emb} VmaskedEMB=VmaskVemb V m a s k e d H I D = V m a s k ⊙ V h i d d e n V_{maskedHID}=V_{mask}\odot V_{hidden} VmaskedHID=VmaskVhidden所以其实instance-guided mask可以被看作为一种gate,用于可以加强某些特征,减弱某些噪声对模型的影响。最后以多个这种MaskBlock作为基本单元,串行MaskBlock或者并行MaskBlock得到MaskNet。

而Twitter所用的MaskNet网络参数48M,特征6k,一个多目标模型,目标数量涵盖包括互动、时长和画风等10个方面,如下:

  • “recap.engagement.is_favorited”:是否喜欢推文
  • “recap.engagement.is_good_clicked_convo_desc_favorited_or_replied”:是否点击进推文并回复或点赞
  • “recap.engagement.is_good_clicked_convo_desc_v2”:是否点击进推文并停留至少 2 分钟
  • “recap.engagement.is_negative_feedback_v2”:是否做出负面反馈(屏蔽或静音推文)
  • “recap.engagement.is_profile_clicked_and_profile_engaged”:是否打开作者的资料
  • “recap.engagement.is_replied”:是否回复
  • “recap.engagement.is_replied_reply_engaged_by_author”:回复的推文被原文作者回复
  • “recap.engagement.is_report_tweet_clicked”:是否举报推文
  • “recap.engagement.is_retweeted”:是否转发
  • “recap.engagement.is_shared”:是否分享
  • “recap.engagement.is_tweet_detail_dwelled_15_sec”:是否停留超过15s
  • “recap.engagement.is_video_playback_50”:是否观看至少一半视频

Heuristics & Filtering(即重/混排)。这一部分主要设计一些启发式的过滤策略(重排),和混排推文、推人、推广告等下端应用。

  • Visibility Filtering: 可见性过滤,即屏蔽一些推文或者讨厌用户的推文。
  • Author Diversity: 作者多样性,避免来自同一作者的太多连续推文。
  • Content Balance: 内容平衡,上文中在社交圈和不在社交圈中的推文占比。
  • Feedback-based Fatigue: 针对用户提供的负面反馈,制定对应策略降低某些推文的分数。
  • Social Proof: 排除与推文没有二级关联的社交圈外的推文,即确保推文来自关注的人与推文互动、或关注推文的作者们。
  • Conversations: 通过将回复与原始推文串连在一起,为回复提供更多上下文展示。
  • Edited Tweets: 更新检测,确定当前设备上的推文是否过时,并发送指令以将其替换为编辑后的版本。

混排是最后一步,系统会将推文与其他非推文内容(如推广告、推关注人)混合在一起,然后再这些内容将返回到设备上进行显示。 上面的流程每天运行大约 50 亿次,平均完成时间不到 1.5 秒。单个管道执行需要 220 秒的 CPU 时间,几乎是在应用程序上看到的延迟的 150 倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Twitter开源时间线推荐架构整理(Twitter‘s Recommendation Algorithm) 的相关文章

  • 在 Twitter Fabric 中使用自定义登录按钮?

    我一直在尝试使用普通按钮来使用 twitter sdk 执行身份验证过程 但它似乎不起作用 有人尝试过类似的事情吗 我已经正确设置了 API 密钥等 登录过程正确执行 但回调部分似乎没有被调用 我的日志都没有被执行 成功或失败部分都没有 T
  • 从对象中获取数据

    我正在尝试使用此代码从用户的 Twitter 帐户获取数据 user info twitteroauth gt get account verify credentials 我在一个对象中得到一个很长的值 stdClass Object i
  • Rails 如何处理模型中的错误和异常

    所以我使用 twitter 库解析 Rails 中 twitter api 的数据 有时 api 的响应可能是这样的 error Invalid parameter 模型会引发异常 现在我默默地捕获它并将 error message 放入日
  • 如何使用我自己的 CSS 设计 Twitter 小部件的样式

    我有自己的 Twitter feed 设计 并且我想使用我自己的设计来设计默认 feed 的样式 有没有办法做到这一点 问题是您无法使用 CSS 选择器 因为它仅在加载页面后才出现 请检查这张图片 让您更多地了解我需要什么 Thanks 好
  • 可以设计自定义推文按钮并利用数据属性吗?

    我正在使用自己的样式创建自定义推文按钮 但是当您选择自定义自己的样式时 您似乎无法使用数据属性 数据文本 数据网址等 仅当您使用使用小部件 javascript 的 Twitter 样式按钮时 数据属性的使用才显得可用 http platf
  • Twitter APi“代码”:215,“消息”:“错误的身份验证数据

    接收错误 code 215 message 错误的身份验证数据 in my page var dump page 我读到 Friends exist 不再适用于 1 1 版本 因此我需要使用 Friends lookup 来比较一个 Twi
  • Rails Beta 请求注册并提供社交媒体分享奖励

    我想构建一个简单的测试版请求注册页面 当用户尽可能多地共享应用程序的链接时 用户将获得更早的奖励 这样的解决方案可以在 特伦维网站 用户输入电子邮件 用户通过其独特的代码获得独特的链接 用户在每次注册时分享此链接 这对他来说是 1 管理方法
  • 使用 Android API 发布推文

    我一直在寻找一种使用 Android 应用程序发布推文的方法 但我发现的所有方法都不起作用 我不得不承认 Twitter 的 API 并不是那么容易理解 但是我的代码并不长 而且我看不出我的错误在哪里 这是我的代码 public class
  • 通过 iOS 应用程序在 Twitter 上分享视频

    是否可以使用 SLRequest 分享视频 我可以使用相同的方式共享图像 SLRequest postRequest SLRequest requestForServiceType SLServiceTypeTwitter requestM
  • tweepy 计数限制为 200?

    我目前正在尝试检索一些拥有大量关注者的大帐户的关注者 我正在使用 Tweepy 和这段代码 带光标 follower cursors tweepy Cursor api followers id id var count 5000 for
  • @iPhone:如何在我们的应用程序中创建 twitter + OAuth 自定义登录

    我正在制作iphone应用程序 我正在使用 OAuth 集成 Twiiter 我的问题是我想要自己的登录页面 而不是像 twitter 提供的新 OAuth 集成那样由 twitter 提供 通过在新的 OAuth 中创建自定义登录页面 是
  • Twitter REST API:可以热链接 Twitter 图像吗?为什么 Firefox 中不显示图像?

    我正在尝试从 Twitter REST API 中提取图像并显示这些图像 因此 我陷入了逻辑僵局 因为我的 PHP HTML 代码未在本地主机 PHP 内置开发服务器的浏览器中显示图像 我更喜欢 Firefox 因为它是更安全 私密 的浏览
  • Twitter 宝石搜索方法

    我的代码在这里 require twitter search Twitter Search new containing obama 它返回我们
  • 如何让 NSURLRequest 获取 Twitter 请求令牌?

    我正在尝试使用以下代码从 Twitter 获取请求令牌 NSMutableURLRequest mURLRequest NSMutableURLRequest alloc initWithURL NSURL URLWithString ht
  • WSGI 中的 httplib CannotSendRequest 错误

    我使用了两个不同的 python oauth 库和 Django 来通过 twitter 进行身份验证 该设置是在带有 WSGI 的 apache 上进行的 当我重新启动服务器时 大约 10 分钟一切正常 然后 httplib 似乎锁定了
  • 我可以查看当前登录的 Twitter 用户吗?

    他们没有通过我的网站进行 OAuth 验证 但在该浏览器上登录到 Twitter 有什么办法让我知道他们的 Twitter 用户名吗 饼干 什么 除非某些东西非常糟糕或者 Twitter 明确提供了用于此目的的 API 否则不会 至少不是通
  • Twitter 的推文按钮有回调吗?

    有没有办法在 Twitter 的推文按钮上注册回调 我希望能够跟踪我网站上的哪些特定用户在 Twitter 上发布了链接 我无法添加 onClick 事件 因为它是跨域 iFrame 还有其他想法吗 我见过一种方法 https stacko
  • 在 Python/Django 中将用户的 facebook/twitter 好友与网站用户进行比较

    我想知道是否有人可以帮助指导解决这个相当常见的问题的方法 我正在构建一个简单的网站 用户可以连接他们的 Twitter 帐户进行注册 我想创建一个界面 向他们显示哪些推特好友已经在使用该网站 因此 我可以获得用户的 Twitter 朋友列表
  • 公共地理推文是否选择 Twitter 的 Search 或 Streaming API?

    我想开发一个 Android 应用程序 它将根据用户的 当前 指定 位置从 Twitter 公共时间线获取地理标记的推文 我将有一个刷新按钮 如果在特定时间可用 将获取更多推文 自定义大小最多 30 条 那么哪个API适合这种情况呢 搜索
  • Twitter URL 编码

    我们即将发起一场小小的推特圣诞竞赛 但我遇到了一些小障碍 要进入 人们需要按以下格式发布推文 user blah blah blah hashtag 目前 我有一个表单 他们可以在其中输入答案 废话 废话 废话 和一个 PHP 脚本 该脚本

随机推荐

  • 正确的打日志姿势

    前言 比较认同 转载一下 使用slf4j 使用门面模式的日志框架 有利于维护和各个类的日志处理方式统一 实现方式统一使用 Logback框架 什么时候应该打日志 当你遇到问题的时候 只能通过debug功能来确定问题 你应该考虑打日志 良好的
  • matlab中的科学记数法变成小数形式

    例如 假如rectx的形式在命令窗口显示 rectx 1 0e 05 5 2294 5 2294 5 2294 5 2294 5 2294 那么 命令窗口输入vpa rectx ans 522938 95232622162438929080
  • MyBatis动态推理参数类型

    前言 思考一个问题 前面的 和 的区别中 我们知道了 MyBatis底层调用的是preparestatement这种预编译的方式 这种方式sql语句会预先编程 select from t user where id 这种形式 随后调用set
  • 51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)

    CS1237芯片是一枚国产24位A D转换芯片 输出速率可选 10Hz 40Hz 640Hz 1 28kHz 内置时钟电路 不需外部晶振 带可编程PGA PGA放大倍数可选 1 2 64 128 2 线 SPI通信接口 最快速率为 1 1M
  • Mysql Workbench使用教程

    lt 1 gt MySQL Workbench MySQL Workbench 为数据库管理员 程序开发者和系统规划师提供可视化的Sql开发 数据库建模 以及数据库管理功能 lt 2 gt MySQL Workbench 的下载和安装 1
  • window.open() is not a function

    这个报错的产生原因是 重新定义了一个open变量 所以导致了window open 读取错误 解决方法 最好换个变量名
  • stan的siebel学习笔记一

    今天开始学习siebel先从概念理论开始 Siebel CRM 系统的应用环境 Siebel CRM系统的应用环境由以下三部分组成 n 核心数据库 RDBMS 和Siebel 文件系统 存储企业各类数据和文档 n 客户 Siebel Cli
  • 为什么java文件名要和类名一致

    1 Java保存的文件名必须与类名一致 2 如果文件中只有一个类 文件名必须与类名一致 3 一个Java文件中只能有一个public类 4 如果文件中不止一个类 文件名必须与public类名一致 5 如果文件中不止一个类 而且没有publi
  • 前端-富文本上传图片(若依框架vue)

    上传图片显示到页面上这个过程的实现需要和后端配合 在成功上传的回调函数中请求一个提交图片的地址 请求成功会给返一个地址 再将这个图片地址插入到富文本中就实现了 请求提交图片地址的过程就是你要把图片返给后端让其存到数据库中 存好了再返给前端
  • 我在阿里工作9年,今天我离职了

    相关阅读 阿里职位层级 附P级详细要求 我在公司待了 6 年 清退我却只花了 6 分钟 Docker 完全指南 2009年7月3号正式入职 2018年7月3号 last day 特意选择了这一天 阿里是我的第一份工作 也是迄今为止待得最久的
  • python的数值运算操作符,数值运算函数和数字类型转换函数

    python的数值运算操作符 1 x y x与y之和 2 x y x与y之差 3 x y x与y之积 4 x y x与y之商 5 x y x与y之整数商 即不大于x与y之商的最大整数 6 x y x与y之商的余数 也称模运算 7 x x的负
  • Elasticsearch快速入门

    Elasticsearch入门学习 一 初识Elasticsearch 1 什么是Elasticsearch 2 正向索引和倒排索引 3 安装ES 4 安装Kibana 5 安装IK分词器 二 索引库操作 1 创建索引库 2 查询索引库 3
  • node+express导出excel表

    前言 node表格导出excel的方式有好几种 现在还在持续更新的只有node xlsx excel export 1 js xlsx 入口 目前 Github 上 star 数量最多的处理 Excel 的库 支持解析多种格式表格XLSX
  • Uniapp微信小程序转支付宝小程序

    Uniapp打包成小程序后即可使用 注意事项及修改内容 在manifest json配置支付宝小程序APPID 获取手机号功能需要去小程序平台获取相对应的能力 能力有 转账 小程序二维码 模板消息 图片内容安全 音频播放等等 3 需要配置支
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 沈师 PTA 数据库题目及部分解析 第二章

    判断题 1 表中不同的列不能出自同一个域 F 不同列可出自同一个域 2 关系的外码是允许有空值的 T 3 候选码的值可以唯一地表示关系中的一个元组 T 4 一个关系模式可以有多个 候选键 T 5 已知系 系编号 系名称 系主任 电话 地点
  • 搭建 frp 内网穿透服务器

    写在前面 国内 腾讯云 和 阿里云服务器 都需要对安全组进行配置才可以访问 一 云服务器 阿里云服务器 推荐 开发者成长计划 云服务器管理控制台 初次登录需要密码 这时可通过重置 root 密码解决 腾讯云服务器 云产品免费试用 云服务免费
  • python导入文件

    python导入同级模块 在同一个文件夹中的py文件 直接导入即可 import xxx 如在file1 py中想导入file2 py 注意无需加后缀 py import file2 使用file2中函数时需加上前缀 file2 即 fil
  • ChatGPT 使用详细指南

    ChatGPT 使用详细指南 欢迎使用 ChatGPT 本指南将带您了解如何与 ChatGPT 互动以及如何充分利用其功能 了解 ChatGPT 开始使用 提高准确性 多轮对话 了解模型限制 提高创意输出 确保安全和隐私 反馈问题 1 了解
  • Twitter开源时间线推荐架构整理(Twitter‘s Recommendation Algorithm)

    马斯克最近开源了部分 Twitter的代码 主要有两个仓库 main repo https github com twitter the algorithm ml repo https github com twitter the algo