当前位置: 首页 > article >正文

告别跷跷板效应:手把手教你用PaddlePaddle复现腾讯PLE多任务推荐模型

从零实现腾讯PLE模型用PaddlePaddle解决多任务推荐中的跷跷板难题推荐系统发展到今天早已不再是简单的协同过滤或矩阵分解就能满足业务需求。当我们需要同时优化点击率、观看时长、分享率等多个目标时传统的单任务学习模型往往捉襟见肘。腾讯提出的PLEProgressive Layered Extraction模型通过创新的网络结构设计有效缓解了多任务学习中的负迁移和跷跷板效应。本文将带你用PaddlePaddle框架从零开始实现这个曾获RecSys最佳论文奖的模型。1. 环境准备与数据理解在开始构建PLE模型前我们需要确保开发环境配置正确。推荐使用Python 3.7和PaddlePaddle 2.3版本这些版本对PLE模型所需的动态图功能支持最为完善。pip install paddlepaddle-gpu2.3.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html多任务学习的数据集通常包含多个标签列。以视频推荐为例我们的数据集可能包含以下特征用户特征年龄、性别、历史行为等视频特征类别、时长、创作者等上下文特征时间、设备、网络环境等多任务标签点击二分类、完播率回归、分享二分类import paddle from paddle.io import Dataset class MultiTaskDataset(Dataset): def __init__(self, data_path): self.features ... # 加载特征数据 self.labels ... # 加载多任务标签 def __getitem__(self, idx): return { features: self.features[idx], click_label: self.labels[idx][0], watch_label: self.labels[idx][1], share_label: self.labels[idx][2] } def __len__(self): return len(self.features)提示在实际业务中不同任务的样本分布可能不均衡。建议在数据加载阶段实现样本加权采样确保每个任务都能得到充分学习。2. PLE模型架构深度解析PLE模型的核心创新在于其分层渐进式专家网络结构。与传统的MMoE模型相比PLE主要做了三点改进任务专属专家与共享专家分离每个任务有自己的专家网络同时保留共享专家分层门控机制不同层级采用不同的门控策略渐进式特征提取低层网络提取通用特征高层网络提取任务特定特征2.1 专家网络构建我们先实现PLE的基础组件——专家网络。在PLE中专家网络分为两类任务专属专家Task-specific Experts共享专家Shared Expertsclass ExpertLayer(paddle.nn.Layer): def __init__(self, input_size, expert_size, num_experts): super(ExpertLayer, self).__init__() self.experts paddle.nn.LayerList() for i in range(num_experts): expert paddle.nn.Sequential( paddle.nn.Linear(input_size, expert_size), paddle.nn.ReLU() ) self.experts.append(expert) def forward(self, x): expert_outputs [expert(x) for expert in self.experts] return paddle.stack(expert_outputs, axis1) # shape: [batch, num_experts, expert_size]2.2 门控网络设计门控网络是PLE实现自适应特征选择的关键。PLE采用分层门控策略第一层包含N1个门控N个任务门控1个共享门控第二层仅包含N个任务门控class GateLayer(paddle.nn.Layer): def __init__(self, input_size, num_experts): super(GateLayer, self).__init__() self.gate paddle.nn.Sequential( paddle.nn.Linear(input_size, num_experts), paddle.nn.Softmax(axis-1) ) def forward(self, x): gate_values self.gate(x) # shape: [batch, num_experts] return gate_values.unsqueeze(-1) # shape: [batch, num_experts, 1]3. 完整PLE模型实现现在我们将专家网络和门控网络组合起来构建完整的PLE模型。模型包含两个关键层级第一层Extraction Network任务专属专家网络共享专家网络任务门控网络共享门控网络第二层Progressive Layer更深的专家网络任务特定门控class PLE(paddle.nn.Layer): def __init__(self, input_size, num_tasks, experts_per_task3, shared_experts2, expert_size64, tower_size32): super(PLE, self).__init__() # 第一层网络 self.task_experts_layer1 paddle.nn.LayerList() for _ in range(num_tasks): expert ExpertLayer(input_size, expert_size, experts_per_task) self.task_experts_layer1.append(expert) self.shared_experts_layer1 ExpertLayer(input_size, expert_size, shared_experts) self.task_gates_layer1 paddle.nn.LayerList() for _ in range(num_tasks): gate GateLayer(input_size, experts_per_task shared_experts) self.task_gates_layer1.append(gate) self.shared_gate_layer1 GateLayer(input_size, num_tasks * experts_per_task shared_experts) # 第二层网络 self.task_experts_layer2 paddle.nn.LayerList() for _ in range(num_tasks): expert ExpertLayer(expert_size, expert_size, experts_per_task) self.task_experts_layer2.append(expert) self.shared_experts_layer2 ExpertLayer(expert_size, expert_size, shared_experts) self.task_gates_layer2 paddle.nn.LayerList() for _ in range(num_tasks): gate GateLayer(expert_size, experts_per_task shared_experts) self.task_gates_layer2.append(gate) # 任务塔网络 self.towers paddle.nn.LayerList() for _ in range(num_tasks): tower paddle.nn.Sequential( paddle.nn.Linear(expert_size, tower_size), paddle.nn.ReLU(), paddle.nn.Linear(tower_size, 1) ) self.towers.append(tower) def forward(self, x): # 第一层前向传播 task_expert_outputs1 [] for expert in self.task_experts_layer1: task_expert_outputs1.append(expert(x)) shared_expert_output1 self.shared_experts_layer1(x) # 第一层门控 task_outputs [] for i, gate in enumerate(self.task_gates_layer1): expert_output paddle.concat( [task_expert_outputs1[i], shared_expert_output1], axis1) gated_output expert_output * gate(x) task_output paddle.sum(gated_output, axis1) task_outputs.append(task_output) shared_gate_output self.shared_gate_layer1(x) all_expert_output paddle.concat(task_expert_outputs1 [shared_expert_output1], axis1) shared_output paddle.sum(all_expert_output * shared_gate_output, axis1) # 第二层前向传播 task_expert_outputs2 [] for expert, input_feat in zip(self.task_experts_layer2, task_outputs): task_expert_outputs2.append(expert(input_feat)) shared_expert_output2 self.shared_experts_layer2(shared_output) # 第二层门控 final_outputs [] for i, gate in enumerate(self.task_gates_layer2): expert_output paddle.concat( [task_expert_outputs2[i], shared_expert_output2], axis1) gated_output expert_output * gate(task_outputs[i]) task_output paddle.sum(gated_output, axis1) final_outputs.append(self.towers[i](task_output)) return final_outputs4. 训练策略与调优技巧多任务模型的训练比单任务模型更为复杂我们需要特别注意以下几点4.1 损失函数设计PLE模型通常采用加权多任务损失函数$$ \mathcal{L} \sum_{i1}^N w_i \mathcal{L}_i $$其中权重$w_i$可以是固定权重根据业务重要性设定动态学习权重通过模型自动学习class WeightedLoss(paddle.nn.Layer): def __init__(self, num_tasks): super(WeightedLoss, self).__init__() self.weights paddle.nn.ParameterList([ paddle.nn.Parameter(paddle.ones([])) for _ in range(num_tasks) ]) def forward(self, task_losses): total_loss 0 for loss, weight in zip(task_losses, self.weights): total_loss loss * paddle.exp(-weight) weight return total_loss4.2 学习率策略由于不同任务收敛速度不同建议采用分层学习率共享参数使用较低学习率任务特定参数使用较高学习率动态调整根据任务损失变化自动调整学习率def create_optimizer(model, base_lr0.001, task_lr0.01): shared_params [] task_params [] for name, param in model.named_parameters(): if shared in name: shared_params.append(param) else: task_params.append(param) optimizer paddle.optimizer.Adam( learning_ratebase_lr, parametersshared_params, weight_decay0.001 ) task_optimizer paddle.optimizer.Adam( learning_ratetask_lr, parameterstask_params, weight_decay0.001 ) return optimizer, task_optimizer4.3 评估指标选择多任务模型的评估需要综合考虑各任务指标任务类型常用指标业务意义二分类AUC, LogLoss区分能力预测准确性回归MAE, RMSE预测值与真实值偏差排序NDCG, MAP推荐列表质量def evaluate(model, dataloader): model.eval() metrics { click_auc: paddle.metric.Auc(), watch_mae: paddle.metric.Mae(), share_auc: paddle.metric.Auc() } with paddle.no_grad(): for batch in dataloader: outputs model(batch[features]) metrics[click_auc].update( predsoutputs[0], labelsbatch[click_label]) metrics[watch_mae].update( predsoutputs[1], labelsbatch[watch_label]) metrics[share_auc].update( predsoutputs[2], labelsbatch[share_label]) return {name: metric.accumulate() for name, metric in metrics.items()}5. 部署优化与生产实践将PLE模型部署到生产环境时需要考虑以下优化点5.1 模型量化与加速# 训练后量化 quant_model paddle.quantization.quantize_dynamic( modelmodel, qconfigpaddle.quantization.QConfig( activationpaddle.quantization.MovingAverageAbsMaxScale(), weightpaddle.quantization.AbsMaxQuantizer() ) ) paddle.jit.save(quant_model, ple_quant)5.2 特征工程优化共享特征与任务特定特征分离实时特征与离线特征融合特征重要性分析def feature_importance(model, dataset): # 计算特征重要性 base_pred model.predict(dataset) importance [] for i in range(dataset.feature_dim): perturbed_data dataset.copy() perturbed_data[:, i] 0 # 扰动第i个特征 perturbed_pred model.predict(perturbed_data) importance.append(np.mean(np.abs(base_pred - perturbed_pred))) return importance5.3 A/B测试策略多任务模型的A/B测试需要特别设计指标权重分配根据业务目标确定各任务指标的权重分桶策略确保每个桶内用户分布一致长期观察跷跷板效应可能在长期才会显现提示PLE模型在腾讯视频的实践中相比MMoE模型在多个任务上同时取得了提升VTR提升2.57%VCR提升1.84%充分证明了其有效性。

相关文章:

告别跷跷板效应:手把手教你用PaddlePaddle复现腾讯PLE多任务推荐模型

从零实现腾讯PLE模型:用PaddlePaddle解决多任务推荐中的跷跷板难题 推荐系统发展到今天,早已不再是简单的协同过滤或矩阵分解就能满足业务需求。当我们需要同时优化点击率、观看时长、分享率等多个目标时,传统的单任务学习模型往往捉襟见肘。…...

5大场景深度解析:PiliPlus开源B站客户端的跨平台体验革新

5大场景深度解析:PiliPlus开源B站客户端的跨平台体验革新 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus PiliPlus是一款基于Flutter开发的跨平台Bilibili第三方客户端,为技术爱好者和普通用户提供纯…...

05华夏之光永存・开源:黄大年茶思屋榜文保姆级全落地解法「31期 5题」多模态高维数据解耦可控生成+AI极致视频压缩

05华夏之光永存・开源:黄大年茶思屋榜文保姆级全落地解法「31期 5题」 【多模态高维数据解耦可控生成AI极致视频压缩|纯全落地全裸参数开源上机直接跑版】 全落地・全参数开源・保姆级上机可跑版 一、摘要 多模态特征可控生成、视频智能压缩领域&#xf…...

教育科技产品集成Taotoken为不同学科场景匹配最合适的大模型

教育科技产品集成Taotoken为不同学科场景匹配最合适的大模型 1. 教育科技产品的模型需求特点 教育科技产品通常需要覆盖多个学科领域,每个领域对模型能力的要求差异显著。数学辅导需要强大的逻辑推理和分步解题能力,语言学习依赖准确的语法分析和发音评…...

揭秘AI专著撰写:实用AI工具,一键打造20万字专业学术专著!

学术专著创作困境与AI工具的崛起 学术专著的创作过程并不简单,其难点不仅在于“能写出来”,更在于“能够出版并获得认可”。在当今的出版市场中,学术专著面临的受众群体相对较少,出版社对于选题的学术价值和作者的学术声望有着严…...

EBERLE S-41/051413016000印刷电路板

EBERLE S-41/051413016000 通常属于其工业自动化系统中的印刷电路板(PCB)组件 根据此类专用电路板的通用特性,推测其特点如下:定制化设计:推测是针对特定控制任务(如信号转换、电源管理或接口扩展&#xff…...

7+ Taskbar Tweaker疑难杂症终极指南:从症状到根除的完整解决方案

7 Taskbar Tweaker疑难杂症终极指南:从症状到根除的完整解决方案 【免费下载链接】7-Taskbar-Tweaker A Windows taskbar customization tool for Windows 7, Windows 8, and Windows 10 项目地址: https://gitcode.com/gh_mirrors/7t/7-Taskbar-Tweaker 7 T…...

不只是安装:用PyTorch-Kaldi + LibriSpeech快速搭建你的第一个端到端语音识别实验环境

从Kaldi到PyTorch-Kaldi:构建端到端语音识别实验环境的完整指南 语音识别技术正在经历从传统方法到深度学习的快速演进。对于已经掌握Kaldi基础的研究者来说,如何将这一强大工具与现代深度学习框架结合,构建端到端的实验环境,是迈…...

AI编码助手集成Revnu技能:自动化软件销售与商业运营指南

1. 项目概述:让AI编码助手成为你的软件销售经理 如果你是一名独立开发者、小团队负责人,或者正在用AI辅助构建自己的SaaS产品,那么你肯定遇到过这样的困境:产品做出来了,但如何优雅地、自动化地把它卖出去&#xff0c…...

SpringBoot 3.1.3 + JDK 17 实战:手把手教你从零搭建一个OAuth2.1授权服务器

SpringBoot 3.1.3 JDK 17 实战:从零构建OAuth2.1授权服务器的完整指南 在当今微服务架构盛行的时代,安全认证已成为系统设计的核心环节。OAuth2.1作为OAuth2.0的进化版本,针对实际应用中的安全漏洞和模糊定义进行了重要修正。本文将带您使用…...

Taotoken 模型广场如何帮助开发者为新项目选型

Taotoken 模型广场如何帮助开发者为新项目选型 启动一个新项目时,选择合适的模型是技术决策的关键一步。面对市场上众多的模型提供商和复杂的定价体系,开发者往往需要花费大量时间调研。Taotoken 的模型广场功能,正是为了简化这一过程而设计…...

Gemini3.1Pro高效创作:脚本到分镜的协同工作流

做短视频、图文内容或交互式创作的人都知道:真正拖慢产出的往往不是“写不出来”,而是不同环节互相卡住——脚本写完才发现分镜不落地;分镜定了才发现文案口径不一致;文案能用但素材描述不够具体,导致后期反复返工。 因…...

Gemini3.1Pro行业定制:高效搭建垂直提示词体系

很多人用 Gemini 3.1 Pro 的方式比较“通用”:问一句、要一段内容、再看结果是否顺眼。但真正落地到行业场景时,你会发现通用问法经常带来两个问题:一是输出风格不稳定,二是关键字段缺失(例如结构、口径、约束条件&…...

保姆级教程:在Ubuntu 22.04上从零部署wvp-GB28181-pro国标视频平台(含ZLMediaKit)

从零构建GB28181视频监控平台:Ubuntu 22.04下的wvp-pro与ZLMediaKit深度整合指南 在智能安防与视频监控领域,GB28181协议已成为行业标准协议,而wvp-pro作为开源实现方案,配合ZLMediaKit流媒体服务器,能够快速搭建起功能…...

如何彻底解决百度网盘分享链接失效问题:秒传脚本终极指南

如何彻底解决百度网盘分享链接失效问题:秒传脚本终极指南 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否经常遇到百度网盘分享链接失效的…...

如何快速清理电脑重复图片?AntiDupl.NET免费开源工具终极指南

如何快速清理电脑重复图片?AntiDupl.NET免费开源工具终极指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否经常发现电脑里存着大量相同的照片&…...

桥梁与翻译器:VRM Addon for Blender在虚拟角色创作中的哲学意义

桥梁与翻译器:VRM Addon for Blender在虚拟角色创作中的哲学意义 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.1 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 在数字创作的…...

终极指南:应届生如何利用ShameCom有效规避职业风险

终极指南:应届生如何利用ShameCom有效规避职业风险 【免费下载链接】ShameCom 收集校招污点公司或组织,帮助学弟学妹避雷。互联网不曾遗忘! 项目地址: https://gitcode.com/gh_mirrors/sh/ShameCom 在竞争激烈的校招季,应届…...

如何在10分钟内掌握自动化操作?告别重复工作的新选择

如何在10分钟内掌握自动化操作?告别重复工作的新选择 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否曾在…...

如何快速掌握Iwara视频下载:面向新手的完整指南与批量处理神器

如何快速掌握Iwara视频下载:面向新手的完整指南与批量处理神器 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 作为动漫爱好者和视频收藏者,你是否曾经为…...

STM32控制28BYJ-48步进电机的三种驱动方式对比(单四拍/双四拍/八拍)及串口角度监控实战

STM32控制28BYJ-48步进电机的三种驱动方式对比及实战优化 在嵌入式开发中,精确控制电机运动是一个永恒的话题。28BYJ-48这款经济实惠的步进电机,配合ULN2003驱动板,成为了许多STM32开发者入门电机控制的经典组合。但你是否真正理解单四拍、双…...

明日方舟游戏资源宝库:1000+高清素材免费获取与实用指南

明日方舟游戏资源宝库:1000高清素材免费获取与实用指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 还在为明日方舟同人创作寻找素材而烦恼?想要获取高清角色…...

Modern C++ Features协程编程指南:C++20异步编程新范式

Modern C Features协程编程指南:C20异步编程新范式 【免费下载链接】modern-cpp-features A cheatsheet of modern C language and library features. 项目地址: https://gitcode.com/gh_mirrors/mo/modern-cpp-features C20引入的协程是现代C异步编程的革命…...

别再到处找汉化包了!QGIS 3.28 最新版中文界面设置保姆级教程

QGIS 3.28 中文界面设置全攻略:告别汉化包的终极解决方案 第一次打开QGIS时,满屏的英文菜单是否让你望而却步?作为一款功能强大的开源地理信息系统软件,QGIS在全球拥有数百万用户,但语言障碍却成为许多中文用户的第一…...

从CentOS迁移到国产系统?手把手教你用U盘安装统信UOS服务器版1060e

从CentOS迁移到统信UOS服务器版的完整实践指南 在开源生态变革的浪潮中,许多企业正面临从CentOS向替代方案迁移的技术挑战。统信UOS服务器版作为国产操作系统的代表之一,凭借其良好的硬件兼容性、完善的安全机制和本地化支持,正成为越来越多…...

别再只当开关用了!手把手教你用p-GaN HEMT在GaN芯片上实现高性能电容

解锁p-GaN HEMT的隐藏技能:片上高性能电容设计实战指南 在GaN功率集成电路设计中,工程师们常常面临一个棘手的问题:如何在有限的芯片面积内集成更多功能模块?传统解决方案是增加MIM(金属-绝缘体-金属)电容&…...

【体验优化】Claude Code v2.1.132:终端兼容性大修,告别 Emoji 导致崩溃的 Bug

前言在使用 Claude Code 时,你是否遇到过屏幕休眠唤醒后黑屏?或者因为终端里的一个 Emoji 符号导致会话无法恢复?在最新的 v2.1.132 版本中,开发团队针对这些深层的交互逻辑和边缘情况进行了地毯式的修复。无论你是 JetBrains 用户…...

Linux内核漏洞分类终极指南:按类型和影响程度深度解析

Linux内核漏洞分类终极指南:按类型和影响程度深度解析 【免费下载链接】linux-kernel-exploits linux-kernel-exploits Linux平台提权漏洞集合 项目地址: https://gitcode.com/gh_mirrors/li/linux-kernel-exploits Linux内核漏洞是影响系统安全性的关键因素…...

AndroidVideoCache终极安全漏洞解析:2025年CVE漏洞修复完整指南

AndroidVideoCache终极安全漏洞解析:2025年CVE漏洞修复完整指南 【免费下载链接】AndroidVideoCache Cache support for any video player with help of single line 项目地址: https://gitcode.com/gh_mirrors/an/AndroidVideoCache AndroidVideoCache是一款…...

【CLIP 范式已死!】字节发布 【GenLIP】:砍掉解码器与对比学习,让 ViT 直接开口说话,效果反而更强

CLIP 范式已死!字节发布 GenLIP:砍掉解码器与对比学习,让 ViT 直接开口说话,效果反而更强 写在前面(2026.05.07 首发):2026 年 5 月 1 日,arXiv 上出现了一篇来自北京交通大学 字节…...