ESMM 核心总结笔记
ESMM 核心总结笔记
传统 CVR 模型只在点击样本上训练,导致训练空间与实际预测空间不一致(样本选择偏差);ESMM 用 CTCVR loss 把监督信号扩展到了整个曝光空间,让 CVR 在不可监督的样本上也能通过乘积 loss 间接受到梯度更新,解决了训练推理不一致和样本选择偏差的问题。

一、三种预测任务的定义
| 预测任务 | 定义公式 | 含义 | 预测目标 |
|---|---|---|---|
| CTR | \(P(y=1 \mid x)\) | 用户是否点击广告 | 预测点击率 |
| CVR | \(P(z=1 \mid y=1, x)\) | 用户点击后是否转化 | 预测转化率(条件) |
| CTCVR | \(P(y=1, z=1 \mid x) = P(y=1 \mid x) \cdot P(z=1 \mid y=1, x)\) | 用户曝光后最终转化的概率 | 预测点击转化率 |
二、三种任务的训练样本(正负样本)
| 样本条件 | CTR 是否训练 | CTR Label | CVR 是否训练 | CVR Label | CTCVR 是否训练 | CTCVR Label |
|---|---|---|---|---|---|---|
| 曝光 + 点击 + 转化 | 1 | 1 | 1 | |||
| 曝光 + 点击 + 未转化 | 1 | 0 | 0 | |||
| 曝光 + 未点击 | 0 | 无 | 0 |
说明:
- CTR 训练样本:所有曝光样本,正样本是点击,负样本是未点击
- CVR 训练样本:只有点击样本,正样本是转化,负样本是未转化
- CTCVR 训练样本:所有曝光样本,正样本是点击+转化,其他都是负样本(包括未点击的)
三、ESMM 的训练损失函数(原文)
\]
特点:
- 没有直接计算 CVR loss(可以考虑加入点击样本的CVR loss)
- CVR 通过 CTCVR 的乘积 loss 被间接训练
四、核心机制 & 技巧
1. 为什么不直接训练 CVR?
传统 CVR 模型只在点击样本上训练,会有以下问题:
- 训练空间和预测空间不一致(训练时在点击空间,预测时要泛化到曝光空间)
- CVR预估模型的本质,不是预测“item被点击,然后被转化”的概率(CTCVR),而是“假设item被点击,那么它被转化”的概率(CVR)。
它与CTR没有绝对的关系,很多人有一个先入为主的认知,即若user对某item的点击概率很低,则user对这个item的转化概率也肯定低,这是不成立的。
这就是不能直接使用全部样本训练CVR模型的原因,因为不知道那些unclicked的item,假设他们被点击了,是否会被转化。如果直接使用0作为它们的label,会很大程度上误导CVR模型的学习。 - 但是CTCVR是已知的,因为未点击,CTCVR的标签肯定为0
2. ESMM 的设计解决了什么?
用 CTCVR 的目标(点击 + 转化的联合概率)替代了 CVR 的目标
训练时:
- 在所有曝光样本上训练 CTR 和 CTCVR
- 虽然 CVR 在未点击样本上没有 label,但它的输出参与了乘积,仍然被训练
- CVR 通过共享底层网络和乘积梯度反向传播,被“间接”训练
推理时:
- pCTR × pCVR 得到最终的 CTCVR(曝光转化率)
五、关键疑问及解答整理
| 疑问 | 解答 |
|---|---|
| 未点击样本怎么处理? | 虽然 CVR 没有 label,但它的输出 PCVR 会被用于计算 pCTR × pCVR;再通过 loss 反向传播给 CVR |
| 没点击就没转化,为什么可以构造 CTCVR label? | 因为 y=0 时,y∧z 一定为 0,label 是可靠的,能作为监督信号 |
| CVR 输出是否为 0? | 不一定,但 y=0 时的 z label 是 undefined,所以不能训练 CVR;只能通过 CTCVR loss 间接训练 |
| 为什么不直接训练 CTCVR? | 实际上 ESMM 就是这样做的!通过 CTR 和 CTCVR 两个子任务建模整个转化流程(曝光 → 点击 → 转化) |
六、一句话总结 ESMM 的亮点
ESMM 通过构造 CTCVR 的监督目标,把 CVR 的训练空间扩展到了全曝光空间,同时避免了训练推理不一致和样本选择偏差的问题,是一种结构简单却效果极强的多任务建模方法。
负采样策略 + CVR 标签处理注意事项(ESMM)
一、为什么需要负采样?
在只有“点击样本”的训练数据中:
- CTR 没有负样本 → 模型只能学习点击的特征,无法区分点击/未点击
- CTCVR 没有负样本 → 模型无法学习“曝光未转化”的分布
- CVR 仍可训练(只在点击样本上)
解决方法:
→ 引入曝光未点击的样本作为负采样样本
二、负采样方法
从召回候选集中随机或策略性采样用户曝光但未点击的样本。
采样样本也需构造完整标签字段结构:
| 字段 | 说明 |
|---|---|
is_click |
点击标记(设为 0) |
is_convert |
转化标记(设为 0 或 None) |
CTR_label |
= is_click |
CTCVR_label |
= is_click & is_convert |
CVR_label |
= is_convert(仅用于点击样本训练) |
三、训练时的 label 使用逻辑
| 任务 | 计算范围(哪些样本参与) | 使用的 label |
|---|---|---|
| CTR | 所有样本 | is_click |
| CTCVR | 所有样本 | is_click & is_convert |
| CVR | 仅点击样本(is_click=1) | is_convert |
未点击样本的
CVR_label不参与任何 loss 计算
四、验证和测试时的 CVR 评估
验证阶段评估 CVR 时,仅使用点击样本
可以计算:
- AUC(CVR)
- LogLoss(CVR)
此时
CVR_label有效使用
实践建议:
- 构造样本时可统一填入
CVR_label=0,但训练中不能直接计算负样本的cvr loss - 负采样比例控制建议在 1:1 ~ 1:4 之间(正:负)
- 尽量从实际曝光日志或召回结果中采样,避免完全随机采样带来的分布偏差
ESMM 核心总结笔记的更多相关文章
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- windows线程池四种情形(win核心读书笔记)
windows线程池四种情形(win核心读书笔记) Mircosoft从Windows2000引入线程池API,并在Vista后对线程池重新构架,引入新的线程池API.以下所有线程池函数均适用于Vis ...
- 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载
作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...
- 如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记
一.ASP.Net MVC简介 1,什么是ASP.NET MVC? HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大.工作量大.因此提供了ASP. ...
- javascript 核心语言笔记 6 - 对象
对象是 JavaScript 的基本数据类型.是一种复合值:将很多值聚合在一起.对象可以看做是无序集合,每个属性都是一个名/值对.这种基本数据结构还有很多叫法,比如「散列」(hash).「散列表」(h ...
- javascript 核心语言笔记 5 - 语句
表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束.表达式计算出一个值,语句用来执行以使某件事情发生 表 ...
- javascript 核心语言笔记 4 - 表达式和运算符
表达式(expression)是 JavaScript 中的一个短语(phrases),JavaScript 解释器会将其计算(evaluate)出一个结果.程序中的常量.变量名.数组访问等都是表达式 ...
- javascript 核心语言笔记- 3 - 类型、值和变量
JavaScript 中的数据类型分为两类:原始类型(primitive type)和对象类型(object type).原始类型包括数字.字符串和布尔值 JavaScript 中有两个特殊的原始值: ...
- Python核心编程笔记--动态属性
一.动态语言与静态语言 1.1 静态语言特点: a. 在定义变量时需要指定变量的类型,根据指定的类型来确定变量所占的内存空间 b. 需要经过编译才能运行 c. 在代码编译后,运行过程不能对代码进行操作 ...
- Python核心编程笔记 第三章
3.1 语句和语法 3.1.1 注释( # ) 3.1.2 继续( \ ) 一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...
随机推荐
- IDEA主题下载仓库地址
拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme
- python库使用总结
python库的使用 1:print(补充) 2:math 2.1:math库包括的4个数学常数 2.2math库中的函数 幂对数函数 三角曲线函数 3:字符串处理函数 补充:sorted(str) ...
- 技术分享:主流GUI自动化框架的窗口置顶机制实现对比
前言 在自动化测试和RPA开发过程中,窗口置顶是一个常见且关键的需求.无论是确保测试窗口始终可见,还是保证自动化操作的准确性,各大Python自动化框架都提供了相应的窗口置顶功能.本文将深入分析主流框 ...
- Benchmark论文解读:Evaluating the Ripple Effects of Knowledge Editing in Language Models
论文发表于自然语言处理顶刊TACL-2024(原文链接).目前模型编辑方法的评估主要集中在测试单个事实是否被成功注入,以及模型对其它事实的预测是否没有改变.作者认为这样的评估模式有限,因为注入一个 ...
- 告别图形界面:Windows系统OpenSSH服务部署
前言 士别三日当刮目相待 没想到这么多年过去了,Windows 也不再是以前那个离开了图形界面啥也不是的系统 Windows 10/11 和 Server 2019+ 已内置 OpenSSH Serv ...
- Extend BOL Model BT with custom table type relationship
Link to Content's target Space : http://wiki.sdn.sap.com/wiki/display/CRM/CRM+Web+Client+UI+Framewor ...
- 非常'肤浅'的理解MVVM
那天领导给了我这么一个需求,就是他会通过接口给我传递一条数据,然后我需要判断这条数据的首字母是不是A,如果是的话,就把这条数据保存下来 很简单的一个需求对吧,直接开干,代码如下 完美的解决这个问题,所 ...
- AGC021E ball Eat chamelemons
E - Ball Eat Chameleons 设颜色序列中有\(R\)个红球,\(B\)个蓝球,且有\(B+R=k\) 然后分类讨论: \(R<B\) 无解 \(R>B\) 这时有一种合 ...
- window10本地搭建DeepSeek R1(一)
本章介绍在window上部署 DeepSeek R1-8B + Open WebUI :需要安装的有:Ollama,python 3.11,DeepSeek ,Open WebUI. 一:环境:我的w ...
- 通过 AWS CLI 操作 AWS S3
AWS S3后台提供了上传文件的地方,但是大文件上传比较慢--- 几十kb/s.使用AWS CLI上传文件相对较快 1:安装CLI (这里环境是 Windows) 参考官方文档 :https://do ...