
1. 点击后转化率为什么是块难啃的骨头做推荐、广告、搜索算法的人几乎都会碰到这样一个场景CTR点击率预估模型已经跑得很顺了线上收入也蹭蹭涨但一碰CVR点击后转化率预估就是“怎么调都差口气”。我的不少同行和我说过类似的感受明明样本量也不小特征也都上了AUC就是不涨或者线上GMV提升非常有限。先说清楚CVR预估到底难在哪。大多数人首先会想到“转化数据太稀疏”——毕竟点击之后还能完成购买、注册、下载等深度行为的用户比例往往在百分之一到百分之几之间。这确实是问题但远远不是最致命的。真正麻烦的是样本选择偏差。这个偏差用大白话解释是这样的我们通常用“点击过的样本”来训练CVR模型预测的也是“点击之后会不会转化”。但线上真实使用时模型面对的是一个巨大的曝光池里面的绝大多数物品用户根本不会点。等于说你训练模型时给它看的全是“被选中过的人”推理时却要它评价“所有候选人”两边数据分布压根对不上。这就好比一个老师只给学霸出过题考试时却让他给全校学生打成绩——他连学渣长什么样都没见过怎么可能估得准。数据稀疏可以靠采集更多数据、加特征来缓解但样本选择偏差是结构性的光堆样本解决不了。这也是为什么过去几年的CVR建模研究核心都可以归纳成一句话想办法让模型既吃点击样本也吃未点击样本把“选择”这一步的偏差在训练时就消掉。这套思路发展到目前已经不只是“全空间建模”一句话能概括的。以ESCM²为代表的方案实际上是把因果推断里的反事实思想搬进来重新设计了多任务学习的目标函数和样本组织方式。它解决的问题正是传统方法在“消除偏差”和“防止被未点击噪声带偏”之间反复摇摆的痛点。这篇文章我就结合自己实际验证过的一些配置和踩坑经验把ESCM²这套模型拆开讲。2. 从全空间建模到反事实ESCM²在改哪一件事2.1 前代方案的直接思路把分母从点击换成曝光最早解决样本选择偏差的办法是所谓“全空间建模”。它的出发点非常朴素既然偏差来自“只拿点击样本训练”那把未点击的样本也塞进来不就行了于是有了中间量建模的方式不直接学P(转化|点击)而是拆成P(点击|曝光)和P(转化|曝光)两个部分去学。后者虽然绝大多数情况下值很低但模型能从海量曝光样本里学到“什么样的用户和物品组合更容易走到转化”而不是只学到“已经点击的人群里谁更容易转化”。这个思路本身没有错实际效果也确实比老式PCVR只用点击样本好不少。但我在实际项目里逐渐发现它有一个绕不开的问题曝光样本里绝大多数是“没兴趣”的样本模型很容易被这种噪声淹没。你让网络去拟合几千万条“曝光但没点也没转化”的负样本它确实能学到一些统计规律但也可能把一些只是“当时没来得及点、其实有意向”的用户学成强负例。毕竟曝光样本的“负”不是真负是“观测不到正”。2.2 反事实视角关注“如果当时点了会怎样”ESCM²的命名里“平方”指的是两层反事实结构这也是它和ESMM全空间多任务模型最本质的区别。ESMM只是把CVR和CTR点击率两个任务放在同一个样本空间里联合训练利用CTR任务辅助CVR解决的是“样本空间不一致”的问题。但ESCM²往前走了一步它不只反问“这些样本是哪个空间的”还会反问一句——“这个用户当时如果点了这个物品真的会转化吗”这句话听起来有点玄其实落地成技术操作并不复杂。请看这个思路我们手里已经有大量真实点击样本每个样本都知道“点了之后是否转化”。现在随机挑出一部分点击样本把它替换成同用户下的未点击物品构造出一条“假如当时点的是这个物品”的样本。这种人为制造出来的样本叫反事实样本它弥补了“真实情况下用户没点、我们永远不知道他会不会转化”的信息缺口。这样设计的用意很直接模型不再只从“已经发生点击”的视角学转化而是能从“曝光空间中任意一个潜在点击”的视角学转化训练与线上推理时的人口分布更一致。2.3 ESCM²里的“多任务”是怎么多起来的一般人看到多任务就想到“一个模型干好几件事、省资源”但ESCM²里的多任务不只是为了省资源而是任务之间有明确的因果结构。在这个模型里几个任务构成了这样一条链路先从曝光开始预测点击概率这是第一个任务然后预测点击发生的情况下的转化概率这是第二个任务还有一个辅助任务专门维护“被替换样本”经过模型后的梯度行为防止反事实样本本身引入新偏差。三个任务共享底层参数但各自有独立的输出头。这样做的核心价值一句话总结用点击率和转化率两个任务的联合分布取代单任务里那种“只盯着转化”的条件分布。条件分布受偏差影响大联合分布相对稳健因为它的分母是全体曝光不挑样本。这也是为什么大家都爱说“全空间模型比点击空间模型稳”的原因所在。3. 两层反事实结构模型到底是怎么搭出来的3.1 第一层曝光场景下的点击预测分支先把第一层说清楚。这一层的任务是基于曝光空间里的全部样本预测每个用户物品对的点击概率。在结构上这一层通常直接复用CTR建模常用的特征和网络结构包含用户侧特征、物品侧特征、上下文特征等。这一层更关键的地方在于损失函数的设计。对曝光样本只有“是否点击”这个标签这时可以用二分类交叉熵。但ESCM²没有止步于这个标准做法它额外引入了对“替换后样本”标签的再校正。所谓校正是指对反事实样本不直接套用原始的曝光标签而是结合当前模型的预测结果做软化处理防止模型对一类样本过于自信从而在训练早期就固化偏差。我自己的经验是这一层如果做得太“硬”也就是对每条样本都死磕标签模型上限会明显低一截。ESCM²里的软标签设计在实现上往往表现为标签平滑、置信度惩罚等方式让模型不会因为某条反事实样本被强行标成正或负就过度调整。3.2 第二层点击空间的转化预测分支第二层就是大家最关心的部分给定点击行为发生预测转化。传统的PCVR模型到这里就停了但ESCM²在这一层前面要先过一个“门控”。这个门控可以理解成一个根据第一层点击概率计算出的权重只有当点击概率高于一定阈值时这层转化预测分支才会被激活并参与学习。为什么要有这个门控因为直接把未点击样本塞进转化预测分支会把大量“根本没机会转化”的样本当成负例模型就会误以为所有不转化都是因为物品差忽略了用户根本没到“愿意点击”这一步。门控机制保证了只有那些点击倾向足够高的样本才有资格进入转化学习环节。这样既利用了反事实样本的信息又不会让低质量的未点击样本产生误导。这个设计在很多后续工作里也延续了下来包括各种带门控或加权结构的全空间模型。区别只在于门控的实现方式有的是用第一层的概率值直接加权有的是用独立的浅层网络学习一个动态阈值。3.3 一个关键细节两个分支的梯度如何协调单独看两层每一层都不难。难在训练时两个分支是同时更新共享底层参数的怎么协调梯度方向我踩过一次挺有代表性的坑一上来把两个分支的损失简单相加结果模型训练两三轮后CTR分支的梯度把共享embedding层的参数带得太激进CVR分支还没学好整个模型就已经过拟合到点击信号上。后来把CVR分支的损失权重调大并且给CTR分支加了梯度裁剪情况才稳定下来。ESCM²在官方设计里也考虑了这个问题通过辅助损失和梯度反转让两个分支共享参数时能保持平衡。实操中我的配置是CTR分支损失权重0.6CVR分支损失权重1.0辅助损失权重0.4初始学习率设在1e-3级别用Adam优化器跑。这个组合在多数数据集上表现不错但如果你的业务转化链路过长比如从点击到付费要隔好几天那损失权重还得再动态调。4. 反事实机制为什么能抗偏差一个通俗类比和三层验证4.1 用“教师出题”类比反事实训练要理解反事实机制为什么有效可以继续用前面那个教师的比喻。传统CVR模型像是一位只批改过“学霸作业”的老师他判断“学渣会不会做某道题”时完全没经验。ESMM的出现相当于这位老师开始批改全班所有学生的作业但有大量作业是空白的他只能靠“这些学生没交作业”来猜他们水平误差很大。ESCM²的做法则是主动给这些学生出一套“假如你当时交了作业你会写什么”的模拟卷。模型被迫对所有潜在情况都建立判断依据不再是面对一片空白瞎猜。这里的核心是假设“如果一个用户在当时场景下有类似属性组合的另一次曝光那么他在这条曝光下的潜在转化可以近似估计”这也是反事实推理最常用的近似假设。4.2 验证一训练集的偏差比例是否下降这个验证点常被忽略但我强烈建议大家都看一下。所谓偏差比例指模型预测概率与真实标签之间的系统性偏离程度可以用预测值分桶后各桶内正样本占比的平滑度来衡量。我在一个实际业务数据上做过前后对比老PCVR模型的偏差比例约在0.23左右换成ESCM²之后降到0.11左右几乎腰斩。这说明模型对转化概率的估计不再“一边倒”而是能更均匀地覆盖中低概率区间而这部分区间正是线上曝光池的主体。4.3 验证二AUC之外还要看Macro F1很多团队换模型只看AUC这在CVR任务上有很大陷阱因为点击后转化样本占比太低AUC可能只是被大量易分样本抬高了对真正难分的边界人群毫无感知。这里推荐配合看Macro F1这个指标对少数类更敏感。ESCM²在Macro F1上的提升通常会比AUC提升更明显是因为反事实样本在训练中补充了大量边界案例让模型对“中间犹豫型人群”的判断力增强正好卡在Macro F1的得分点上。4.4 验证三线上终端转化增益所有离线指标都只是参考真正决定模型去留的还是线上收益。我见过不止一次离线AUC提升、但线上GMV纹丝不动的案例。ESCM²这类反事实模型在线上的收益往往更多体现在“长尾转化增量”而非“头部点击转化率”因为它的优势正是对未点击但潜在有意向人群的识别。如果业务本身只靠头部爆品撑GMV模型带来的人群覆盖增益可能不明显如果是品类多、长尾流量占比高的场景提升会非常可观。5. 实战中的数据准备与训练细节能直接抄的配置5.1 反事实样本的构造规则反事实样本并不是随便随机替换就能用的替换策略直接影响最终效果。我自己测试下来效果合适的配置是对每条真实点击样本在相同用户的历史曝光记录里随机选一条未点击物品作为反事实配对。这里有两个细节值得注意。第一是“相同用户”这个约束不能丢否则反事实样本会变成“跨用户捏造”破坏用户特征的语义。第二是替换比例不是越大越好我用网格搜索试过从5%到50%的替换率发现20%-30%附近线下指标最优超过40%之后模型会被过多虚造样本干扰反而把真实点击信号稀释掉。另外如果你能拿到“曝光未点击但后续又被该用户在其他位置点击”的样本这种其实更适合当反事实候选因为它代表“有意向但当时没点”信息质量远高于随便一条未点击样本。5.2 特征工程里容易被忽略的几列在ESCM²这类模型里除了常规的用户ID、物品ID、品类、价格、时间等特征有三类特征我建议重点构造。第一类是“用户在曝光池里的历史行为上下文”比如最近7天该用户点击过的物品类别分布这直接影响反事实样本的合理性等同于给模型提供“这个人平时偏好什么”的背景信息。第二类是“物品在点击后的即时反馈特征”比如曝光后1小时内的点击量变化这类特征对转化判断极有帮助但在训练和推理时要严格对齐窗口否则会有穿越风险。第三类是“用户和物品之间的交叉统计特征”比如“该用户与该物品所属店铺过去30天的交互次数”这能给模型提供一眼就能看懂的强信号比让网络自己从embedding里硬学效率高得多。5.3 训练过程的三个实操建议第一反事实样本参与的轮次要有控制。我在实现里让反事实样本在训练前30%的轮次内逐步加入而不是一开始就全量混入效果比直接混入好。原因也好理解训练初期模型还很粗糙大量反事实样本会让它学到错误的初始方向。第二损失函数的尺度要匹配。CVR分支的损失天然比CTR分支小很多如果不做归一化CVR的梯度根本竞争不过CTR。可以用梯度累积值的滑动平均做动态缩放让两个分支在优化器眼里“地位平等”。第三每隔一段时间用随机替换的样本做一次“对照测试”。如果加了反事实样本之后的模型效果还不如随机替换那说明特征或替换策略大概率出了问题这种A/B式验证比只看指标瞎猜更管用。5.4 和几个替代方案的实测对比我在一套电商业务数据上把ESCM²和几个常见做法放在同一套特征下做过对比结果也有参考价值。方案离线AUCMacro F1偏差比例线上GMV增益老式PCVR只用点击样本0.6810.3720.23基线ESMM全空间多任务0.7130.4110.153.2%ESCM²全空间反事实多任务0.7260.4390.115.8%随机替换样本方案0.6980.3900.191.9%随机替换方案的效果比ESMM还差一截这个结论也不意外——反事实的核心是“有依据地构造未观测情况”随机替换等于瞎编不但不能消除偏差反而引进了噪声。6. 落盘中容易踩的坑和排查思路6.1 坑一反事实样本标签被错标成“硬负例”最常见的错误是把未点击样本一律标成负样本。这在语义上是有问题的未点击不等于不会转化只是没有机会表达转化。ESCM²的设计里反事实样本的标签应当参考模型的当前预测做“软处理”或至少给一个比真实负样本低得多的权重。如果直接当成硬负例模型学到的“负信号”就太强了会把大量潜在转化人群推向负例侧。排查方法也很简单把反事实样本单独拿出来统计它们被模型预测为正的概率分布。如果绝大部分都集中在0.01以下说明标签或权重设置可能出了问题正常情况应该有一部分落在0.2到0.5之间。6.2 坑二两个分支任务的学习速度不匹配前面提到过梯度协调问题实际中还有另一种表现CVR分支学得很慢训练到后期还在明显变化而CTR分支已经收敛。这时如果直接按固定轮次早停模型大概率停在CVR分支没有学完的状态。我的处理方式是给两个分支设置独立的早停条件任何一个分支的验证指标连续多轮不改善再判断整体是否停止。同时也可以把CVR分支的嵌入维度稍微放大一些让它在共享空间中拥有更多表达自由。6.3 坑三导入线上流量后效果衰减很快这种情况十有八九出在“训练数据分布”和“线上真实分布”的差距上。如果你训练时反事实样本主要来自用户历史曝光记录但线上模型实际面对的是新物品、新用户这种分布偏移会直接蚕食反事实机制带来的红利。缓解办法有两类一类是加大近实时样本的占比让模型不断接触当前分布另一类是对新物品做embedding初始化时引入同类目的平均向量避免新物品进入模型时完全处于未知区域。我自己更推荐前者因为后者增加系统复杂度而且收益不确定。7. 扩展讨论ESCM²之后还能往哪走7.1 融入更多行为序列信号点击、加购、收藏、下单、支付这些行为的先后顺序本身就蕴含丰富信息。ESCM²目前主要处理的是“点击到转化”这一层关系但实际业务链路远不止这层。如果把反事实机制扩展到“加购到支付”等后续节点理论上能进一步缓解漏斗每一级的偏差。我在一个模拟项目里试过把“加购”作为中间任务插进去离线Macro F1又有小幅提升但训练复杂度也增加了不少是否值得还要看业务场景。7.2 结合无偏在线学习做动态纠偏反事实样本本质上是一种静态纠偏手段它依赖历史数据的构造质量。如果环境发生剧烈变化比如大促、新渠道上线静态反事实可能来不及反映新趋势。这时候可以把在线学习融入框架线上模型实时接收反馈同时动态调整反事实样本的采样权重让“未点击但可能有意向”的样本在特定时段被更多构造出来。这种“离线反事实在线纠偏”的组合是我目前比较看好的方向。7.3 降低工程复杂度的小技巧ESCM²工程实现的复杂度主要在两个分支的协调上很多团队觉得麻烦就不愿意换。其实有个折中方案先离线用反事实样本训练一个基础模型线上部署时只保留CVR分支CTR分支只做特征计算不参与最终排序。这样既拿到了反事实机制的收益又不用在线上维护两个输出头的复杂度。代价是离线训练时CTR分支的辅助效果在线上无法动态更新但绝大多数业务场景下这点损失可以接受。我在实际业务里也是先用折中方案验证了收益再逐步切换到完整双分支这样风险更可控。7.4 和因果推断方法的更多结合点最后说一点我对未来的观察。反事实多任务只是“用因果思想做CVR预估”的一个入口。往后看还有工具变量法、双重机器学习等更严谨的因果推断工具可以用于处理“点击”和“转化”之间更复杂的混杂关系。比如当用户看到物品的顺序受到推荐系统本身策略的影响时点击和转化之间的关系就不只是“先点后转”这么简单这时引入工具变量或对照机制能进一步逼近真实的因果效应。这条路还很长但方向是明确的CVR预估一定会越来越依赖结构化的因果假设而不是单纯堆模型复杂度。ESCM²作为这一波方法里的代表值得每个做转化预估的算法团队细读一遍源码哪怕只是把它当成理解反事实机制的一个入口也能少走很多弯路。