论文阅读 (002): Classic CTR Prediction (GBDT+LR)

1,186 阅读6分钟

阅读论文:2014 Practical Lessons from Predicting Clicks on Ads at Facebook

背景

Facebook做的关于CTR预估的工作,和搜索广告不同,广告与查询无关,通过目标人群和兴趣估计CTR。

模型

模型通过GBDT来对特征进行编码,使用LR进行分类,模型结果如下所示

GBDT可以有效对特征进行编码,通过监督学习的方式,将特征向量转化为紧凑的01向量。实现方式如上图所示,第1棵子树有3个叶节点,第2棵子树有2个叶节点,在第1棵子树分类落在叶节点2,在第2棵子树分类落在叶节点1,则将特征编码为[0,1,0,1,0][0, 1, 0, 1, 0]

LR模型文中比较了SGD-based LR和BOPR(Bayesian online learning scheme for probit regression),并且后文对不同学习率的选取方式做了探究,本笔记在后面略过,不总结了。

将GBDT和LR结合使用时,两者是分开训练的,其中GBDT训练好后将特征编码后用于训练LR模型,所以GBDT更新后,LR一定需要更新。由于GBDT是串行进行训练的,无法做到实时在线更新,LR可以实时在线更新,文章工作也包括了LR模型更新。

模型实验

训练数据

文章使用一周的线上数据进行训练,将数据在线下划分后,再模拟线上流动的方式来训练。训练的标签为当前点击广告是否发生点击,即yi{1,+1}y_{i} \in\{-1,+1\}

模型评价指标

  1. NE(Normalized Entropy)

NE=1Ni=1n(1+yi2log(pi)+1yi2log(1pi))(plog(p)+(1p)log(1p))N E=\frac{-\frac{1}{N} \sum_{i=1}^{n}\left(\frac{1+y_{i}}{2} \log \left(p_{i}\right)+\frac{1-y_{i}}{2} \log \left(1-p_{i}\right)\right)}{-(p * \log (p)+(1-p) * \log (1-p))}

其中yiy_i为训练数据标签,pip_i模型输出点击率预估,pp为广告总体的点击率。NE值越小越好,分子部分为交叉熵损失函数,分母中考虑了p的大小,如果p接近0和1时,会放大NE值。这么做的原因是p接近0和1时,模型比较容易学习,通过分母考虑到总体点击率的大小,更好地进行评估模型学习的结果。

  1. calibration

calibration=averageestimatedCTRempiricalCTRcalibration = \frac{average estimated CTR}{empirical CTR}

calibration是一个重要的度量标准,因为准确和校准良好的CTR预测对在线竞标和拍卖的成功至关重要。距1越小,模型越好。

实验结果

实验结果如下所示,使用GBDT+LR比单独使用GBDT和LR在NE值上降低了3%以上。

模型实时训练

模型预测结果随着时间的关系如下所示,随着时间的推移,NE值逐渐上升,因此需要对模型进行实时训练更新。

由于GBDT无法并行化,并且数据量很大,GBDT模型无法在24小时内进行更新,因此只对LR模型进行实时的更新。模型实时更新的数据流逻辑如下所示

模块准实时的把来自不同数据流的数据整合起来形成sample features,并最终与click数据进行join,形成完整的labeled sample。文中提到了以下要点

  1. 在获取标签y时,设置waiting window大小,当超过waiting window未发生点击则y=0y=0,在waiting window内发生点击则y=1y=1。时间设置太小,导致样本CTR值比真实值更加偏低,时间设置太大,造成较大的延迟,因此需要对时间进行选择。最终样本CTR值一定比真实CTR值偏低。
  2. 在线对广告展示和广告点击执行分布式流到流的连接,使用请求ID作为连接的主要组件。每当用户在Facebook上执行一个操作时,都会生成一个请求ID,该操作会触发对他们所暴露的内容的刷新。Facebook还使用HashQueue缓存impressions,并和waiting window近配合使用。
  3. online data joiner的保护机制,监控线上数据点击率是否异常,异常时要停止训练,防止模型受到影响。

模型和数据分析

特征的重要性

特征的使用影响模型的精度和性能,使用太少特征必然模型精度较低,使用太多特征导致模型预估变慢,文章评价了不同特征的重要程度,重要程度如下所示

将特征按照重要程度从高到低进行排序后,横轴为特征使用数量,坐纵轴为特征绝对重要程度,右纵轴为特征累积重要程度。在评价特征重要程度时,文中使用Boosting Feature Importance,表示特征对loss降低的程度。

历史特征(Historical features)

文中比较两类特征的重要性,分别为历史特征和上下文特征。定义历史特征为广告或用户之前的互动,比如上周广告的点击率,或者用户的平均点击率,上下文特征为广告所处的上下文的当前信息,比如用户使用的设备或用户所在的当前页面。

比较结果如下

图表示按照特征重要性排序后,top k中历史特征占比,横轴为特征个数,纵轴为特征占比,可以看到历史特征很重要。文中给出的解释是历史数据对于广告冷启动十分重要,包含了一些历史的信息。

单独使用两者特征训练,实验结果如下

训练数据降采样

为了控制数据规模,需要对数据进行降采样,文中比较了两种降采样方式:uniform subsampling,negative down sampling。

uniform subsampling

对数据直接进行采样,采样率取{0.001,0.01,0.1,0.5,1}\{0.001,0.01,0.1,0.5,1\},实验结果如下所示

使用10%数据时,相对使用全部数据,仅仅损失了1%。

negative down sampling

仅仅对负样本进行采样,提高训练效率外,负采样还可以解决正负样本不均衡的问题,文中采样率为{0.1,0.01,0.001,0.0001}\{0.1,0.01,0.001,0.0001\},使用结果如下所示

在采样率为0.025时结果最好(有点费解),别人解读里面给出的猜测是

当负采样频率在0.025时,loss不仅优于更低的采样频率训练出来的模型,居然也优于负采样频率在0.1时训练出的模型,虽然原文没有作出进一步的解释,但推测最可能的原因是解决了数据不均衡问题带来的效果提升。

负采样会导致CTR预估值的漂移,比如真实CTR是0.1%,进行0.01的负采样之后,CTR将会提升到10%左右。而为了进行准确的竞价以及ROI预估等,CTR预估模型是要提供准确的有物理意义的CTR值的,因此在进行负采样后需要进行CTR的校正,使CTR模型的预估值的期望回到0.1%。校正的公式如下

q=pp+(1p)/wq=\frac{p}{p+(1-p) / w}

其中q为校正后CTR,p为模型预估CTR,w为采样率。

总结

全文使用GBDT对特征进行编码,感觉很有意思,可以后序看看特征编码方式有哪些。对于GBDT和LR模型更新的方式,本文将两者进行分离,对于工程实践有较大意义。文中也对特征选择方式,特征重要性,采样方式,采样率等多个方面进行实验,对于以后模型优化可以借鉴。

参考资料

  1. 回顾Facebook经典CTR预估模型
  2. 梯度提升树(GBDT)原理小结