cvr 预估中的转化延迟反馈问题概述

cvr 预估中的转化延迟反馈问题概述

先安利两篇比较有代表性的文章:
Modeling Delayed Feedback in Display Advertising 这篇主要思路是将延迟反馈问题的延迟建模成一个指数分布,然后和cvr一起进行学习。感觉应该算是首次在cvr领域对延迟反馈建模(或者建模比较好的)的论文了,非常推荐一看。A Nonparametric Delayed Feedback Model for Conversion Rate Prediction这篇更进一步,认为延迟的反馈分布可能和广告/用户/上下文都有关系,因此对延迟反馈的时间建模成一个可以学习的模型,和第一篇一样的方式与cvr进行联合建模。

转化率对计算广告的重要性是众所周知的,而o系广告计费方式更是对转化率预估的准确性提出了新的要求。相对于cpc计费方式,ocpc,ocpm,ocpa等方式因为更加注重“转化”,因此更受广告主的欢迎,未来也将是计算广告行业的主流实现形式。

而o系的计费方式中一个重要的公式就是ecpm的计算:ecpm = bid * pctr * pcvr。将pctr和pcvr分开计算有两点好处:不需要join长期的转化从而减轻pipeline的负载(因为最多只需要join点击的数据);对转化少或者没有转化的数据预估会更准确,因为这时候pctr也能提供一部分信息。

评估广告投放效果的重要指标:转化率(conversion rate) —– 在广告网站上采取行动的人占总浏览人数的比例。使用机器学习预估 conversion rate,从而预估收益。

然而与点击行为可能在用户浏览后的很短时间内就发生并被广告系统收集不同,广告后续所产生的转化conversion很可能延时发生(更可能是通过不同的方式延迟上传的,如需要广告主回传的深度转化行为),比如看过一个商品广告,当时有些心动但并没有马上去买,过了几天按捺不住又去购买(Delayed Feedback),给建模带来困难。转化延迟的时间视具体平台和环境而异,有的可能有上月的延迟。

广告不是一个静态过程,当心的计划加入系统后,以历史数据建立的旧的模型在这些新的计划上的表现可能不好,因此保持模型的更新对于广告保持性能至关重要。因此解决转化延迟的问题也成为提高广告系统性能的一个有效方式。

转化行为反馈时间上的延迟会对模型的训练产生负向的影响,一个简单的做法可能是通过一个预先设定好的时间窗口来进行转化归因,使用经过了时间窗口并进行了归因后的数据来进行转化率模型的更新。但是这对时间窗口的选择带来了挑战,并且可能因为单一时间窗口带来调试上的不灵活:

  1. 如果时间窗口太短,一些样本将被错误的标记成负样本,但是未来将完成转化,从而学习到了错误的标签;
  2. 如果时间窗口过长的话,训练集的样本就可能向匹配时间窗口一样陈旧,因此可能有产生一个过时的模型的风险;过时的模型显然不适合快速变化的广告候选以及用户行为模式的变动

一些其他的方法来区分正样本和未标记样本的方法已经被研究过了,但是这些方法依赖于假设:标记为正的样本是从正样本类别中随机产生的,也就是说丢失标签为正的样本概率为常数。这对于刚刚发生点击行为的样本来说,假设可能不成立,而且对于点击发生后的不同时段,转化完成的概率也应当是不同的。

第一篇论文 Modeling Delayed Feedback in Display Advertising,提出的解决方式不包含固定的匹配窗口:当产生训练集的时候,对一个点击后的样本,当跟着一个转化的时候将被标记成正样本,否则将被标记成 unlabeled(这不能直接标记为负样本,因为接下来也可能产生转化)。

这篇论文提出了一个模型用来预估是否转化,另一个模型来捕获点击到转化的期望延迟时间的解决方案。这一模型和存活时间分析中使用的模型有很大相关性。类似的,对转化问题来说,一些延迟是censored(经过审查的),当在训练时候转化还没发生,而后续如果有转化的话,转化的延迟至少是从点击开始的时间

这一建模以及问题的性质与survival time analysis的问题很相似,在未观测到最终结果的时候,从观测点开始到最终结果之间的期望时间至少是观测所经过的时间。但是和survival time analysis 中一个病人最后一定会死不一样,用户最后可能并不能发生转化。这就是需要两个模型的原因:一个用来预测用户是否会发生转化,另一个用来预测用户发生转化的情况下的延迟时间。两个模型同时训练(jointly)。事实上也不能将两个模型分开:当一个转化没发生时候,是将来会转化还是将不会转化是模糊不清的。这两个模型同时准确预估两个输出的概率,通过两个模型来建模转化与转化需要的期望时间。

根据以上的描述,论文中的建模主要包含以下几个变量:

下面附上第二篇论文中的变量说明,其基本变量和第一篇中的变量定义基本一致,增加的是部分模型参数,这个和其升级点有关,后续会说明。


由前面的分析知道:

  1. 当Y=1(已经发生了转化)的时候,C=1(用户最终发生了转化);
  2. 当Y=0(转化还没发生)的时候,或者C=0(用户最终不会发生转化),或者E<D(用户的最终转化反馈还没到来)。

该论文中的推导的仅有的独立假设是:(C, D)组合在给定X的情况下是独立于E的。 Pr(C,D∣X,E)=Pr(C,D∣X)。这一独立假设成立的原因是E点击后经过的时间只会影响Y。

观测到的变量,或者说下面用到的训练数据的形式是:

  1. 当y=0时候,(x, y, e);
  2. 当y=1时候,(x, y, e, d)

插一个对survival analysis的说明(摘自第二篇):
给定一随机变量T>0表示一个事件发生的时间,定义f(t)为T的概率密度,F(t)是累积分布函数(对f在0到t上的积分),事件直到事件t还没发生的概率由survival function给出:s(t) = 1 - F(t),那么事件还没发生的比率由一个叫hazard function的h(t)给出,其关系:h(t) = f(t) / s(t)。由这个定义,survival function可以由h(t)推导出:s(t) = exp(- \int_0^t {h(x)} dx) 。

回到第一篇论文,论文提出的解决方法是两个模型同时训练的方式:

  1. 转化率模型采用一个标准的逻辑回归(目测也可以用别的方式)
  2. 预估转化延迟采用的是指数分布形式,文中提到其他的分布也可以,但是指数分布是一个常用且有效的拟合经验延迟分布的分布

逻辑回归和指数分布的形式:

其中需要 λ(x)>0,因此文中设置 λ(x)=exp(w x) 是特征的一个指数形式,然后用参数w去拟合。

总结起来就是:

当然,延迟的分布拟合在实际应用中不一定被抛弃,还有别的用处,这里先不细说,只描述基本的join训练的思路。

模型建立好后,就需要讨论优化方式了,文中提供了先EM和直接梯度下降两种方式,具体其实也用了梯度下降的方式。现在深度学习工具包都是自动求梯度了,因此考虑到工程实现等方便性,实际应用肯定首选gd类优化方法。具体推导摘录如下(实际可能实现时候是使用tensorflow等,并不需要手推,这里也没再细看了):

感觉第二篇论文的思路也是沿着第一篇论文,将是否转化和期望的转化时间进行分开为两个模型,并同时进行优化训练来建模的了。

第二篇论文的主要改进点是针对如下的考虑的:实际中,并不能保证延迟时间是服从指数分布的,表示延迟的最佳分布取决于数据。而且每个广告,不同上下文,不同的用户的延迟时间的期望分布的形态也应该是不一样的,因此第二篇将期望延迟时间的表示形式进行了模型化,感觉向着“神经网络化”更近了一步,建模的期望大概是可以通过参数的形式拟合不同数据以及业务,不同广告等的不同的期望分布形态。因此感觉和神经网络的“万能近似”定理的期望差不多了。

第二篇中将时间轴分成L份,建立L个虚拟的时间片,然后用到了上文提到的hazard function并且应用了一部分的KDE的思想,并且引入了核函数对期望的延迟时间进行建模:

其中,k是kernel function 核函数返回正值。直观上,核函数的值表示了时间轴上的两个点的相似程度。文中考虑用可以积分出表达式的核函数来建模(大概后续预估的时候好计算吧,感觉如果用神经网络的话,做累加也是可以的吧)。

具体后续的推导思路和第一篇感觉很相似,这里不再赘述了,其中显示的根据Y的值将集合分成两部分的方式值得注意一下,另外前面选的核函数是可积分成显式的表达式的,因此对推导也有一定的简化。后续优化方式用的是EM,感觉也可以用梯度下降直接优化。

总结:

两篇论文都是使用两个模型(cvr和转化期望时间)来进行的,因此思路上都可以借鉴。实际预估转化的时候,可以将转化的期望时间同时建模来试一下效果。
另外感觉multitask或者类似的模型在特定场合还是挺有用的,其他如pctr和pcvr同时训练的如ESMM等,算是解决问题的一个好思路吧。

另外欢迎关注我的微信 订阅号:

如有不当之处,欢迎指正。

发布于 2019-07-21

文章被以下专栏收录