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 的训练损失函数(原文)

\[\mathcal{L} = \sum_{i=1}^{N} \underbrace{\text{CrossEntropy}(y_i, \text{pCTR}_i)}_{\text{CTR loss}} + \underbrace{\text{CrossEntropy}(y_i \land z_i, \text{pCTR}_i \cdot \text{pCVR}_i)}_{\text{CTCVR loss}}
\]

特点:

  • 没有直接计算 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 核心总结笔记的更多相关文章

  1. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  2. windows线程池四种情形(win核心读书笔记)

    windows线程池四种情形(win核心读书笔记) Mircosoft从Windows2000引入线程池API,并在Vista后对线程池重新构架,引入新的线程池API.以下所有线程池函数均适用于Vis ...

  3. 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载

    作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...

  4. 如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记

    一.ASP.Net MVC简介 1,什么是ASP.NET MVC? HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大.工作量大.因此提供了ASP. ...

  5. javascript 核心语言笔记 6 - 对象

    对象是 JavaScript 的基本数据类型.是一种复合值:将很多值聚合在一起.对象可以看做是无序集合,每个属性都是一个名/值对.这种基本数据结构还有很多叫法,比如「散列」(hash).「散列表」(h ...

  6. javascript 核心语言笔记 5 - 语句

    表达式在 JavaScript 中是短语(phrases),那么语句(statements)就是 JavaScript 整句或命令,语句以分号结束.表达式计算出一个值,语句用来执行以使某件事情发生 表 ...

  7. javascript 核心语言笔记 4 - 表达式和运算符

    表达式(expression)是 JavaScript 中的一个短语(phrases),JavaScript 解释器会将其计算(evaluate)出一个结果.程序中的常量.变量名.数组访问等都是表达式 ...

  8. javascript 核心语言笔记- 3 - 类型、值和变量

    JavaScript 中的数据类型分为两类:原始类型(primitive type)和对象类型(object type).原始类型包括数字.字符串和布尔值 JavaScript 中有两个特殊的原始值: ...

  9. Python核心编程笔记--动态属性

    一.动态语言与静态语言 1.1 静态语言特点: a. 在定义变量时需要指定变量的类型,根据指定的类型来确定变量所占的内存空间 b. 需要经过编译才能运行 c. 在代码编译后,运行过程不能对代码进行操作 ...

  10. Python核心编程笔记 第三章

    3.1     语句和语法    3.1.1   注释( # )   3.1.2   继续( \ )         一般使用换行分隔,也就是说一行一个语句.一行过长的语句可以使用反斜杠( \ ) 分 ...

随机推荐

  1. IDEA主题下载仓库地址

    拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme

  2. python库使用总结

    python库的使用 1:print(补充) 2:math 2.1:math库包括的4个数学常数 2.2math库中的函数 幂对数函数 三角曲线函数 3:字符串处理函数 补充:sorted(str) ...

  3. 技术分享:主流GUI自动化框架的窗口置顶机制实现对比

    前言 在自动化测试和RPA开发过程中,窗口置顶是一个常见且关键的需求.无论是确保测试窗口始终可见,还是保证自动化操作的准确性,各大Python自动化框架都提供了相应的窗口置顶功能.本文将深入分析主流框 ...

  4. Benchmark论文解读:Evaluating the Ripple Effects of Knowledge Editing in Language Models

      论文发表于自然语言处理顶刊TACL-2024(原文链接).目前模型编辑方法的评估主要集中在测试单个事实是否被成功注入,以及模型对其它事实的预测是否没有改变.作者认为这样的评估模式有限,因为注入一个 ...

  5. 告别图形界面:Windows系统OpenSSH服务部署

    前言 士别三日当刮目相待 没想到这么多年过去了,Windows 也不再是以前那个离开了图形界面啥也不是的系统 Windows 10/11 和 Server 2019+ 已内置 OpenSSH Serv ...

  6. 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 ...

  7. 非常'肤浅'的理解MVVM

    那天领导给了我这么一个需求,就是他会通过接口给我传递一条数据,然后我需要判断这条数据的首字母是不是A,如果是的话,就把这条数据保存下来 很简单的一个需求对吧,直接开干,代码如下 完美的解决这个问题,所 ...

  8. AGC021E ball Eat chamelemons

    E - Ball Eat Chameleons 设颜色序列中有\(R\)个红球,\(B\)个蓝球,且有\(B+R=k\) 然后分类讨论: \(R<B\) 无解 \(R>B\) 这时有一种合 ...

  9. window10本地搭建DeepSeek R1(一)

    本章介绍在window上部署 DeepSeek R1-8B + Open WebUI :需要安装的有:Ollama,python 3.11,DeepSeek ,Open WebUI. 一:环境:我的w ...

  10. 通过 AWS CLI 操作 AWS S3

    AWS S3后台提供了上传文件的地方,但是大文件上传比较慢--- 几十kb/s.使用AWS CLI上传文件相对较快 1:安装CLI (这里环境是 Windows) 参考官方文档 :https://do ...