{\color{blue}{主要公开了两个仓库}}
第一个:系统整体架构
第二个:推特所用算法
{\color{blue}{推荐系统在Twitter的应用场景}}
通过对用户兴趣爱好分析,推特主要为用户推荐以下内容:推荐推文和广告、推荐用户(who to follow)和推荐HashTag(热点),其中广告内容被标注为Promoted (促销)
{\color{blue}{Twitter推荐系统主流程和算法组件}}
{\color{red}{广告推荐算法、超大规模图计算引擎GarphJet、搜索排序引擎Early Bird等核心组件未开源}}
按照流程整个推特的推荐框架如下图:
推荐流程:首先,从每天产生的海量推文(每日5亿)中召回用户可能感兴趣的1500条推文,然后,根据用户、推文和场景特征对1500条推文进行精排序,并根据业务规则调整排序,最后和推荐广告进行混排,推荐给用户
{\color{red}{召回:5亿推文}} -> {\color{red}{1500条推文}} -> {\color{red}{精排:用户、推文和场景特征}} -> {\color{red}{业务规则调整}} -> {\color{red}{混排:推文+广告}}
技术特点:以二分图、同构图、异构图等图神经网络技术为核心,充分挖掘用户-用户、用户-推文关系数据,解决用户层面交互概率问题,以及内容层面热门推文、热门话题问题,实现基于社交关系的实时推荐
主要包括如下几大部分
{\color{green}{数据准备}} :
在推特这种社交属性明显的场景中,数据几乎就是由用户之间的互动、用户和推文之间的互动所构成的。因此DATA部分分为Follow graph、Tweet engagement、User data。
用户属性数据/user data:用户画像,包含用户的一些兴趣爱好、地区、使用行为等基础数据。
社交网络/Social Graph: 社交图是推特场景中十分重要的数据,主要有用户之间关注关系、点赞等数据。
{\color{green}{特征工程 FEATRUES}} :
特征部分除了计算用户和推文的特征外,还包括embedding嵌入、社交图特征如聚类和社区发现、用户信用和违规检测,另外还有一些信用和安全的特征等,这些特征后续可以用于召回、排序、安全等等具体模块。
圈内社交关系RealGraph、社区发现SimClusters、大规模异构社交图TwHIN、图计算引擎GraphJet、
用户信用度TweepCred、安全和滥用检测Trust&Safty
社交特征:GraphJet是社交图特征。通过分析用户已经关注的人或具有相似兴趣的人,如关注的人所浏览的内容,即社交图中的二跳关系U2U2I。因此为了实现高效动态图构造和游走,Twitter内部自研了GraphJet图引擎
嵌入特征:目标得到user embedding和item embedding,主要分为稀疏嵌入和稠密嵌入两种,前者通过聚类、后者基于图学习。具体是两种算法:
{\color{red}{SimClusters}} (稀疏) Community detection and sparse embeddings into those communities
做社区检测和稀疏嵌入,如上图所示。 {\color{red}{其根据流行度和用户行为将推文、用户划分到不同空间(聚类)}} ,发表于KDD 2020,共有14.5w个社区、每3周更新一次。 详细介绍见下文
TwHIN(稠密),基于图学习做稠密嵌入,如下图所示。该异构图包括四种类型的实体(user、tweet、advertiser、ad),和七种不同的互动关系(follows、authors、favorites、replies、retweets、promotes、clicks),通过该异构图得到的稠密特征可以在具体模块中负责图召回、排序等。
RealGraph用于偏好预测,主要进行边预测,即用户是否互动。这个特征主要用于粗排模块中,作为LR粗排的一个辅助,具体在粗排模型中进行介绍。
- TweepGred用于信用预测,基于pagerank评价用户的声誉。
Trust&Safety用于检测不可信和不安全等违规内容
{\color{green}{Candidate Source(即召回)}}
目的是从不同的源(量级亿万)召回一些最新、质量高的推文,主要是利用社交图召回。有两个召回路,一路是已经关注的社交圈(in-network),和待探索的社交圈(out-of-network),理论比例是各50%出现在用户的时间流推文中,实际上这个比例会根据用户的兴趣而适配。
召回模块的各小组件主要有如下,其中Search Index和UTEG是社交图内的,CR Mixer和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等,如下表所示。
第二个粗排模型是基于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在一起,
为了充分利用全局上下文,Instance-Guided Mask使用两层FC来投影,
再利用element-wise product来融合全局上下文信息,
{\color{red}{所以其实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 倍。