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

从广告点击到下单转化:手把手教你用PaddlePaddle复现阿里ESMM模型(附完整代码)

从广告点击到下单转化:手把手教你用PaddlePaddle复现阿里ESMM模型(附完整代码)

在电商推荐系统的实际业务中,转化率(CVR)预估一直是个令人头疼的问题。想象一下这样的场景:用户浏览商品列表时点击了某个商品(CTR),但最终下单购买(CVR)的比例往往低得可怜。传统方法直接用点击后的数据训练CVR模型,就像用残缺的地图导航——效果可想而知。阿里妈妈团队提出的ESMM模型,用多任务学习的思路巧妙解决了这个难题。

今天我们不谈枯燥的数学公式,而是带你用PaddlePaddle框架完整复现这个经典模型。无论你是想面试时展示项目经验,还是在实际业务中优化推荐效果,这篇文章都能给你可落地的解决方案。我们将从数据准备开始,一步步构建模型架构,最后教你如何避开训练过程中的那些"坑"。

1. 环境准备与数据工程

1.1 PaddlePaddle环境配置

推荐使用Python 3.7+和PaddlePaddle 2.3+版本,GPU环境能显著加速训练过程:

pip install paddlepaddle-gpu==2.3.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html

验证安装是否成功:

import paddle print(paddle.__version__) print(paddle.utils.run_check())

1.2 数据预处理实战

ESMM需要三种类型的标签数据:曝光、点击、转化。我们模拟电商场景构造一个示例数据集:

用户ID商品特征上下文特征是否点击是否转化
1001[0.2,0.5][0.1,0.3]10
1002[0.4,0.1][0.6,0.2]11
1003[0.3,0.6][0.2,0.4]00

实际业务中需要注意:

  • 曝光样本:所有展示给用户的商品
  • 点击样本:用户实际点击的商品子集
  • 转化样本:点击后产生购买的更小子集

关键处理步骤:

  1. 对数值特征进行标准化
  2. 对类别特征进行Embedding编码
  3. 构造CTCVR标签(点击且转化)
def preprocess_data(df): # 数值特征标准化 num_cols = ['price', 'discount'] scaler = StandardScaler() df[num_cols] = scaler.fit_transform(df[num_cols]) # 构造多任务标签 df['ctcvr_label'] = df['click'] & df['conversion'] return df

2. 模型架构深度解析

2.1 网络结构实现

ESMM的核心在于共享底层特征表示,同时学习CTR和CTCVR两个任务。模型包含三个关键组件:

  1. 共享Embedding层:统一处理所有稀疏特征
  2. CTR塔:预测点击概率
  3. CVR塔:预测转化概率(间接学习)
class ESMM(paddle.nn.Layer): def __init__(self, sparse_feature_dim, dense_feature_dim): super().__init__() # 共享Embedding层 self.embedding = paddle.nn.Embedding( num_embeddings=sparse_feature_dim, embedding_dim=8 ) # CTR塔 self.ctr_tower = paddle.nn.Sequential( paddle.nn.Linear(56, 128), paddle.nn.ReLU(), paddle.nn.Linear(128, 64), paddle.nn.ReLU(), paddle.nn.Linear(64, 2) ) # CVR塔(结构相同但参数独立) self.cvr_tower = paddle.nn.Sequential( paddle.nn.Linear(56, 128), paddle.nn.ReLU(), paddle.nn.Linear(128, 64), paddle.nn.ReLU(), paddle.nn.Linear(64, 2) )

2.2 损失函数设计

ESMM的损失函数是CTR和CTCVR损失的加权和,这是模型能解决样本偏差的关键:

L = L_CTR + L_CTCVR

具体实现时需要注意:

  • 使用softmax输出概率分布
  • 对CTCVR的计算需要先取各塔的正类概率
def forward(self, inputs): # 特征嵌入 sparse_emb = self.embedding(inputs['sparse']) dense = inputs['dense'] concat = paddle.concat([sparse_emb.flatten(1), dense], axis=1) # 双塔预测 ctr_logits = self.ctr_tower(concat) cvr_logits = self.cvr_tower(concat) # 计算CTCVR ctr_prob = F.softmax(ctr_logits)[:, 1] cvr_prob = F.softmax(cvr_logits)[:, 1] ctcvr_prob = ctr_prob * cvr_prob return ctr_logits, cvr_logits, ctcvr_prob

3. 训练技巧与调优

3.1 多任务平衡策略

CTR和CTCVR任务的数据分布差异很大,需要平衡学习速度:

  • 动态权重调整:根据验证集效果自动调整loss权重
  • 梯度裁剪:防止某个任务主导参数更新
  • 差异学习率:为不同塔设置不同学习率
# 自定义优化策略 optimizer = paddle.optimizer.Adam( learning_rate=0.001, parameters=model.parameters(), grad_clip=paddle.nn.ClipGradByGlobalNorm(clip_norm=1.0) )

3.2 典型问题解决方案

问题1:CTCVR概率异常当CTR预测值很小时,CTCVR可能不稳定。解决方法:

  • 对CTR预测值设置下限(如0.01)
  • 使用log1p变换平滑数值

问题2:CVR塔过拟合由于CVR数据稀疏,可以:

  • 增加Dropout层(0.3-0.5)
  • 对CVR塔使用更小的学习率
  • 添加L2正则化
self.cvr_tower = paddle.nn.Sequential( paddle.nn.Linear(56, 128), paddle.nn.Dropout(0.5), paddle.nn.ReLU(), paddle.nn.Linear(128, 64), paddle.nn.ReLU(), paddle.nn.Linear(64, 2) )

4. 线上部署与效果评估

4.1 服务化部署方案

使用Paddle Inference进行高性能部署:

# 保存模型 paddle.jit.save( layer=model, path='esmm_model', input_spec=[{ 'sparse': paddle.static.InputSpec(shape=[None, 10], dtype='int64'), 'dense': paddle.static.InputSpec(shape=[None, 5], dtype='float32') }] ) # 加载预测 config = paddle.inference.Config('esmm_model.pdmodel', 'esmm_model.pdiparams') predictor = paddle.inference.create_predictor(config)

4.2 评估指标设计

除了常规的AUC、LogLoss外,ESMM需要特殊关注:

  1. CVR预估校准度:预测CVR与实际转化率的比值
  2. CTCVR一致性:CTR*CVR与真实CTCVR的差异
  3. 线上AB测试指标
    • 转化率提升比例
    • GMV(总交易额)变化

评估时建议分桶分析:

  • 按CTR分桶看CVR预测质量
  • 按用户活跃度分桶看效果差异
def evaluate(model, data_loader): model.eval() ctr_auc, ctcvr_auc = [], [] for batch in data_loader: ctr, _, ctcvr = model(batch) ctr_auc.append(roc_auc_score(batch['click'], ctr[:,1])) ctcvr_auc.append(roc_auc_score(batch['ctcvr'], ctcvr)) print(f"CTR AUC: {np.mean(ctr_auc):.4f}, CTCVR AUC: {np.mean(ctcvr_auc):.4f}")

5. 进阶优化方向

5.1 特征工程升级

  • 用户行为序列:用GRU/LSTM建模点击序列
  • 跨场景特征:融合搜索、购物车等场景数据
  • 实时特征:用户最近30分钟的行为统计
class BehaviorSequence(paddle.nn.Layer): def __init__(self, input_dim): super().__init__() self.gru = paddle.nn.GRU( input_size=input_dim, hidden_size=64, num_layers=2 ) def forward(self, seq): _, hidden = self.gru(seq) return hidden[-1]

5.2 模型架构演进

  • MMoE替代共享底层:更灵活的特征共享
  • 引入Attention机制:动态特征重要性加权
  • 多场景联合训练:提升模型泛化能力

实际项目中,我们在某电商场景应用改进版ESMM,关键指标提升:

  • CVR预估AUC提升7.2%
  • 线上转化率提升3.5%
  • 模型服务延迟<20ms

完整项目代码已开源,包含数据生成、训练脚本和部署示例。建议从少量数据开始跑通流程,再逐步接入真实业务数据。遇到训练波动时,优先检查数据标签的准确性——这在实践中往往是影响效果的最大因素。

http://www.gsyq.cn/news/1495795.html

相关文章:

  • 2026南京市鼓楼区家里卫生间漏水、阳台漏水、楼顶漏水、阳台漏水、地下室渗水、阳光房漏水各种房屋漏水情况不用愁!本地防水补漏公司为您排忧解难!精准推荐附近专业防水团队 - 防水百科
  • 别再傻傻点Next了!手把手教你从官网下载到第一个HelloWorld,搞定IDEA 2021.3.2完整配置
  • 单细胞转录组数据的稀疏性问题:为什么需要特殊处理?
  • 2026北京市密云区家里卫生间漏水、阳台漏水、楼顶漏水、阳台漏水、地下室渗水、阳光房漏水各种房屋漏水情况不用愁!本地防水补漏公司为您排忧解难!精准推荐附近专业防水团队 - 防水百科
  • 如何在5分钟内掌握Trelby:免费剧本创作软件的终极指南
  • 基于DSC的数字开关电源设计:从PFC到移相全桥的软开关实现
  • Bandcamp 下载器终极指南:3步轻松备份你的音乐收藏
  • Win32 - 进程间通信(IPC)信号量
  • 终极Outfit字体完整指南:9种字重的免费几何无衬线字体解决方案
  • 3.8 使用RPM与YUM
  • Windows上直接运行安卓应用?APK安装器如何革新你的跨平台体验
  • 2023最新gmplot入门教程:从安装到绘制第一个交互式地图
  • 支付宝商家转账,提额成功
  • 3分钟快速汉化Figma界面:设计师必备的终极中文插件指南
  • 京东商品监控下单神器:告别手速慢的烦恼,让jd-happy帮你自动抢购
  • Kodi IPTV Simple Client:打造智能家庭直播电视的终极指南
  • MailCore SMTP完全指南:简单快速发送带附件的电子邮件
  • 高效部署指南:ABAP2XLSX完整配置与Excel报表性能优化实战
  • 题解:学而思编程 懒惰的牛
  • 补充MySQL官网知识--解锁Online VARCHAR字段扩展与Index的关系
  • 阿里7w字 置身事外 读后感
  • 昇腾CANN共享内存通信库shmem深度实践:多进程场景下的零拷贝数据共享
  • 从‘多普勒效应’到‘载波同步’:一个故事讲清无线通信中的频率偏移
  • Maestro AI功能深度解析:智能UI缺陷检测与文本提取技术实现
  • GGUF+Ollama本地部署大模型:原理、选型与实战指南
  • GDM Settings 主题定制指南:如何更换GNOME登录界面的背景、图标和光标主题
  • 2026北京玻璃钢座椅定制厂家实力榜:防腐耐候技术领跑,六家本土厂商加工优势与深度解析 - 品牌发掘
  • Mac Mouse Fix终极指南:3个技巧让你的普通鼠标在Mac上超越苹果触控板体验
  • Mac文件预览革命:50+款QuickLook插件如何彻底改变你的工作效率
  • Plates.js 最佳实践:15个提升模板开发效率的实用技巧