作者 | 梁唐

来源 | TechFlow(ID:techflow2019)

头图 |  CSDN 下载自东方IC

今天我们来剖析一篇经典的论文:Practial Lessons from Predicting Clicks on Ads at Facebook。从这篇paper的名称当中我们可以看得出来,这篇paper的作者是 Facebook 的广告团队。这是一篇将 GBDT 与 LR 模型结合应用在广告点击率预测的方法,虽然距今已经有好几年了,但是文中的方法仍然没有完全过时,至今依然有一些小公司还在使用。

这篇 paper 非常非常经典,可以说是推荐、广告领域必读的文章,说是业内的常识也不为过。这篇文章的质量很高,内容也比较基础,非常适合作为大家的入门 paper。

本文有点长,建议先马后看。

简介

paper 开头的部分简单介绍了一下当时互联网行业当中广告的地位以及当时 Facebook 的规模,当时 Facebook 有着7.5亿的日活(日活跃用户 daily active users ),超过一百万有效的广告商,因此对于 Facebook 来说选择合适有效的广告投放给用户的重要性是非常巨大的。在此基础上引出了 Facebook 的创新性做法,即将 GBDT 与逻辑回归模型进行组合,在真实的数据场景当中获得了超过3%的收益。

在2007年的时候 Google 和 Yahoo 就提出了在线竞价的广告收费机制,但是 Facebook 和搜索引擎的场景不一样,在搜索引擎的场景当中,用户会有明确的搜索意图。引擎会先根据用户的搜索意图去筛选广告,所以候选的广告集不会很大。但是 Facebook 不存在这样的强意图信息,所以 Facebook 候选的广告数量要大得多,因此对于系统的压力以及要求也要更高。

但是本文(paper)并不会讨论系统相关的内容,仅仅关注最后一部分排序模型的做法。虽然 paper 里没说,但是我们看得出来,Google 和 Yahoo 这类搜索引擎当中的广告是搜索广告,而 Facebook 当中的这些广告是推荐广告。后者和前者最大的区别就是召回广告的逻辑不一样,有点类似于推荐系统和搜索系统的区别。

这其中的核心是用户意图,虽然用户登录 Facebook 的时候没有强意图,但是根据用户之前的浏览行为以及习惯,我们是可以提取出一些弱意图的。比如用户在哪类商品上停留的时间最长,点击什么样的内容的次数最多,还有类似协同过滤的把用户的行为抽象成向量的做法。其实这里面的内容很多,也非常有价值,可见 Facebook 在写论文的时候是留了一手的。

具体做法

说完了废话我们来看具体的做法,具体的做法很多同学可能都有所耳闻也就是 GBDT+LR 的做法。说起来一句话好像就说完了,但是里面的细节很多。比如为什么要用 GBDT,为什么 GBDT 能够起作用?这里面生效的机制是什么?paper里写的内容只是表面,这些细节的思考和分析才是关键。因为paper里的做法并不是普适的,但是其中蕴含的道理往往是通用的。

首先来说说模型评估,paper 当中提供了两种新的评估模型的方法。一种是 Normalized Entropy,另外一种是 Calibration。我们先从模型评估说起。

1、Normalized Entropy

这个指标在实际场景当中算是蛮常用的,经常在各种大神的代码和 paper 当中看到。直译过来是归一化熵的意思,意思有点变了,可以理解成归一化之后的交叉熵。它是由样本的交叉熵均值和背景 CTR 的交叉熵的比值计算得到的。

背景 CTR 指的是训练样本集样本的经验 CTR,可以理解成平均的点击率。但是这里要注意,不是正负样本的比例。因为我们在训练模型之前都会做采样,比如按照正负样本比1:3采样,这里的背景 CTR 应该定为采样之前的比例。我们假设这个比例是 p,那么我们可以写出 NE 的公式:

这里的取值是,也就是点击是+1,没有点击是-1。这个是 paper 里面的公式,在实际应用当中,我们一般把 click 写成1,impression(没有click)写成是0。

2、Calibration

Calibration 翻译过来是校准刻度的意思,但是这里我觉得应该理解成和基准线的偏差。这个指标是模型预测的平均 CTR 和背景 CTR 的比值,这个比值越接近1,说明我们的模型的基准偏差越小,越接近真实的情况。

这个公式可以写成:

3、AUC

AUC 是老生常谈了,也是我们工业界最常用的指标,几乎没有之一。AUC 我们在之前的文章当中介绍过,它表示的 Aera-Under-ROC,也就是 ROC 曲线围成的面积。ROC 曲线是TPR(true postive rate)和FPR(false positive rate)组成的曲线。这个曲线面积越大表明模型区分正负样本的能力越强,在 CTR 排序场景当中,其实模型能否预测准确并不是最重要的,把正样本筛选出来的能力才是最重要的,这也是 AUC 如此重要的原因。

但是 AUC 也不是没有缺点,paper 当中列举了一个缺点。比如说假如我们把模型预测的 CTR 全部x2,然后再给所有的预测结果乘上0.5来校准,这样 AUC 依然不会有变化。但是如果我们看NE的话,会发现 NE 上升了。

4、组合模型

终于到了重头戏了,虽然这篇 paper 当中讲了很多其他方面的内容,但是我们都知道 GBDT+LR 才是它的重点。GBDT 和 LR 我们都很熟悉,但是它们两个怎么 combine 在一起呢?

其实这个问题本身就是错的,所谓 GBDT+LR 并不是两个模型的结合,而是一种特征的转化。也就是说这个问题我们需要从特征的角度去思考而不是从模型。

paper 当中先讲了两种常用的处理特征的方法,第一种是叫做 bin,也就是分桶的意思。比如说收入,这是一个连续性特征。如果我们把它放入模型,模型学到的就是它的一个权重,也就说它是线性起作用的。然而在实际的场景当中,可能这完全不是线性的。比如有钱人喜欢的品牌和穷人可能完全不同,我们希望模型能够学到非线性的效果。一种比较好的办法就是人为将这个特征进行分桶,比如根据收入分成年收入3万以下的,3万到10万的,10万到50万的,和50万以上的。落到哪个桶里,哪个桶的值标为1,否则标为0。

第二种方法叫做特征组合,这个也很好理解,比如性别是一个类别,是否是高收入群体是个类别。那我们排列组合一下,就可以得到男_低收入,男_高收入,女_低收入和女_高收入这四个类别。如果是连续性特征,可以使用像是 kd-tree 这类的数据结构进行离散化。我们把类别特征两两交叉就可以得到更多的特征,但这些特征并不一定都是有用的,有些可能没用,还有些可能有用但是数据很稀疏。所以虽然这样可以产生大量特征,但是需要一一手动筛选,很多是无效的

由于手动筛选特征的工作量实在是太大,收益也不高,所以工程师就开始思考一个问题:有没有办法可以自动筛选特征呢?现在我们都知道可以让神经网络来做自动的特征交叉和筛选,但是当时神经网络还没有兴起,所以还是只能手动进行。为了解决这个问题,当时的工程师们想到了 GBDT。

这才是会有 GBDT+LR 的原因,我们来看这张图:

我们来简单回顾一下 GBDT 的模型,首先 GBDT 是由多棵树组成的森林模型。对于每一个样本,它在预测的时候都会落到每一棵子树的其中一个叶子节点上。这样我们就可以使用 GBDT 来进行特征的映射,我们来看个例子:

在上图这个例子当中,GBDT 一共有3棵子树,第一棵子树有3个叶子节点。我们的样本落到了第一个,所以第一棵子树对应的 one-hot 结果是[1, 0, 0],第二棵子树也有3个节点,样本落到了第二个节点当中,所以 one-hot 的结果是[0, 1, 0],同理可以得到第三棵子树的结果是[0, 0, 1, 0]。

这样我们最后把这些树的向量合并在一起,就得到了一个新的向量:[1, 0, 0, 0, 1, 0, 0, 0, 1, 0],这个向量就是我们 LR 模型的输入

我们来分析一下细节,首先明确一点,GBDT 只是用来进行了特征转化和处理,它的预测结果并不重要。通过使用 GBDT 我们同时完成了刚才提到的两种操作,既把连续性特征转换成了离散型特征,也自动完成了特征的交叉。因为对于每一棵子树而言,其实本质上是一棵 CART 算法实现的决策树,也就是说从树根到叶子节点的链路代表了一种潜在的规则。所以我们可以近似看成使用了 GBDT 代替人工进行了规则的提取以及特征的处理。

结果

最后我们来看下结果,原 paper 当中进行了分别进行了三组实验,分别是仅有 LR、仅有 GBDT 和 GBDT+LR 进行对比。衡量的标准是各自的 NE,以 NE 最大的 Trees-only 作为参考,可以发现 GBDT+LR 组的 NE 下降了3.4%。

我们贴上 paper 当中的结果:

怎么说呢,这个结果挺取巧的,因为对比的是NE,也就是说交叉熵下降了。但是 AUC 的情况不知道,paper 当中没有说。并且这个下降是以 NE 最大的结果作为参考的,有一点点人为夸大了的感觉。当然这也是 paper 的常用手段,我们心里有数就好。

数据的实时性

除了模型和特征的创新之外,这篇 paper 还探讨了数据时效性的作用。

为了验证数据新鲜程度和模型表现之间的关系,paper 选择了一条的数据用来训练了 trees-only 和 GBDT+LR 这两个模型,然后用这两个模型分别去预测之后1天到6天的数据,将整体的情况绘制成图表:

在这张图当中,横轴是预测数据距离训练数据的天数,纵轴是模型的NE。NE越低表示模型的效果越好,从上图我们可以发现第六天的结果和第0天的NE要相差大约1%。这也就意味着单纯是维持数据的新鲜度,我们就可以获得1%的提升。这也是为什么各大公司要做 online-learning 的原因。

online learning

在接下来的内容当中,paper 还为我们介绍了一些 online learning 的细节性问题。其中有一些已经过时了,或者是普适性不强,我挑选了几个比较典型的有代表性的列举一下。

1、时间窗口

在我们搜集训练数据的过程当中,点击是比较明确的,因为点击有一个具体的行为,但是 impression(曝光)不是。因为用户没点击这并不是一个行为,所以我们没办法确定用户到底是不想点还是等一会再点。比较常规的做法是维护一个定时窗口,规定一个时间,如果用户看到了广告在规定时间内没有点击,那么就认为这是一个非点击事件。

但是我们很容易发现,这么做是有问题的,因为用户可能反应迟钝,或者是暂时还没反应过来导致没有点击。就可能出现时间已经过了,用户点击了的情况。在这种情况下 impression 已经被记录为一个负样本了,那么点击产生的正样本就找不到对应的 impression 了。我们可以计算一个比例,有多少点击可以找得到 impression,这个比例称为 click coverage,点击率的覆盖率。

那是不是窗口时间越长越好呢?其实也不是,因为窗口过长可能会导致把一些不是点击的认为是点击。举个例子,比如说一个商品,用户第一次浏览的时候觉得不满意,所以没有点。过了一会,用户回过来看的时候又改变了主意,发生了点击。那么按照道理,我们应该把第一次没有点的行为视作是负样本,把第二次的行为认为是正样本。如果我们时间窗口设置得很长,就会被认为是一个点击样本。所以时间窗口到底应该设置得多长,这是需要调整的一个参数,不可以拍脑袋决定。

2、架构

streaming 是业内常用的一种数据处理手段,称为流式处理。可以简单理解成队列,也就是 queue。但是当发生click的时候我们需要找到对应的 impression 样本,将它改成正样本,所以我们还需要查找的功能。也就是说我们还需要一个 hashmap 来记录队列当中的节点。

当我们搜集到了足够数据,或者是搜集了规定时间的样本数据之后,我们会把窗口内的数据用来训练模型。当模型完成训练之后,会被推送到排序系统当中,实时更新排序需要调用的模型文件,从而达到在线实时训练的目的。我们来看下它的架构图:

Ranker 是排序系统,对候选的广告进行排序之后展示给用户,并且将这些广告的特征数据 push 给 online joiner,也就是特征处理系统。当用户对广告进行点击之后,点击的数据也会被传入 Joiner 当中。Joiner 会将用户的点击数据和 Ranker 传输来的数据进行关联,关联之后把数据传给 Trainer 系统进行模型的训练。

这里还涉及到一个细节,就是在 joiner 当中我们怎么关联呢?因为一个用户可能会有多次观看广告的数据,同一个广告也可能刷新观看多次。所以直接拿用户 id 或者是广告的 id 进行关联是不行的,我们还需要一个和时间有关的 id。这个 id 叫做 requestid,当用户每次刷新页面的时候,requestid 都会刷新,这样我们就可以保证即使用户刷新网页,我们也可以正确地将数据关联上。

特征分析

最后,paper 当中还附上了对特征的一些分析。虽然我们不知道它们到底都用了一些什么样的特征,但是这些分析的内容对我们依然有借鉴意义。

1、行为特征or上下文特征

在 CTR 预估的场景当中,特征主要可以分为两种,一种是上下文特征,一种是用户历史行为特征。所谓的上下文特征,其实是一个很大的概念。像是展示的广告的信息,用户本身的信息,以及当时的时间、页面内的内容、用户所在的地点等等这些当下的和场景有关的信息都可以被认为是上下文信息。历史行为特征也很好理解,也就是用户之前在平台内产生的行为。

paper 当中着重分析了用户行为特征的重要性,其中的做法是将特征按照重要性倒排,然后计算在 topK 重要的特征当中用户历史行为特征的占比。在LR模型当中,特征的重要性就等价于对应位置的权重,得到的结果如下图:

从上图的结果我们可以看到,用户的历史行为特征在整体当中占据到了非常大的权重。top20 的 feature 当中,只有2个是上下文特征。这也很符合我们的认知,我们投放的内容的质量远远不如用户喜欢什么重要。而用户历史上产生过行为的数据非常好地可以体现用户喜好的情况。

2、重要性分析

除了分析了特征的重要性之外,paper 当中还实验了只使用某一种类型的特征进行预测,对比模型的性能。实验的结果如下:

上图当中红柱展示的是只使用上下文特征的训练结果,深蓝色是只使用用户行为特征的训练结果。从这个结果上我们可以明显地看到,只使用行为特征训练出来的模型性能要比使用上下文特征的好至少3.5个点,这已经是非常大的差距了。所以我们也可以得出结论,相比于上下文特征,用户的行为特征更加有用。

除此之外,paper 当中还探讨了 negative down sampling(负采样)和subsampling(二次采样)对于模型性能的影响。其中二次采样证明训练数据量和模型效果总体呈正比,也就是说训练数据量越大,模型的效果越好。而负采样同样对于提升模型的效果有所帮助,这也是目前广告和推荐场景下的常规手段。

更多精彩推荐
☞去伪存真,更多区块链落地应用即将涌现
☞你认为程序员的最高境界是什么?| 每日趣闻
☞AI 与 5G 时代,实时互联网的下一个风口是什么?
☞8000字 | 32 张图 | 一文搞懂事务+隔离级别+阻塞+死锁
☞图神经网络快速爆发,最新进展都在这里了
☞今年至少有75家交易所关闭,近半数没有说明原因
点分享点点赞点在看

长文剖析经典论文,揭晓 Facebook 广告排序模型!相关推荐

  1. CSCNN:新一代京东电商广告排序模型

    分享嘉宾:刘鹄 京东 算法工程师 编辑整理:李沛欣 出品平台:DataFunTalk 导读:随着电商平台对图像信息的大量引入,通过图像分析来进行广告点击率判断就成了新的趋势.本次分享的主题为CSCNN ...

  2. Facebook如何预测广告点击:剖析经典论文GBDT+LR

    作者 | 梁唐 来源 | TechFlow 今天我们来剖析一篇经典的论文:Practial Lessons from Predicting Clicks on Ads at Facebook.从这篇p ...

  3. 美团-深度学习在搜索广告排序的应用实践

    一.前言 在计算广告场景中,需要平衡和优化三个参与方--用户.广告主.平台的关键指标,而预估点击率CTR(Click-through Rate)和转化率CVR(Conversion Rate)是其中非 ...

  4. 【AI in 美团】深度学习在美团搜索广告排序的应用实践

    转自:https://mp.weixin.qq.com/s/9Fcj5lO-JPfFVnRSSM_56w [AI in 美团]深度学习在美团搜索广告排序的应用实践 AI(人工智能)技术已经广泛应用于美 ...

  5. CIKM 2021 | 淘宝多场景推荐排序模型ZEUS

    本文介绍大搜索算法团队发表于CIKM 2021 的论文 Self-Supervised Learning on Users' Spontaneous Behaviors for Multi-Scena ...

  6. 11篇推荐系统入门必读经典论文(附下载链接)

    推荐系统入门必读的11片经典论文,包含了召回.排序.模型融合相关技术,本篇文章列举出了每篇论文的摘要,最后附上了下载链接. 01. Cheng et al. - 2016 - Wide & D ...

  7. 解密MGC:如何用创新型AI做好Facebook广告?

    全文共9442字,预计学习时长24分钟 图源:unsplash 2020年1月,我发表了一篇名为<15分钟内破解Facebook广告>的文章,分享了2012至2019年我就职于Facebo ...

  8. 互联网大厂面试官:推荐系统最经典的 排序模型 有哪些?你了解多少?

    互联网大厂面试官:推荐系统最经典的 排序模型 有哪些?你了解多少? 提示:最近系统性地学习推荐系统的课程.我们以小红书的场景为例,讲工业界的推荐系统. 我只讲工业界实际有用的技术.说实话,工业界的技术 ...

  9. 卷积神经网络必读的100篇经典论文,包含检测/识别/分类/分割多个领域

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 参考|学术头条 编辑|极市平台 作为深度学习的代表算法之一,卷积神经 ...

最新文章

  1. 2019年云计算十大趋势:云成为获取人工智能主要途径
  2. 测试嵌套JavaScript对象键的存在
  3. xshell自动化脚本
  4. Oracle中常用的命令,随着学习进度总结
  5. Selector的一些state使用
  6. 让无线网卡同时工作在 AP 和 STA 模式
  7. oracle子接点与父节点上下级关系数据库查询语句,及联查询,
  8. Hibernate原生SQL查询
  9. wps 宏 禁用_WPS宏被禁用如何打开
  10. 线性代数与空间解析几何重要知识点笔记
  11. 阿里云实人认证是什么?
  12. 菜鸟阿鑫的常用类(上)总结
  13. Jmeter性能测试实践--登录场景设计
  14. 解决SSLHandshakeException :sun.security.validator.ValidatorException: PKIX path building failed:
  15. 攻防世界-web-mfw
  16. python和ruby对比
  17. 制作微信H5互动小游戏如何确认主题?
  18. 语义分割评价指标mIOU
  19. RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition的区别
  20. C. Interesting Sequence

热门文章

  1. 【LeetCode 剑指offer刷题】特殊数题3:204 Count Primes
  2. linux:C++的socket编程
  3. 查看嵌入式设备的CPU频率
  4. SDK窗口中增加菜单 以及 对菜单做出相应的消息响应
  5. ASP.NET页生命周期介绍:阶段,事件及其他
  6. add in Web.config
  7. wcf afterreceiverequest获取body数据_阿里面试官的灵魂拷问:究竟如何保证API接口数据安全?...
  8. 新机发布会用鸿蒙吗,鸿蒙操作系统及华为全场景新品发布会即将到来,硬件生态发展有望迎来加速度...
  9. opencv 编译报错(CMake Error: The following variables are used in this project, but they are set to not )
  10. 【C++笔记】字符串、向量和数组