Twitter推荐系统中的多任务学习框架:共享底层与任务特定层设计

Twitter推荐系统中的多任务学习框架:共享底层与任务特定层设计

【免费下载链接】the-algorithm-ml Source code for Twitter's Recommendation Algorithm 【免费下载链接】the-algorithm-ml 项目地址: https://gitcode.com/gh_mirrors/th/the-algorithm-ml

你是否曾经好奇,Twitter(现X平台)如何在毫秒级时间内为数亿用户推荐精准的推文?背后的核心引擎正是多任务学习(Multi-task Learning)框架——它能同时优化"推文互动率预测"、"用户停留时长估计"等多个目标,让推荐既相关又引人入胜。本文将拆解Twitter推荐系统中多任务学习的架构设计,重点解析共享底层特征提取任务特定输出层的协同机制,以及如何通过灵活配置平衡任务间的冲突与协同。

多任务学习的核心挑战:平衡共享与专精

在推荐系统中,单一任务模型(如仅预测"点赞")往往会导致"过度特化"——模型可能只推荐标题党内容,忽视用户长期体验。而多任务学习通过同时优化多个目标(如点赞、转发、停留时长),能学习到更全面的用户兴趣表征。但这需要解决两大难题:

  1. 特征共享冲突:不同任务对特征的需求可能矛盾(如"点击"偏好时效性内容,"收藏"偏好深度内容)
  2. 任务权重分配:如何动态调整任务重要性,避免次要任务被主导

Twitter的解决方案体现在其开源框架的三层架构设计中,我们将通过projects/home/recap/model/entrypoint.py的核心实现逐步解析。

架构解密:从特征共享到任务专精

1. 特征预处理与嵌入层:多任务的共同起点

所有任务首先共享相同的特征预处理流程,包括:

# 特征拼接示例(简化自entrypoint.py第171-217行)
concat_dense_features = [
  self._preprocessor(continuous_features, binary_features)  # 预处理连续/二进制特征
]
if self.embeddings:
  concat_dense_features.append(self.embeddings(sparse_features))  # 大型嵌入表
if self.small_embeddings:
  concat_dense_features.append(self.small_embeddings(discrete_features))  # 小型嵌入表

这些预处理后的特征向量将作为所有任务的共享输入,确保基础特征表征的一致性。

2. 多任务协作模式:三种共享策略

Twitter框架通过MultiTaskType枚举定义了三种灵活的任务协作模式,可通过配置文件动态切换:

模式一:完全共享(SHARE_ALL)

所有任务共享同一个主干网络(Backbone),仅在输出层分支。适合高度相关的任务(如"点赞"和"转发")。

# SHARE_ALL模式实现(entrypoint.py第220-221行)
if self._config.multi_task_type == MultiTaskType.SHARE_ALL:
  net = self._backbone(concat_dense_features)["output"]  # 所有任务共享主干输出
模式二:部分共享(SHARE_PARTIAL)

主干网络输出与原始特征拼接后再输入任务特定层,兼顾共享表征与任务特异性。

# SHARE_PARTIAL模式实现(entrypoint.py第222-225行)
net = torch.cat([
  concat_dense_features,  # 原始特征
  self._backbone(concat_dense_features)["output"]  # 主干网络输出
], dim=1)
模式三:完全隔离(SHARE_NONE)

任务间无共享参数,各自独立训练。适合冲突较大的任务(如"广告点击"与"内容互动")。

三种模式的配置通过ModelConfig实现,典型配置示例:

multi_task_type: "share_partial"  # 部分共享模式
backbone:  # 共享主干配置
  mlp_config:
    layer_sizes: [1024, 512]
    batch_norm: {affine: true, momentum: 0.1}
tasks:  # 任务特定配置
  like: {mlp_config: {layer_sizes: [512, 1]}}  # 点赞任务头
  retweet: {mlp_config: {layer_sizes: [512, 1]}}  # 转发任务头

3. 任务特定输出层:专精化预测

每个任务通过独立的任务塔(Task Tower) 生成预测,支持多样化的网络结构:

  • MLP塔:最常用配置,通过MlpConfig定义层数和神经元数量
  • DCN塔:Deep & Cross Network,适合捕捉特征交互,通过DcnConfig配置
  • MaskNet塔:引入注意力机制的网络,通过MaskNetConfig配置
# 任务塔构建(简化自entrypoint.py第137行)
_towers[safe_name] = _build_single_task_model(task_architecture, num_inputs)

最终通过Sigmoid激活函数输出每个任务的预测概率,并支持通过AffineMap进行校准。

损失函数设计:平衡任务重要性

多任务学习的成败关键在于损失函数的设计。Twitter框架在core/losses.py中实现了灵活的多任务损失聚合策略:

1. 任务权重动态调整

通过pos_weight参数为不同任务分配重要性权重,例如:

# 任务权重配置(config.py第212行)
pos_weight: float = 1.0  # 正样本权重,可按任务重要性调整

2. 损失聚合方式

支持多种损失组合函数(mean/sum/max等),默认使用加权平均:

# 多任务损失聚合(losses.py第101行)
losses["loss"] = loss_reduction_fnsglobal_reduction)))

3. 梯度归一化

通过get_global_loss_detached确保分布式训练中各任务梯度的稳定性,避免某一任务主导优化方向。

实践配置指南:选择适合你的多任务模式

应用场景推荐模式配置要点
相似任务(点赞/转发)SHARE_ALL增加主干网络深度,减少任务塔复杂度
相关但有差异任务(点击/停留时长)SHARE_PARTIAL主干网络输出+原始特征拼接,任务塔使用不同激活函数
冲突任务(广告/ organic内容)SHARE_NONE完全隔离网络,单独调优学习率

配置示例(local_prod.yaml):

model:
  multi_task_type: "share_partial"
  backbone:
    mlp_config:
      layer_sizes: [2048, 1024]
      dropout: {rate: 0.3}
  tasks:
    engagement:
      mlp_config: {layer_sizes: [1024, 512, 1]}
    retention:
      mlp_config: {layer_sizes: [1024, 256, 1]}
      pos_weight: 2.0  # 停留时长任务权重更高

总结与最佳实践

Twitter推荐系统的多任务学习框架通过模块化设计实现了高度灵活性,核心经验包括:

  1. 特征级共享是基础:所有任务共享底层特征预处理,确保表征一致性
  2. 任务协作模式按需切换:通过SHARE_ALL/SHARE_PARTIAL/SHARE_NONE平衡共享与专精
  3. 损失函数动态调整:通过权重和聚合策略解决任务冲突
  4. 配置驱动开发:通过ModelConfig实现零代码调整架构

建议在实际应用中:

  • 从SHARE_PARTIAL模式起步,观察任务相关性
  • 使用ModelAndLoss封装任务与损失,简化训练流程
  • 通过stratifiers监控不同用户群的任务表现差异

通过这种架构,Twitter成功将多个推荐目标统一到单一模型中,在提升推荐多样性的同时保持了高效推理——这正是多任务学习的魅力所在。

【免费下载链接】the-algorithm-ml Source code for Twitter's Recommendation Algorithm 【免费下载链接】the-algorithm-ml 项目地址: https://gitcode.com/gh_mirrors/th/the-algorithm-ml

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值