1. 多任务学习与Torch-RecHub框架解析
多任务学习(Multi-Task Learning, MTL)是深度学习领域的重要范式,其核心思想是通过共享表示来同时学习多个相关任务。在推荐系统场景中,这种技术尤为实用——我们经常需要同时预测点击率(CTR)、转化率(CVR)等多个目标指标。Torch-RecHub作为PyTorch生态中的推荐系统工具库,提供了开箱即用的多任务模型实现,极大简化了模型开发流程。
实际业务中,我曾用ESMM模型优化电商推荐场景。传统做法是串联训练CTR和CVR两个模型,但面临样本选择偏差(Sample Selection Bias)和数据稀疏(Data Sparsity)两大难题。ESMM通过"曝光→点击→转化"的级联关系建模,将CVR预测转化为pCTR×pCTCVR的形式,完美规避了这两个问题。在部署后的A/B测试中,这种端到端的多任务模型比传统方案带来12.7%的GMV提升。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ESMM模型深度剖析
2.1 模型架构设计原理
ESMM(Entire Space Multi-task Model)的创新性体现在其独特的概率分解思想。根据用户行为链路"曝光→点击→转化"的因果关系,它将pCVR表示为:
code复制pCVR = pCTCVR / pCTR
其中pCTCVR是"点击且转化"的概率。这种分解带来两个关键优势:
- 训练样本空间扩展到整个曝光空间(而不仅是点击样本),缓解了数据稀疏问题
- 共享特征表示使模型能学习更通用的特征嵌入
模型采用双塔结构设计:
- 共享底层:处理用户和物品的原始特征,输出128维共享表示
- CTR Tower:二分类模型,预测点击概率
- CVR Tower:二分类模型,预测点击后的转化概率
2.2 关键参数配置详解
在Torch-RecHub中初始化ESMM模型时,需要特别关注以下参数组:
python复制model = ESMM(
user_features=user_sparse_features, # 用户侧稀疏特征
item_features=item_sparse_features, # 物品侧稀疏特征
cvr_params={"dims": [16, 8], "activation": "prelu"}, # CVR塔参数
ctr_params={"dims": [32, 16], "dropout": 0.3} # CTR塔参数
)
特征处理注意事项:
- 用户和物品特征需要分别进行sum pooling操作,这与原论文设计一致
- 稀疏特征建议使用Embedding层,维度通常设为特征唯一值数量的对数
- 连续特征建议先做分桶处理转为离散特征
超参数调优经验:
- 网络深度:CTR塔通常比CVR塔深1-2层,因为点击行为比转化行为更频繁
- Dropout设置:CVR塔需要更高dropout率(0.3-0.5)防止过拟合
- 激活函数选择:PReLU在大多数场景优于ReLU,尤其当特征稀疏时
实践发现:将CTR和CVR塔的最后一层bias初始化为对应事件的logit值(如点击率2%则bias=log(0.02/0.98)),能加速模型收敛。
3. MMOE模型实现细节
3.1 专家混合机制
MMoE(Multi-gate Mixture-of-Experts)通过可学习的门控机制动态分配专家网络,其核心公式为:
code复制任务k的输出 = ∑(gate_k * expert_i)
相比ESMM的硬共享结构,MMoE的优势在于:
- 专家网络可自主学习不同模式的特征表示
- 门控机制实现任务间的软参数共享
- 更适应任务相关性较低的场景
3.2 Torch-RecHub实现要点
python复制from torch_rechub.models.multi_task import MMoE
model = MMoE(
features=all_features,
task_types=["classification", "classification"],
n_expert=4, # 专家数量
expert_params={"dims": [128, 64]}, # 专家网络结构
tower_params_list=[
{"dims": [32]}, # CTR塔
{"dims": [32]} # CVR塔
]
)
参数配置技巧:
- 专家数量通常设为任务数量的2-4倍(2任务用4-8个专家)
- 专家网络宽度应大于塔网络,建议比例在2:1到4:1之间
- 使用梯度裁剪(gradient clipping)防止门控权重剧烈波动
典型问题排查:
- 任务间互相干扰:增加专家数量或降低学习率
- 某些专家未被激活:检查门控权重分布,必要时添加稀疏正则
- 验证集效果震荡:尝试减小门控网络的学习率
4. 多任务训练工程实践
4.1 MTLTrainer配置策略
python复制trainer = MTLTrainer(
model,
task_types=["classification", "classification"],
optimizer_params={
"lr": 1e-3,
"weight_decay": 1e-5
},
n_epoch=100,
earlystop_patience=5,
device="cuda:0"
)
优化器选择经验:
- AdamW在大多数场景表现稳定
- 学习率设置:共享层用较小lr(1e-4),任务特定层用较大lr(1e-3)
- 对于不平衡任务(如CTR远高于CVR),可采用GradNorm进行梯度平衡
4.2 损失函数设计
默认使用加权求和:
code复制总损失 = w1 * loss_ctr + w2 * loss_cvr
权重调整策略:
- 等权重法:简单但可能效果不佳
- 动态调整:基于任务难度或梯度幅度自动调整
- 人工调参:通过验证集AUC确定最佳比例
我在实际项目中发现,先用等权重训练10个epoch,再根据验证表现调整权重(如CTR:CVR=3:7),往往能取得更好效果。
5. 效果评估与模型部署
5.1 评估指标选择
不同任务需要不同的评估策略:
- CTR任务:AUC、LogLoss、准确率@topK
- CVR任务:仅在点击样本上计算AUC
- 联合指标:RIG(Relative Information Gain)评估整体提升
5.2 线上部署注意事项
- 特征一致性:确保训练和推理的特征处理流程完全一致
- 实时性要求:CTR预测需<50ms,可适当简化模型结构
- 监控体系:建立CTR/CVR指标的实时监控和报警机制
在模型上线初期,建议采用小流量灰度发布,同时保留旧模型作为baseline,便于快速回滚。我曾遇到新模型因特征编码不一致导致线上效果暴跌的情况,完善的监控机制帮助我们15分钟内就定位到了问题。
6. 进阶优化方向
对于希望进一步提升效果的开发者,可以考虑:
- 多目标排序:将ESMM输出接入排序模型,实现端到端优化
- 增量训练:定期用新数据更新模型参数
- 模型蒸馏:用复杂模型指导轻量级模型训练
- 场景适配:根据业务特点调整网络结构,如短视频推荐可增加时长预测任务
一个实用的技巧是在共享层和任务塔之间添加Batch Normalization层,这在我参与的多个项目中都带来了约3-5%的指标提升。另外,对于特征工程,建议对用户行为序列进行时间衰减加权,更能反映近期兴趣变化。
