级联延迟反馈建模:展示广告转化率预估的标签重塑实战
做展示广告转化率预估这几年我最大的感受是模型结构很多时候反而不是最难的点最难的是把“标签”这件事彻底想明白。普通场景的标签是确定的点了就是1没点就是0可广告转化不一样用户可能点完广告后几秒就下单也可能在购物车里放三天再回来支付甚至看完后去别的渠道比价再成交。只要离线样本按固定观察窗口切标签就在悄悄“变瞎”窗口内的负样本里其实混着一批第二天就会转成正样本的潜伏用户。最近看到某头部电商平台展示广告团队发表的一套新框架把这个问题往深挖了一层核心思路是“级联延迟反馈建模”。它不再把延迟当成一条拟合出来的曲线而是拆成多阶段、多来源的时间延迟逐一建模每一层都有自己对应的标签和优化目标。这篇文章我会把它的原理、和传统方案的差异、训练样本该怎么构造、线上推理怎么用都展开讲一遍也会把我自己踩过的坑放在相应的地方希望帮正在做广告延迟建模或标签工程的同行省点时间。1. 展示广告里的“迟到”转化一个容易被忽视的标签慢性病1.1 转化的真实时间线比想象中长广告系统的数据链路里一次完整转化并不是“用户点击→立刻支付”这么简单。用户的真实路径往往是看到广告、点击落地页、浏览商品、收藏加购、对比其他店铺、再回到站内下单中间可能跨设备、跨时段。这些动作之间的时间差短则几秒长则几周没有任何一个固定窗口能把它完整装下。这就产生了一个很讽刺的结果模型学习用的负样本并不是真实的负样本而只是“在当前观察窗口内还没变成正样本”的样本。你训练时标记为0的用户可能在训练结束后的第二天产生了转化但他的特征已经参与过一次梯度更新模型会朝着“这个特征组合转化率不高”的方向去学习。1.2 不止用户决策慢平台链路也在拖时间很多人以为延迟只是用户下单慢实际做过数据链路后就会明白平台侧的延迟同样不可忽略。支付事件发生后广告日志要经过归因服务、点击日志join曝光日志、ETL清洗、样本拼接这些环节才能真正进入训练样本库。每个环节都会消耗时间尤其是大促高峰期数据链路排队严重时回传延迟可能从分钟级涨到小时级。这带来的直接问题就是样本“反复无常”同一个用户今天在正样本表里没有记录明天数据回流了它又变成正样本。如果你用当天快照去训练等于每天都在用一套看不见全貌的数据集。更麻烦的是这种系统延迟不像用户决策延迟那样有规律它会随链路负载上下浮动模型更难去建模。1.3 多重延迟的真实形态在实际业务里至少有三种延迟叠加在一起用户行为侧延迟从曝光/点击到最终支付的时间受商品客单价、品类决策周期、用户犹豫程度影响差异最大平台回传侧延迟从支付发生到日志入库的时间由数据管线决定高峰期波动明显归因口径侧延迟不同广告主设置的转化归因窗口不一样有的看1天有的看7天还有的看30天同一个转化在不同口径下会被划到不同日期。延迟来源时间尺度对标签的影响用户决策延迟分钟到数周窗口内未成交被错标为负样本平台数据回传延迟分钟到数小时样本入库时间漂移快照不稳定归因窗口口径差异数小时到数十天不同广告主、不同渠道口径不一致营销活动导致的节奏波动天级延迟分布出现双峰不再是平滑曲线这些延迟叠加在一起的时候只用一个“平均延迟分布”来描述肯定不够。这也是触发这套级联框架最直接的业务原因延迟不是一种而是多重模型必须有能力区分它们各自的时间尺度和触发条件。2. 从“改标签权重”到“拟合延迟分布”经典方案的演进与天花板2.1 最朴素的做法把窗口边缘样本的权重调低行业内解决延迟反馈问题早年最朴素的办法是给伪负样本降权。比如观察窗口是7天那么第6天和第7天还没转化的样本负样本置信度存疑就给它的loss乘以一个小于1的系数那些曝光后1小时就被判定为负样本的反而比较可信。这种方法确实有用核心逻辑也很容易理解离窗口截断边界越近的未转化样本越有可能是“假阴性”。但它的问题在于这个权重是拍脑袋定的没有经过概率推导而且窗口越长样本时效性越差窗口越短误杀越严重。它本质上是在缓解问题而不是在建模问题。2.2 进一步思路把延迟当随机变量去学习后来业界开始引入延迟分布建模思路是把“转化是否发生”和“转化发生在什么时间”联合起来看。对每个样本定义它从发生行为到转化完成的时间间隔为一个随机变量并在训练时显式估计条件延迟分布。这样的方法能带来一个很直接的提升当某个样本在当前时刻还未转化时模型不再直接认定它为负样本而是计算“它未来转正的概率”再把这部分概率作为正样本损失的权重补偿回来。这种做法比单纯降权要精细得多因为它对每个样本给出的调整系数是数据和模型驱动的而不是人工定的常数。但这里有一个隐蔽的天花板一旦真实业务里存在多个延迟来源把它们混成一条分布曲线来拟合就会变成一个“平均化”的结果。用户决策快的和慢的、回传及时的和大促卡顿的全被揉进同一个形状的函数里。模型能学会平均水平却很难在某个具体广告位、具体时段上做到精确校准。2.3 单条延迟曲线为什么顶不住多重延迟单条延迟曲线本质上是在假设“所有样本的延迟来自同一个生成过程”但展示广告场景恰恰不满足这个假设。同一个用户处在不同决策阶段时延迟状态完全不一样同一个广告位在大促前后延迟分布也会急剧变化。如果硬用一个全局分布去拟合最后学到的往往是多峰分布中间的一个“虚假均值”。我做实验时见过一个很典型的案例某条广告线在非大促期间的转化延迟中位数只有2小时另一条广告线因为客单价高、决策周期长中位数达到了36小时。如果用同一个全局延迟分布去建模结果就是两条线都不准快的线觉得模型反应太慢慢的线觉得模型过于激进。这个案例让我深刻意识到必须把延迟拆开而不是合并。3. 级联延迟反馈建模框架把一次转化拆成两段随机过程3.1 核心洞察转化不是终点事件而是状态递进这套新框架最关键的洞察是一次转化不应该被看作一个单独的点事件而是用户从曝光状态不断向前递进、最终到达转化状态的过程。每一次状态转移都有自己的延迟规律前一个状态没发生后一个状态就不可能发生。类比一下用户决策很像一条生产线曝光是原料进入车间点击/加购/收藏是中间产物支付是成品下线。每条工序耗时不同如果只统计“进料→成品”的总时间就很难定位是哪一道工序拖慢了整体节奏。级联建模就是给每道工序单独建一个时钟。3.2 第一级曝光到行为意图的条件建模框架的第一级负责建模“曝光之后用户是否会出现行为意图”。这个意图可以是点击、加购、收藏等强信号不同的广告场景可以定义不同的意图事件。第一级输出的结果用来回答“这次曝光有没有引起用户注意力以及如果引起了是在曝光后多久发生的。”这一级的延迟通常非常短集中在几十秒到几小时而且受物料吸引力、上下文匹配度影响极大。它适合用一个条件分布模型来拟合特征是曝光侧的创意、商品、人群标签、上下文场景。3.3 第二级意图发生后到转化反馈的条件建模第二级则在这个意图已经发生的前提下继续建模“从意图到真实转化”的延迟。这个延迟通常要长得多影响因素也从“曝光吸引力”切换到了“商品决策难度、价格带、竞品情况、用户历史购买周期”等更深层的信号。和直接把曝光到转化作为一个整体建模相比这种条件分解有明显的概率优势第一级把意图强度先抽出来第二级再去学习“有意图的人里面谁会最终付款”。两个目标不再互相污染延迟估计的方差也会更小。从工程上理解这相当于把原本一个复杂的映射拆成了两个更易学的子映射。3.4 两级联合推断时的数学直观如果把两级放在一起看最终预测可以写成这样一个直观形式转化概率 曝光后产生意图的概率 × 意图发生后最终转化为正样本的概率而总体延迟则由两部分时间相加构成先是曝光到意图的时间再是意图到转化的时间。级联的价值就是让这两个时间各自拥有独立的参数并且允许它们的形态完全不同——前一个可以是尖锐的短尾分布后一个可以是平坦的长尾分布。对比单阶段模型它只能用一个 T 去总括一切拟合出来的分布往往把短延迟和长延迟混在一起既看不出意图产生的快速爆发也看不出转化积累的慢热长尾。这个区别在真实数据上非常明显尤其是当你分别画出两种模型对“曝光后5分钟转正率”和“曝光后3天转正率”的预测时级联模型的校准度会高出一截。4. 训练样本构造与损失函数框架落地的细节活4.1 样本抽取窗口怎么定训练这套级联框架数据侧最优先要解决的是“样本归属窗口”的问题。我的做法是对每条曝光/点击样本记录行为发生时间然后定义一个观察窗口比如7天。窗口内发生了意图、或发生了转化就把对应阶段标记为正样本窗口内什么都没发生先不急着打成负样本而是记一个“未观测到事件”的软标签。这里有个细节容易踩坑第一级需要的样本是曝光日志第二级需要的样本是行为日志两级样本的体量可能差一个数量级。意图行为可能只有曝光量的百分之几转化又只有意图行为的百分之几。如果不做对齐二级网络很容易过拟合到少数样本上。实际落地时我会把第一级和第二级的训练数据分开存储分别做采样和校验避免共用一套样本带来的分布错位。4.2 损失函数怎么拆整个模型的训练目标可以分为两段损失相加。第一段损失负责让模型学会“是否有意图”这是一个常规的分类目标第二段损失负责在意图已发生的前提下让模型学会“延迟多久转化”这需要使用一个截断感知的目标函数。对于窗口内已经转化的样本直接以实际延迟时间作为监督对于窗口内尚未转化、但被判定为可能后续转正的概率样本则按概率折算成伪正样本损失而不是简单丢弃。这种损失设计等于在告诉模型别因为今天没看到转化就断言永远不会有转化。4.3 一个建议先分别预训练再联合微调在真正联合训练之前我建议先把第一级和第二级分开预训练好。原因是两级特征空间差异比较大如果一开始就端到端训练梯度会相互干扰尤其是第二级网络很容易被第一级的误差带偏。分开预训练到一个合理水平后再做端到端联合微调调整范围不要太大学习率设得低一些效果通常会更稳。联合微调的另一个好处是可以共享一部分用户基础特征比如用户历史购买力、活跃时段、最近7天访问频次等减少两个网络各自重复学习的压力。实操中我会把特征分成三块曝光上下文特征、用户长期属性特征、用户近期行为特征前两块两级共用第三块主要给第二级使用。4.4 训练数据延迟表的重要性训练这套框架还不能忽略一张基础的“延迟统计表”。这个表记录每个广告位、每个品类、每个流量渠道下的历史延迟分布分位数比如50%转化在多久内发生、90%转化在多久内发生。它有两个用途一是用来做样本截断补偿的参考二是用来诊断第二级网络输出是否出现漂移。如果某一天第二级网络预测的期望延迟突然下降对照延迟统计表发现广告位覆盖结构发生了改变那就要警惕是不是新流量把分布拉变了。不要急着调模型先看数据构成。5. 线上推理与效果验证四个容易被带偏的坑5.1 线上打分不要只输出一个静态转化率在线上用这套框架时最忌讳的是像普通分类模型那样只输出一个“最终转化概率”。因为延迟反馈场景下同一个用户曝光5分钟和曝光3天后的意义完全不同前者还有很大可能转化后者则基本可以放弃。正确做法是输出一个随流逝时间变化的动态概率也就是在每个时刻都重新计算条件转化概率。这个动态值给到竞价模块后可以让出价系统在转化最可能发生的时刻窗口内提高出价权重在希望渺茫时降低投放成本。实践下来这类动态化输出带来的收益往往比把模型结构改复杂还要明显。5.2 评估指标要先看“成熟窗口”延迟反馈模型的离线评估非常容易自欺欺人。如果你只取最近7天样本并固定7天观察窗口来评估那么新模型和旧模型比的其实是“谁更会拟合当前这批还没完全成熟的数据”而不是“谁对最终转化判断更准”。我建议把评估拆成两套口径第一套看成熟窗口也就是只统计观察时间已经足够长、延迟分布已经基本沉淀的那批样本用它们来比较模型的最终校准度第二套则看早期表现用转化未完全沉淀的近期样本观察模型在真实投放节奏下是否敏感。两套结论不能互相替代也不要只看一套下结论。5.3 A/B实验容易被延迟错觉骗到还有一个很经典的现象新模型上线后前两天效果大跌团队差点回滚结果第三天开始反超。原因是延迟转化样本正在按不同节奏回流到实验组和对照组头两天的样本统计其实是被“未回传正样本”污染的。处理方法是把实验的评价时间拉长到最大延迟的2到3倍并采用“截止评价日期后的数据再回补”的方式也就是实验结束后再等一段时间用补全后的数据做最终决策。这一条看上去很简单但真的能拦住大量错误上线和错误回滚。5.4 在线推断时的实时特征问题第二级网络依赖用户最近行为特征而在真实请求链路里这些特征往往不是实时的存在分钟级甚至小时级的缓存延迟。也就是说模型以为用户“刚发生加购”实际上这个行为可能已经是半小时前的。如果不对特征新鲜度做标记级联模型第二级的延迟预测就会系统性偏短。我的处理方式是给每个最近行为特征加一个时间戳维度在特征工程阶段就显式告诉模型该特征的新鲜程度让模型自己学会根据时间衰减调整判断。这个操作实现成本不高但对长期稳定的线上效果帮助很大。6. 我的一些落地体会和可能的扩展方向如果你问我在实际项目里最值得先做什么我的建议是别急着整套替换模型。先把线上各条广告线的延迟分布报表拉出来按照意图延迟和转化延迟分开统计看看差异到底有多大。如果所有流量都集中在同一时段内完成转化那单阶段模型完全够用如果明显存在多元时间尺度再考虑级联方案。很容易出现的情况是一小部分长尾渠道扰乱了整体表现这种情况下做数据分层治理远比换模型更划算。从工程投入角度看这套框架对已经具备成熟点击率/转化率模型体系的团队来说增量成本主要在多维护一个延迟子网络和对应的训练窗口管理逻辑。收益方面最大的增量不在离线指标上而在出价策略的空间拓宽——因为你能区分出“快速转化人群”和“慢热转化人群”从而对两类人群采取完全不同的竞价策略。我还会把级联思想延伸到其他延迟反馈业务里去比如订阅续费、金融授信、二阶段复购。这些场景同样存在“先产生意向、再最终确认”的多重延迟结构把广告领域这套样本标签重塑和条件延迟建模的方法搬过去解决同类问题也是顺理成章的。最后想说延迟反馈建模归根到底比的是对时间的理解把时间维拆细一点、把阶段分清楚一点很多顽疾自然会松绑。