一文彻底搞懂 CTR 建模

本文分为三个部分:
Part1 是前菜,帮助没接触过相关内容的同学快速了解我们要做什么、为什么做;
Part2 适合刚刚接触 pCTR 建模想要完成项目的算法同学;
Part3 适合正在做 CTR 建模项目且想要进一步优化效果的算法同学。

Part1

计算广告

广告是互联网流量变现的重要手段,也是互联网产品进行推广的重要方式。互联网广告行业经历了合约广告时期、精准定向广告时期、竞价广告时期等多阶段的发展,现在行业内已经普遍采用了自动化竞价的广告投放模式。

在计算广告的投放和交易中,除了用户是被动参与其中,还有媒体和广告主两方进行交易,其中媒体希望通过广告的形式将自己的流量变现,广告主希望通过广告来付费推广自己的产品。同时整个链路中还有针对媒体方设计的供给方产品(SSP)和针对广告主设计的需求方平台(DSP)。

上图为行业内供需之间多种接口与产品的形式(来源于刘鹏的《计算广告》一书),而一个成熟的广告平台通常需要具备上图中的一整套功能。比如需要提供广告主建立广告的投放界面、需要具备 SSP 的与媒体 APP 对接的功能、需要提供可以给媒体 APP 集成的广告 SDK 以及需要提供 DSP 的广告竞价功能等等。其中 DSP 中的广告竞价系统是计算广告中最核心的模块之一,而 CTR 模型也将在这里发挥它的重要作用。

广告竞价系统

计算广告的核心是广告的竞价系统,也就是需要对每一次广告请求,都要在 100ms 内从广告库中选取一个最合适的广告,计算好本次曝光的价格,并返回给媒体。这个过程主要需要经历召回、粗排、精排、出价几个步骤:

  • 召回

每个优化师都可以随时建立新的广告,通常来讲广告库中的广告数量可以达到几万、几十万、甚至几百万的量级。由于精确计算该次请求中每个广告的 pCTR、pCVR 比较耗时,如果针对广告库中所有广告都计算其 pCTR、pCVR,一方面十分浪费计算资源,而且几乎不可能在 100ms 内将结果返回给媒体。

所以广告系统通常会先采用一些耗时低的方案,用精度换时间。从全量广告库中召回几百条广告进入后续模块的竞价过程,这样精排过程只需要针对几百个广告计算 pCTR、pCVR 即可,就可以实现 100ms 内完整全部广告竞价过程。

  • 粗排

粗排的作用与召回类似,主要是进一步减少广告条数。如果广告库中广告数量特别大,比如达到百万量级,因为召回模型必须重点考虑时延问题,只能牺牲精度,如果仅通过召回模块让候选集从百万降低到几百,则不可避免的会导致精度下降过大。这种情况下会在召回和精排中间加入粗排过程,粗排模型的复杂度和精度通常介于召回模型和精排模型之间,目的是在效率和精度上进行权衡取舍。

  • 精排

到了精排这一步,一般就只剩下几百个广告,我们只需要针对每个广告,调用 pCTR 模型和 pCVR 模型,精确计算 pCTR、pCVR 的值,计算 ECPM 并排序(这一部分下一节介绍)。

  • 出价

通常来讲有了精排给出的 ECPM 值就可以进行曝光和结算了,但是由于精排过程中深度模型无法进行更高层面的全局考虑。通常广告平台为了成本达成、预算平滑等目的的考虑,会在精排之后对 ECPM 进行调整。这一环节中通常策略更多一些。

ECPM 与精排

在竞价系统中,每次请求究竟哪个广告胜出,通常是根据 ECPM 公式来计算。ECPM(Effective Cost Per Mille)是用来衡量一次曝光价值的指标,具体含义为假设该次曝光重复 1000 次的价格(单位为元)。比较基础的计算公式如下:

ECPM=price×pCTR×pCVR×1000

其中 price 是广告主设定的价格,比如在 oCPA 投放时,用户指定预期每个转化 40 元,那这里的 price 就等于 40;至于 pCTR 和 pCVR 就是此次曝光的点击率和转化率,分别由 pCTR 模型和 pCVR 模型进行估计。

不同的业务会根据自己的业务需求对 ECPM 公式进行修改,比如如果要进行 ROI 的优化,可能会考虑用户 LTV 的影响:

ECPM=price×pCTR×pCVR×pLTV×1000

以及例如我们之前与 AMS 的合作项目中,广告主来估计用户的价值分级,回传给广告平台后,广告平台会直接在 ECPM 上乘一个系数;有时广告主需要平滑预算,会将 ECPM 进行进一步修正平滑作为最终出价。但是不论对 ECPM 进行哪些修改,都不影响其含义本质,都是衡量曝光的价值,以及作为双方进行经济结算的重要依据

资料领取直通车:大厂面试题锦集+视频教程icon-default.png?t=M85Bhttps://docs.qq.com/doc/DTlhVekRrZUdDUEpy

Linux服务器学习网站:C/C++Linux服务器开发/后台架构师icon-default.png?t=M85Bhttps://ke.qq.com/course/417774?flowToken=1028592

在精排中,就是要将召回回来的<=300 条广告,分别计算 pCTR 和 pCVR(在这里我们本文的主角即将登场),并根据约定好的 ECPM 公式计算 ECPM,最终进行排序,价高者胜,二价计费

Part2

前文介绍到整个广告系统的核心任务,就是对每一个曝光机会,从广告库里选择一个最合适的“广告”进行展示(并将广告的一些信息返回给媒体,一般是包括素材 URL、文案、ECPM 等内容)。而什么是所谓“合适”的广告,是根据 ECPM 来衡量的,各方面因素的影响(广告主的意愿、用户的特点等等)都会在 ECPM 公式中得以体现。而本文的主角——pCTR 模型的任务,就是尽可能精准的预估 ECPM 公式中的 pCTR 值。

模型训练 Pipeline

上图是一个离线模型训练流程的示意图。橙色部分为线上服务部分,蓝色部分为模型离线更新部分

线上预测服务部分

  1. 用户刷手机时,广告 SDK 将广告请求发送到 SSP 系统
  2. SSP 系统根据资源位、反作弊等策略进行请求过滤。并将通过过滤的广告请求发送给 DSP
  3. DSP 接收到广告请求后,先从 redis 中获取特征,并一并发送给 tf.Serving 服务,获取模型预估结果
  4. DSP 根据模型预估结果计算最终 ECPM,并将结果经由 SSP 转发给广告 SDK,最终完成广告展示

离线模型更新部分

  1. 特征计算:运用 Spark/Flink 例行化计算离线/实时特征,保存到 redis 中以供线上服务读取,同时保存到 TDW 表中备份
  2. 样本拼接:DSP 将线上服务中每个请求的特征上报到 TDBank,并落库 TDW。并每天根据曝光、点击上报日志,以 request_id 为 key 拼接样本,并将样
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值