本文分为三个部分:
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 进行哪些修改,都不影响其含义本质,都是衡量曝光的价值,以及作为双方进行经济结算的重要依据。
资料领取直通车:大厂面试题锦集+视频教程https://docs.qq.com/doc/DTlhVekRrZUdDUEpy
Linux服务器学习网站:C/C++Linux服务器开发/后台架构师https://ke.qq.com/course/417774?flowToken=1028592
在精排中,就是要将召回回来的<=300 条广告,分别计算 pCTR 和 pCVR(在这里我们本文的主角即将登场),并根据约定好的 ECPM 公式计算 ECPM,最终进行排序,价高者胜,二价计费。
Part2
前文介绍到整个广告系统的核心任务,就是对每一个曝光机会,从广告库里选择一个最合适的“广告”进行展示(并将广告的一些信息返回给媒体,一般是包括素材 URL、文案、ECPM 等内容)。而什么是所谓“合适”的广告,是根据 ECPM 来衡量的,各方面因素的影响(广告主的意愿、用户的特点等等)都会在 ECPM 公式中得以体现。而本文的主角——pCTR 模型的任务,就是尽可能精准的预估 ECPM 公式中的 pCTR 值。
模型训练 Pipeline
上图是一个离线模型训练流程的示意图。橙色部分为线上服务部分,蓝色部分为模型离线更新部分
线上预测服务部分
- 用户刷手机时,广告 SDK 将广告请求发送到 SSP 系统
- SSP 系统根据资源位、反作弊等策略进行请求过滤。并将通过过滤的广告请求发送给 DSP
- DSP 接收到广告请求后,先从 redis 中获取特征,并一并发送给 tf.Serving 服务,获取模型预估结果
- DSP 根据模型预估结果计算最终 ECPM,并将结果经由 SSP 转发给广告 SDK,最终完成广告展示
离线模型更新部分
- 特征计算:运用 Spark/Flink 例行化计算离线/实时特征,保存到 redis 中以供线上服务读取,同时保存到 TDW 表中备份
- 样本拼接:DSP 将线上服务中每个请求的特征上报到 TDBank,并落库 TDW。并每天根据曝光、点击上报日志,以 request_id 为 key 拼接样本,并将样