在之前的工作中负责过一段时间转化率的建模,这里对转化率建模的技术作一个简单梳理。
我把CVR建模中会遇到的主要问题分成3类(如图):
- 多目标建模:CTR建模的点击,一般意义上就是点了商品或者实际中的label是进入落地页(Detailed Page Viewed, DPV),目标相对非常明确;而对于转化,一般意义上是指下单/购买。但是在电商或直播的漏斗中,点击到转化的中间可能还会经历一长串的非串行的链路,比如传统电商转化前存在
加购、收藏、店铺关注、收银台落地页
等行为,在直播电商中有观看时长、点赞、吸粉、收藏、从直播间进入商详情页
等行为,通过优化中间的一长串漏斗,能一定程度使得最终的转化目标更大化。因此,多目标建模是转化建模必备技术。 - 无偏估计:CVR建模存在的2大主要偏差。
- 选择偏差:CTR和CVR的实际线上inference空间是曝光(需要在曝光前给出cvr分作为排序依据),对CTR来说这不是问题因为模型的样本就是曝光空间。但是CVR不同,如果用点击空间样本训练,那就存在训练和线上打分空间不一致的情况;如果选择曝光样本训练CVR,那曝光未点击的样本在CVR模型中到底因该是正样本还是负样本呢?
- 延迟反馈:转化可能发生在曝光后几天之后,站在当前的时间窗口,某个样本的转化label=0有可能是假负样本(因为它可能在未来几天变成正样本)。在Online Learning场景下,该问题尤为严重。业界也有不少方案在想办法缓解该问题。
- 正样本稀疏:转化的比例相比点击的比例要低很多,作为参考,某传统电商的CTR基本都在3%左右,转化小一个量级基本在千分有些场景甚至在万分。
多目标建模
说到多目标建模,为什么不采用多个单目标的模型呢?主要原因是商品的转化是一个极度稀疏的信号(有些场景<1%甚至0.1%量级),通过引入中间目标,不同目标的模型共享部分参数比如Embedding,有助于给转化模型的Embedding学习,缓解转化本身的稀疏问题。
一旦涉及到多目标,无外乎就是知识冲突
和知识迁移
两个维度(如下图,绘制于2022年左右)。多目标除了共享参数带来信息增益之外,有些情况也会存在目标间冲突的问题,典型的就是CTR和CVR一起建模,一些猎奇商品点击率很高,但是转化很低。
为了解决知识冲突,主要从2方面着手:
- 多目标的网络结构:
- google的MMoE:针对不同的任务用不同的Gate。虽然MMoE设计考虑了共享信息,但为了归类方便,我且将他要解决的主要问题定位为冲突解决,因为要共享Share Bottom就能很好共享;
- 腾讯的PLE:不同的目标不仅用不同的Gate,而且不同目标还有自己独有的Experts达到冲突进一步解耦;如果从Task Specific的视角看,MMoE的Specific是Gate,PLE的Specific是Gate和Experts。
- 快手的PEPNet:既然可以Specific是Gate和Experts,那是不是还可以Task Specific的Features,PEPNet就是Specific的Feature,对输入加权,在模型的更浅层把冲突问题解决。
- 多目标优化:最早的比如UWLoss对多目标自适应加权,但它的假设是多目标独立,很多情况下这个假设就没法满足;从模型角度来说,所有冲突的来源都来自于梯度的影响。如PCGrad在训练时把梯度冲突部分裁剪掉,保证不同目标间的梯度正交。沿着PCGrad后续有很多对梯度进行优化的方法。
当然,多目标结构和多目标优化方法可以一起使用,但从个人实践的经验来看,从网络结构上进行信息解耦,这种从本质上进行冲突信息分流的方式一般更容易拿到效果。保证每个任务有一个自己的与其他任务毫不相关的信息通路,保证冲突信息能从Task-specific的通路传递到loss。
为了实现知识迁移(即一个任务受益于另一个任务带来额外的提升):
- 不直接通过转移概率乘积建模,建模目标间的
序关系
:典型的比如lazada的GMSL利用GRU建模,以及美团AITM都可以认为是类似这种;
- 解决偏置问题:针对CVR的曝光空间选择偏差,引入因果推断IPW(Inverse Propensity Weighting),如Multi-IPW/Multi-DR,以及RecSys24 Tecent最近的NISE,他们的出发点都是认为ESMM依然存在选择偏差;
- NAS自动搜索模型结构:典型的AutoHERI在阿里妈妈场景下拿到了些效果,这种方向一般适合业务体量足够大的场景才去考虑,中小场景性价比不高。
有趣的是,大部分知识迁移的Paper都是考虑在Tower之后怎么进行融合,而知识冲突的研究基本考虑Tower之前怎么进行目标间信息的解耦。所以,上面列的,有很多知识迁移和知识冲突的方法是互补的,两者可以同时使用,比如PLE + ESMM,PLE + IPW等。就个人经验来说,MMoE和PLE这类模型即插即用,更通用,每个目标要再调整起来也更容易,相比ESMM这种需要先验的结构在更多场景被使用。LLM都是在往MMoE上发力,这是不是不同场景另一种殊途同归呢?
思考:
- 其实仔细去想,冲突信息在模型的越浅层解决越好。循着这个思路,参考PLE的思想,对于存在较大冲突目标的情况,是不是可以在更浅层Embedding层解决冲突,即每个task除了共享的embedding,还有自己独立的embeddig,即实现task specific embedding(TSE)?我在直播电商的多目标中简单尝试过这种做法(含观看时长/完播、点赞、吸粉、店铺收藏目标,主要考虑时长和其它目标有些情况不完全一致),在PLE的基础上有额外的提升,只是上线时Embedding需要更多的存储空间,Inference计算量相比不变。
- 有同学可能了解过MaskNet,它是否能用在多目标中实现Task-specific features?
样本有偏的问题
选择偏差很多时候都是结合类似ESMM的结构去缓解,上面多目标建模中已经有所提及。这里主要讨论延迟反馈带来的偏差问题。
延迟反馈
1. Modeling Delayed Feedback in Display Advertising
DFM,业界最早关注该问题的,利用数据先验,将延迟转化的衰减过程建模成指数分布,考虑延迟反馈问题值得细读该Paper作为一个baseline。具体的,确定转化的情况下C=1,延迟天数D=d表示成下面的指数分布,
$$ Pr(D=d|X=x,C=1)=\lambda(x) \exp(-\lambda(x) d) $$其中$\lambda(x)$是hazard function,$\lambda(x)=\exp(w_d*x)$。根据该先验信息,就能推导出观察正样本的概率和观察到负样本的概率,最后通过极大似然估计得到模型的Loss Function,从原来的Binary Cross Entropy Loss变成如下:
从Loss看,其中两项和BCE Loss很像,在BCE Loss基础上分别对正负样本有个loss调整。具体看负样本:
- 当 $\lambda$ 很大或elapsed time $e_i$ 很大的时候,$p(x_i)\exp(-\lambda(x_i)e_i$ 接近0,表示这种情况下基本确定性的负样本;
- 当 $\lambda$ 和elapsed time $e_i$ 都很小的时候,$p(x_i)\exp(-\lambda(x_i)e_i$ 接近$p(x_i)$,这个时候负样本还有很大概率正样本;
DFM在DNN很容易实现:
- 首先需要一个小的Net表征$W_d$
- 将Loss Function从原来的BCE Loss变成上面的Loss
# ref: https://github.com/xiahouzuoxin/torchctr/blob/e967324d446328357379cd649d367a5c4b2fac32/torchctr/losses/classification.py#L3
dfm_logit = W_d * x # output of the Net
lambda_dfm = torch.exp(dfm_logit)
likelyhood_pos = label_cvr * (torch.log(pcvr) + dfm_logit - lambda_dfm * elapsed_days_sold)
likelyhood_neg = (1 - label_cvr) * torch.log( 1 - pcvr + pcvr * torch.exp(-lambda_dfm * elapsed_days_sold) )
dfm_loss_cvr = - (ikelyhood_pos + likelyhood_neg).mean()
2. Delayed Feedback Modeling for the Entire Space Conversion Rate Prediction
相比DFM的指数衰减先验,这篇Paper ESDF用一个单独的Tower建模延迟转化,替代了DFM种的指数先验约束。其中y是否点击、c是最终是否转化、D是点击-转化的延迟时间。相比DFM的优点是不需要数据先验。
通过多目标进行延迟反馈建模的其他类似方案:
- MMDFM:https://mp.weixin.qq.com/s/VosvjdSn6c-qhOYeFBEqUQ
3. Capturing Delayed Feedback in Conversion Rate Prediction via Elapsed-Time Sampling
还一种方法是,重要性采样。延迟反馈的问题核心还是一个样本权重的问题,最终体现在Loss上的改变,
其中$p_{dp}$是延迟正样本的概率,$p_{rn}$是最终负样本的概率,这两个值通过重要性采样计算得到。
正样本稀疏
除了类似ESMM那样引入更Dense的辅助信号外。另外比较容易见效的方式就是正样本加权,常见的加权方法:
WCE:给正样本一个固定的权重
$$ Loss = -\sum_{i=1}^{N} \sum_{c=1}^{C} w_c \, y_{i,c} \, \log(p_{i,c}) $$Focal Loss:自适应样本权重,最早用在CV Detection中处理样本不平衡问题,可以理解为增强版的WCE
二分类:
$$ FL(p_t) = - \alpha_t (1 - p_t)^\gamma \log(p_t) $$其中$(1-p_t)^{\gamma}$用于控制难易样本程度,$\alpha_t$用于控制正负样本学习权重。
多分类:
$$ FL(p_t) = - \sum_{i=1}^{N} \sum_{c=1}^{C} \alpha_c (1 - p_{i,c})^\gamma y_{i,c} \log(p_{i,c}) $$
思考: ESMM中是否能对ctcvr目标加权,会有什么问题?MMoE/PLE这类结构呢?
还有种思路解决样本稀疏问题——即全场景建模:
- 转化的label考虑全场景的转化,即当前场景曝光过,但是在其他场景转化的;
- 细分场景用主站场景的数据做迁移学习,比如淘宝细分场景用淘宝首猜的数据迁移学习。