文中提出的模型融合了决策树和逻辑回归 ,比单个方法效果好3%。并探索了多个基础参数对效果的影响。最重要的事情是使用正确的特征:即那些捕捉到用户或者广告历史信息的特征比其他类型的特征更有优势。一旦有了正确的特征和模型(决策树和逻辑回归),其他因素发挥的作用很小(即使是微小的提升在大规模下也会是很重要的)。更新数据、设置学习率和采样数据时选择最优的方法,也能稍微提升模型效果,虽然远比不上增加一个优质的特征或者选择一个合适的模型。
用户访问facebook的时候都会触发广告请求,而每次请求的候选广告特别多,所以facebook构建了一组计算成本逐级升高的级联分类器。本文专注于最后一个阶段的点击率预估模型
选择2013第四季度的某一个星期的数据作为训练数据。然后将这些数据分为训练集和测试集,用来模拟线上训练和预测的流式数据。文中所有实验都使用相同的训练集和测试集。
使用Normalized Entropy (NE) and calibration 作为主要的评估指标。
NE 更准确一点是Normalized CrossEntropy,等同与 the average log loss per impression divided by what the average log loss per impression would
be if a model predicted the background click through rate (CTR) for every impression
换句话说,即预估对数损失 使用 background CTR 的熵进行归一化。background CTR 是训练集的经验平均CTR值。将指标记为Normalized Logarithmic
Loss. 可能更能说明问题。值越低,模型的预测越好。 归一化的原因是 background CTR 离0或1 越近,越容易取得更低的对数损失。除以background CTR的熵可以令NE 对background CTR不那么敏感。 假设训练数据包含N个样本,标签 y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi∈{−1,+1},预估概率 p i , i = 1 , 2 , . . . , N p_i, i=1,2,...,N pi,i=1,2,...,N,平均经验CTR记为p
NE 实际上是计算Relative Information Gain (RIG)的一个组成部分,有如下关系:
R I G = 1 − N E RIG=1-NE RIG=1−NE
Calibration是平均预估ctr和经验ctr的比值。换句话说,就是期望的点击数和实际观测到的点击数的比值。
Calibration 是一个很重要的指标,因为准确的CTR预估和校准对线上出价和拍卖的成功至关重要。 校准和1的差距越小,模型越好。只在校准值比较显著的时候才报告校准值。
AUC 也是衡量排序质量(没有校准)的良好指标。在实际环境中,我们期望 预估是准确的,而不仅仅是为了得到最优的排序,避免潜在的underdelivery or overdelivery。NE 衡量预估的质量,隐式地反应校准。比如,如果模型预估值都是实际值的两倍,我们乘以一个系数0.5 来校准,对应的NE 会提升,但是AUC仍然保持不变。 Predictive model performance: Offline and online evaluations 对这些指标的分析比较深入。
模型结构如下:
在本节描述一个混合模型结构,梯度提升树和线性模型的连接。如图1所示。3.1节 说明决策树强大的特征转换能力,可以显著提高线性模型的准确度。3.2 说明 如何更新数据使得预估更准确。这两点激发了使用在线学习方法去训练分类器。3.3 对两类概率线性模型比较一系列在线学习变种。
文中的在线学习基于SGD进行优化,特征转换转换,一个广告展现表示成一个向量 x = ( e i 1 , . . . , e i n ) x=(e_{i_1},...,e_{i_n}) x=(ei1,...,ein), e i e_i ei是第i个单位向量, i 1 , . . . , i n i_1,...,i_n i1,...,in是n个离散输入特征的取值。在训练阶段,假设label y ∈ + 1 , − 1 y\in{+1, -1} y∈+1,−1表示点击和未点击。
给定一个标注的广告展现(x,y),权重的线性组合如下:
w是线性点击分数的权重向量
在Bayesian online learning scheme for probit regression (BOPR) 中, 似然和先验分别如下:
是标准正态分布的累积分布函数,N(t)是标准正态分布的概率密度函数。
在线训练是通过** expectation propagation with moment matching. ** 实现的。
结果模型包含权重向量w的近似后验分布的均值和方差。 BOPR 算法的推断是计算p(w|y,x), 并将之映射回p(w)最近的 高斯近似。所以更新算法可以只通过x的非零维度的 均值和方差的更新公式来表示。
v和w分别是 和
推理可以看做对均值和方差向量应用SGD。
作者将BOPR和似然函数的SGD进行比较。
结果算法即逻辑回归。推理则是计算似然函数的梯度,然后在梯度方向走一个维度相关的步长(6)
(3) 可以看做对均值向量 μ \mu μ 进行per-coordinate 梯度下降,步长 通过belief uncertainty σ \sigma σ 自动控制。 基于SGD 的LR 和BOPR在应用到训练数据时都是流式学习的。
有两种方式可以转换线性分类器的特征,对于连续特征,学习非线性变换的一个简单的trick就是进行分桶,并将桶编码作为离散特征(bin the feature and treat the bin in- dex as a categorical feature)。线性分类器为特征学习每个bin的权重。学习bin的边界很重要。
第二个简单且有效的变换是构建元组输入特征。对于离散特征,暴力方式是计算笛卡尔积。不是所有组合都有效,没有用的可以去掉。 如果输入特征是连续特征,那么可以使用k-d树来做联合分桶。(没太懂)
我们发现梯度提升树是一种非常强大而方便的完成刚才说的第二种特征转换的方法。
我们将每颗单独的树作为离散特征,它把一个样本最终落到的叶子节点的下标作为特征值。** the index of the leaf an instance ends up falling in.** 这种特征我们使用one-hot编码。比如,考虑图1中包含2颗子树的决策树,第一棵有3个叶子,第2棵有2个叶子。如果一个样本在第一棵子树中分到了叶子2,第二棵树分到了叶子1, 那么线性分类器的输入就变成了[0,1,0,1,0] ,其中前3个元素对应第一棵树的叶子,剩下两个对应第二棵树的叶子。提升树 我们使用GBM, 具体使用L2-TreeBoost算法。每次迭代中产生一个新树,对前面的树的残差进行建模。 我们可以将基于基于提升树的特征变换看做一种有监督的特征编码, 将实数特征向量转换成 二值特征向量。 从根节点到叶子节点的遍历代码某些特征的规则。 在这个结果向量上拟合线性分类器可以学习到这些规则集合的权重。 提升树进行批训练。
我们通过实验来证明这种特征作为线性模型的输入的效果。实验中我们比较了两种LR模型,一个是使用树特征变换,一种是使用原始二者。同时,使用一个提升树模型作为对比。结果如下:
与不使用树变换的模型相比 基于树的特征变换可以将NE 降低3.4%。 这个提示非常大。 作为参考, 常见的特征工程实验 只能提升几个千分点。
同时可以看到,LR和树模型 单独使用时 预测准确度差不多,LR稍好, 但是他们的结合却提升了很多。
点击预估系统中数据分布时刻在变,作者研究了训练数据的更新对预测效果的影响。 具体做法是 在某天训练一个模型并在以后每天用它来预测。我们分别使用GBM和GBM+LR来进行。
实验中,我们使用一天的数据进行训练,然后在接下来的6天上进行评估,计算每天的NE。结论入下图:
随着训练集和测试集之间的时间差越多,两个模型的预测精度都有明显下降。 对两个模型都可以观察到,将训练从周级别改为天级别时 NE 可以下降约1%。
这些发现表明需要天级别训练。 一种选择是 天级别的任务重新训练模型, 重新训练提升树的时间和很多因素有关,比如样本量,树的数目,叶子的数目,cpu,内存等。 使用一个单核cpu 从上亿样本 中训练一个 包含上百棵树的提升树模型可能会超过24小时。 在实践中,训练可以在一个多核且内存足以放下整个训练集 的机器上通过足够并发 在数小时内完成。 下一部分我们考虑一种替代方案。 提升树可以每天或每几天训练, 但是线性模型使用一些在线学习的方式实现接近实时的训练。
为了最大化 数据新鲜度, 一种选择是在线训练线性模型, 即标注 广告展现生成的时候就训练。 在第4部分 会描述 生成实时训练数据的框架, 本节评估 基于SGD 的LR 在线学习中设置学习率的几种方式。 然后比较BOPR 模型的在线学习的最好的几个变种。
基于6, 探索了如下几种学习率:
1.每个维度不同的学习率:
第t次迭代 特征i的学习率如下:
α , β \alpha, \beta α,β是可调参数
这是在Ad click prediction: a view from the trenches. 中提出的方法
2.Per-weight square root learning rate:
n + t , i n+{t,i } n+t,i 是第t次迭代 有第i个特征的所有样本数。
3.Per-weight learning rate
5.Constant learning rate
前3种每个特征学习一个学习率, 最后两个所有特征使用相同的学习率。 所有超参数通过网格搜索进行调优。结果如表2:
我们每次将lr 调低0.00001 。 用上面的学习率方法 在相同的数据集上训练和测试LR模型。 实验结果如下
可以看出per-coordinate 方法预测最准,比效果最差的per weight 学习率 的NE 低了5%.这和Ad click prediction: a view from the trenches. 的结论是一致的。
使用per-weight 平方根 方法和常数 学习率 效果差不多,NE 略差一些。 Global 方法 失败的主要原因是每个特征 下面的训练样本数不均衡因为每个训练样本包含的特征数目不同, 一些常见的特征的样本数更多。在这种全局lr机制下, 数量更少的特征的学习率下降太快, 阻止收敛到最优参数。 虽然 per-weight 方法解决了这个问题, 但是因为他把所有特征的学习率下降太快了所以仍然失败。 训练结束太快,此时模型只能收敛到次优点。这也解释了这种机制表现最差的原因。
有意思的是, (3)中BOPR更新均值的公式和LR 的SGD 的per-coordinate 方法非常像。 **The effective learning rate for BOPR is specific to each coordinate, and depends on the posterior variance of the weight associated to each individual coordinate, as well as the “surprise” of label given what the model would have predicted **
我们将per-coordinate 方法和BOPR 对比, 我们使用相同的数据训练LR和BOPR模型,并在下一天的数据上进行测试。结果如下:
大家也许会猜测,考虑到更新公式这么像, BOPR 和使用per-coordinate 学习率进行SGD更新的LR 的NE 和校准可能会很相近。
LR相比BOPR的一个优势是模型大小是后者的一半,考虑到每个稀疏特征只有一个权重,而不是一个均值和方差。 根据事先, 模型越小 cache 越好, cache的查询越快。 从预测阶段的计算开销来说, LR 只需要一个特征向量和权重向量的内积, 而BOPR 需要方差向量、均值向量和特征向量都做内积。
BOPR 相比LR的优势之一是在贝叶斯体系下提供了点击概率的预测分布, 可以用来计算预测分布的分位点, 可以用来做explore/exploit learning schemes 。
本节介绍生成实时训练数据的实现系统, 这些数据用来通过在线学习训练线性模型。
我们称之为online joiner, 因为最重要的操作是 将标签和输入(曝光)以在线的方法连接在一起。 相似的架构比如google 广告系统 用来做流式学习。 online joiner 将实时训练数据输出给Scribe 。由于负例不好定义,所以,如果用户在看到广告后的一个固定且足够长的时间段内没有点击, 则认为该次曝光是没有点击的。 等待的时间窗口需要仔细调整。太长则耽误实时日志生成, 增加了在等待点击标签过程中缓存曝光需要的内存, 太短 则会丢失一些点击, 因为对应的曝光可能已经流失了起被标记为未点击。 则会影响点击覆盖率, 即点击和曝光成功join在一起的比例。 所以, online joiner 需要在实时和覆盖率做权衡。
点击覆盖率没有达到100% 意味着 实时训练集是有偏的, 经验ctr 比实际情况要低。因为一部分被标注为未点击的曝光其实是应该标记为点击的。 在实践中发现 只要等待窗口让内存在可控的范围内 我们很容易将bias 降低到千分位。 另外, 这个bias 可以测量和修正。 更多窗口大小和效果可以参考Processing sliding window multi-joins in continuous queries over data streams。 The online joiner is designed to perform a distributed stream-to-stream join on ad impressions and ad clicks uti- lizing a request ID as the primary component of the join predicate 请求id 在用户每完成一个刷新内容的动作时生成。 online joiner 接下来的在线学习的数据和模型流如图所示:
最开始 用户访问facebook 时 数据流产生,生成 向ranker 请求广告的请求。 广告返回给用户设备, 同时每个广告和对应的在这次排序中使用的特征 都被加到曝光流中。 如果用户点击广告, 那么 这个点击加入到点击流中。 为了实现流之间的join, 系统利用包含FIFO 队列的HashQueue作为缓存窗口,同时使用 一个hash map 来快速标注一个展现。 HashQueue 对kv 对有三种操作: enqueue, dequeue, lookup。 比如,进队列时,我们将item 加入到队列的前面, 并在hash map中生成一个key, value 指向 item 在queue中的位置。 只有在窗口期满后 标注的曝光才会释放给训练数据流。 如果没有点击, 则被作为一个未点击的样本。
在实验设置中,trainer 不停从训练流中学习, 并定期将新模型推送给Ranker, 最终形成一个闭环 , 特征分布变化后, 模型可以捕捉,学习并在很短的时间内进行修正。
在使用实时训练数据进行实验时一个重要的考虑是需要对异常情况建立保护机制。
一条
比如, 点击流因为基础架构问题 变得陈旧了,online joiner 可能会生成 经验ctr 非常低的训练数据, 结果就是实时trainer 的预估值很低,甚至接近0. 最终可能会导致广告曝光减少。 异常检测机制可能会有所帮助。 比如 实时训练数据的分布发生剧变的时候, 系统自动和online trainer 断开。
树越多模型预估时间越长。树的数目对预估效果的影响。
树的数目从1到2000 , 在一天的数据上进行训练, 使用接下来的一天数据进行测试。 限制每个树 不能超过12个叶子。 和之前的实验一样, 使用NE作为评估指标。结果如下:
可以看到,提高 树的数目 可以降低NE。 但是增加树的数目的收益会逐渐消失。 几乎所有的NE 降低都来自于前500颗树, 最后的1000棵树仅把NE降低了0.1%。 另外, 子模型2 在1000棵树之后效果开始变差。 原因是过拟合 因为模型2的训练数据是0和1的1/4.
特征数目是另外一个影响模型效果和计算开销的指标。 为了更好的理解特征数目的影响作者给每个特征赋予一个重要性。
为了测量特征的重要性,使用statistic Boosting Feature Importance。 它可以捕捉由该特征带来的累积损失下降。 每个树节点在构建时,都会选一个最好的特征 来最大化地降低平方损失。 因为一个特征在多个树中都被用到,每个特征的Boosting Feature Importance 就是将所有树中该特征减少的平方损失的总和。
通常, 一小部分特征 共享了大部分的可解释性, 剩余的特征共享其余的部分。 我们在 特征数目和他们的累积特征重要性的关系 图中有可以看到这一点。
从上述结果可以看到 最高的10个特征贡献了大约一半的特征重要性, 最后300 个特征总共贡献不到1%。 基于此, 我们只保留最高的10、20、50、100和200个特征进行实验。评估对效果的影响。结果如下:
从图中可以看出, 随着特征越来越多,NE 也有类似的下降消失的现象。
杰西莱, 我们研究历史和上下文特征的作用。 我们不能透露我们实际使用的特征细节。一些上下文特征包括当地时间, day of week 等。 历史特征包含广告上的累积点击数等。
提升树中使用的特征可以分为两类,上下文特征和历史特征。 上下文特征的值只依赖于最近广告展现的上下文相关的信息,比如用户使用的设备或者用户所在的页面。 相反,历史特征依赖于 广告或者用户的历史交互, 比如 上周该广告的点击率 或者用户的平均点击率。
该部分我们研究这两类特征如何影响系统性能。 首先我们检查两类特征的相对重要性。 我们把所有特征按重要性排序, 然后计算前k个重要特征 中历史特征的比例。 结果如下:
可以看出, 历史特征比上下文特征提供了更多的解释性。 前10个特征都是历史特征, 前20个特征只有两个上下文特征,虽然历史特征共占总特征的75%。To better understand the comparative value of the features from each type in aggregate we train two Boost- ing models with only contextual features and only historical features, 结果如下:
从表中可以验证总得来说,历史特征比上下文特征作用更大。没有任何上下文特征时,我们的loss 下降了4.5%。相反,没有上下文特征,我们的预测精度只下降了1%。(没看到!!)
上下文特征对处理冷启动问题很重要。对于新的模型和用户, 上下文特征对于合理的ctr预估来说是不可缺少。
在下一步,我们对只使用历史特征或者上下文特征训练得到的模型进行连续一周的测试,检查特征对数据新鲜度的依赖。结果如下:
从图中可以看出, 带有上下文的特征比历史特征更依赖数据新鲜程度。和直觉一致, 因为历史特征可以描述用户长期积累的行为, 比上下文特征更稳定。
facebook 一天的训练数据太多, 常见的控制训练成本的方法是降低训练数据大小。 本节评估两种降采样的方法, uniform subsampling and negative down sampling。 每种方法 我们训练一系列包含600个树的树模型 , 使用calibration 和NE 来评估 模型。
该方法 易于实现,且模型在 采样过的训练数据和没采过样的测试数据上的用法都是一样的。 这里, 我们评估一系列指数增长的降采样率。 每个采样率我们使用训练一个模型。 采样率分别是{0.001, 0.01, 0.1, 0.5, 1 }
结果如下:
和我们的直觉一致, 数据越多效果越好。另外,从预测准确度来讲, 数据量大小也有收益逐渐消失的现象。 只使用10%的数据, NE 只比使用全部训练集 下降1%。 calibration 在这个采样率下没有下降。
类别不平衡 对模型效果影响很大。 这里我们研究负采样率 来解决这个问题。 我们尝试了不同的负采样率, 包括{0.1, 0.01, 0.001, 0.0001 } , 结果如下:
可以看出负采样率对效果的巨大影响。 效果最好的负采样率是0.025.
负降采样可以提高训练速度和模型效果, 但是如果训练时使用负降采样的话,预测时需要校准预估值。比如,采样前ctr均值为0.1%, 我们进行0.01 负降采样, 经验ctr值变成大约10%。 线上流量我们需要重新校准,得到0.1% 左右的预估值。
p 是降采样之后的预估值,w是降采样率。
1.Data freshness matters.
天级别retrain 是值得的, 我们讨论了不同的在线学习方法。同时论述了生成实时训练数据的架构。
2.使用决策树对实数值特征 进行转换可以大幅度提高线性模型的预估准确度。
3.最好的在线学习方法:LR 使用per-coordinate学习率,效果和BOPR差不多。
Class imbalance has been studied by many researchers and has been shown to have significant impact on the perfor- mance of the learned model. In this part, we investigate the use of negative down sampling to solve the class imbalance problem. We empirically experiment with different negative down sampling rate to test the prediction accuracy of the learned model. We vary the rate in {0.1, 0.01, 0.001, 0.0001}. The experiment result is shown in Figure 11.
From the result, we can see that the negative down sam- pling rate has significant effect on the performance of the trained model. The best performance is achieved with neg- ative down sampling rate set to 0.025.
more data leads to better per- formance. Moreover, the data volume demonstrates dimin- ishing return in terms of prediction accuracy. By using only 10% of the data, the normalized entropy is only a 1% reduc- tion in performance relative to the entire training data set. The calibration at this sampling rate shows no performance reduction.
参考:
1.http://blog.crackcell.com/posts/2018/03/18/paper_note_facebook_gbdt_lr.html
2.http://d0evi1.com/facebook-ad/