吴良超的学习笔记

An Overview Of An Ad System

从实习到工作,接触过一些大大小小的广告系统,有麻雀虽小但五脏俱全的小 dsp,也有把 ssp、adx、dsp 都打包了的大媒体 ,算是对业界的广告系统有了一个初步的了解。趁着五一放假这几天,简单地梳理一下当前了解到的广告系统知识,主要是想对零散的知识做个整理,由于广告系统这个概念非常的大,涉及到的部分非常的多,无法面面俱到,所以本文主要是从几个视角(技术、业务、产品)言简意赅的描述一下笔者比较关心的几个部分,中间内容可能不全,欢迎交流指正。

特意声明,本文内容与笔者雇主无关,主要是基于笔者当前的认知梳理的内容;在撰写过程中只会引用公开的内容,不会涉及到笔者雇主内部未公开的信息;如相关同学觉得有敏感内容,可联系删除。而其实在崇尚开源、paper 漫天飞、人员流动越来越快的如今,笔者觉得这些通用技术并不是最核心的地方,数据+对业务的理解+灵活组装这些通用的技术才是。

技术视角

这里的技术视角主要是技术同学日常迭代较多的模块,总体的架构上可将其划分为 召回+精排,而在这个结构里的两个主要关注的地方是出价和模型。

召回与精排

基本有规模的的推荐或广告系统,每次请求中选出 topk 个候选的过程都是 “召回+精排”,中间还可能会插入一个粗排,其原因都是候选集过于庞大,需要在工程与效果的 trade-off,而如果候选不多,延迟允许的情况下,对全量候选直接做精排,效果上无疑是最好的。

关于召回和排序,这篇文章讲得比较全面,推荐读一下, 推荐系统技术演进趋势:从召回到排序再到重排

当前的召回基本都是采用多路召回的模式,每一路的召回都有其存在的业务意义和目标,且往往各路之间是互补关系,有点类似 ensemble 里的 bagging 的思想。且考虑到效率,当前采用的基本都是 ANN 召回,其基本思想就是先把全量的候选划分在 $m$ 个子空间中,召回时通过特定方式选出 $n$ ($m \gt n$)子空间,然后将 query 与这 $n$ 个子空间的候选的相似性最高的 topk 个候选进入精排。关于 ANN 召回可参考这篇文章 图像检索:再叙ANN Search,其中的 IVF-PQ 是业界比较常用的一种召回方式。另外,FaceBook发表的 Embedding-based Retrieval in Facebook Search 也值得一读,整篇文章读下来就像一个奋战在一线的工程师向你娓娓道来他们是怎么从 0 到 1 构建一个召回系统,笔者也针对这篇 paper 写了Embedding-based Retrieval in Facebook Search 阅读笔记,供参考。

召回的目标是尽可能快地选出较好的候选,往往采用的特征和模型都会比较简单;而精排相对于召回,在特征和模型上可以做得更为复杂,因为精排面临的候选相对于召回少了非常多,各种交叉特征、复杂的结构都可以精排中尝试,精排基本上就是在根据业务去挖特征,而这里面笔者认为比较值得学习的是 Airbnb 的这篇文章 Real-time Personalization using Embeddings for Search Ranking at Airbnb,里面没有涉及到比较玄学的模型结构、超参等;而是看到了作者对业务有较为深刻的理解,同时通过各种方式将这些理解融入到模型中,笔者也针对这篇 paper 写了 Real-time Personalization using Embeddings for Search Ranking at Airbnb 阅读笔记,供参考。

此外,这里需要注意的是,将一个排序的过程拆成了多个阶段来选择 topk 个候选,带来的问题是每个阶段的排序优化目标可能会有割裂,而这在上面的文章《推荐系统技术演进趋势:从召回到排序再到重排》中也有提出

如果在召回阶段使用模型召回,理论上也应该同步采用和排序模型相同的优化目标,尤其是如果排序阶段采用多目标优化的情况下,召回模型也应该对应采取相同的多目标优化。同理,如果整个流程中包含粗排模块,粗排也应该采用和精排相同的多目标优化,几个环节优化目标应保持一致。因为召回和粗排是精排的前置环节,否则,如果优化目标不一致,很可能会出现高质量精排目标,在前置环节就被过滤掉的可能,影响整体效果

如果说上面的观点是召回应该去适配精排,则 FaceBook 在 Embedding-based Retrieval in Facebook Search 中提出的是让精排适配新的召回,paper 中指出新的 ANN 召回的结果可能并不会被精排认可,paper 中描述如下,也提出了一些解决方法

since the current ranking stages are designed for existing retrieval scenarios, this could result in new results returned from embedding based retrieval to be ranked sub-optimally by the existing rankers

模型

模型的重要性无需强调了,往往离线指标的几个千分点的提升,就能带来线上比较显著的收益,而且几乎系统的规则约束的东西都可以被模型取代。这里主要讲一些笔者认为对模型效果比较重要的几部分:数据、训练、预估纠偏

数据

数据是可以说是对模型效果影响最大的因素,这里可将其分为数据流和特征工程两部分

数据流比较核心的目标是及时且准确地获取各种事件(click,convert)的 ground truth;“及时”指的是发生的事件需要尽可能快地喂给模型,“准确”指的是这些事件需要被正确打上label。

数据流与转化归因(conversion attribution)这个领域密切相关,归因可以理解为 label 的获取与拼接, 当前最常见的是 last touch 方式的归因,也有一些其他的归因方式如 multi-touch 归因等, 通常涉及到广告主的上报和实际的拼接两部分,这里就不详细展开讲了,详细可参考这个 rtb-papers 里相关的 paper。这里主要讲几个笔者认为比较值得关注的问题:delayed feedback、bias、全渠道数据

  • delayed feedback

在广告场景下,cvr 模型是这个问题的典型例子,因为转化是有延迟的,即在点击发生后过一段时间用户可能才会发生转化,且往往转化漏斗越深,延迟的时间越长

这时候有两种选择,一种是等待事件的 label 完全回流再进行训练,比如说事件的真实 label 能在一天内完全回流,做天级训练即可,但是这不符合上面提到的“及时”的原则;另一种则是实时把数据送入模型做 online training,但是这不符合上面提到的“准确”的原则,因为有些 label 可能还没回流。而实际上,实时性和准确性也是一个 trade-off 的关系。

这个问题也被归纳为一个 delayed feedback 的问题,这部分内容可以参考 Delayed FeedBack In Computational Advertising,里面介绍了一些paper 里的解决方法,基本都是解决在 online-training 模式下如何解决 label 回传不及时的问题,如利用 importance sampling 等方法对样本做加权,或者让样本多次进模型,然后从统计意义推导出新的概率表达,从而保证样本是无偏的。

  • bias

训练数据可能存在各种 bias,常见的有 exposure bias 和 position bias

(1)exposure bias: 针对的问题是只有被曝光的样本才能进入训练集,导致 training 阶段能获取到的样本只是 serving 时很小的一部分
(2)position bias: 针对的问题是位置越显眼的广告位被点击的概率越高

关于 exposure bias 可参考文章 Exposure Bias In Machine Learning,里面介绍了一些 paper 的解决方法,笔者将其总结为 Data Augmentation、IPS 和 Domain Adaption 三大类的方法

exposure bias 在召回上往往也会被简化成一个负例选择的问题,这篇文章 SENet双塔模型:在推荐领域召回粗排的应用及其它 最后一部分列了一些可能的负例选择方法,也具备一定的实践指导意义

选择1:曝光未点击数据

这就是上面说的导致 Sample Selection Bias问题的原因。我们的经验是,这个数据还是需要的,只是要和其它类型的负例选择方法,按照一定比例进行混合,来缓解Sample Selection Bias问题。当然,有些结论貌似是不用这个数据,所以用还是不用,可能跟应用场景有关。

选择2:全局随机选择负例

就是说在原始的全局物料库里,随机抽取做为召回或者粗排的负例。这也是一种做法,Youtube DNN双塔模型就是这么做的。从道理上讲,这个肯定是完全符合输入数据的分布一致性的,但是,一般这么选择的负例,因为和正例差异太大,导致模型太好区分正例和负例,所以模型能学到多少知识是成问题的。

选择3:Batch内随机选择负例

就是说只包含正例,训练的时候,在Batch内,选择除了正例之外的其它Item,做为负例。这个本质上是:给定用户,在所有其它用户的正例里进行随机选择,构造负例。它在一定程度上,也可以解决Sample Selection Bias问题。比如Google的双塔召回模型,就是用的这种负例方法。

选择4:曝光数据随机选择负例

就是说,在给所有用户曝光的数据里,随机选择做为负例。这个我们测试过,在某些场景下是有效的。

选择5:基于Popularity随机选择负例

这种方法的做法是:全局随机选择,但是越是流行的Item,越大概率会被选择作为负例。目前不少研究证明了,负例采取Popularity-based方法,对于效果有明显的正面影响。它隐含的假设是:如果一个例子越流行,那么它没有被用户点过看过,说明更大概率,对当前的用户来说,它是一个真实的负例。同时,这种方法还会打压流行Item,增加模型个性化程度。

选择6:基于Hard选择负例

它是选择那些比较难的例子,做为负例。因为难区分的例子,很明显给模型带来的loss和信息含量比价多,所以从道理上讲是很合理的。但是怎样算是难的例子,可能有不同的做法,有些还跟应用有关。比如Airbnb,还有不少工作,都是在想办法筛选Hard负例上。

以上是几种常见的在召回和粗排阶段选择负例的做法。我们在模型召回阶段的经验是:比如在19年年中左右,我们尝试过选择1+选择3的混合方法,就是一定比例的“曝光未点击”和一定比例的类似Batch内随机的方法构造负例,当时在FM召回取得了明显的效果提升。但是在后面做双塔模型的时候,貌似这种方法又未能做出明显效果。全局随机,则无论是FM召回还是后来的双塔,都没做出效果,有时甚至负向明显。但是你又能看到一些报道采用的是全局随机做为负例。所以,我目前的感觉,负例这块是个宝藏,值得深入探索下,包括不同方法的混合,但是到底哪种方法是有效的,貌似很难有统一的定论,带有一定艺术性。

  • 全渠道数据

除了自身的数据外,还需要关注如何利用全渠道的数据提升的效果,其核心是将被 cvr 被低估的用户通过全渠道数据捞回来。提到全渠道的数据的概念,不得不说一下广告的模式,传统的广告模式将广告的竞价划分为 ssp <-> adx <-> dsp 三大块,而当前的一些大媒体基本上都包含这三大模块,如微信、抖音等,自身是媒体(ssp),也是拍卖平台(adx), 同时也承担着广告主投放的任务(dsp)。基本上面说的相关模型都数据媒体侧自身的 dsp 这一部分

媒体利用的数据往往只是用户在其自身产生的数据,如微信只能拿到用户在微信上的行为数据,拿不到用户在抖音上的相关数据;但广告主往往会在多个媒体上投放,可能用户在媒体 A 点击了某个广告,最终转化是在媒体 B 上,如果媒体 A 只用其自身的数据,会把 A 当做一个负例,cvr 会被低估,相当于放弃了这个转化高潜用户,而利用媒体 B 的数据则能让模型学习到这个用户真实的 cvr 情况;

怎么拿到这部分数据呢?一种是广告主将媒体 A 的数据归因后直接回传给媒体 B,另一种则是媒体之间相互合作,如笔者做过的联邦学习在广告的落地应用就是属于这部分。

拿到这部分数据后便可进行建模,最简单就是加到原来的模型中,除此之外,还可以独立建模,然后作用到出价或原始 cvr 上。

  • 特征工程

如果说数据流决定用哪部分数据,特征工程则是决定了是否能够完全挖掘这部分数据的价值,即常说的“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。

特征工程基本上做的就是根据业务特点去挖掘可能有用的特征,然后开 ab 实验验证效果;虽然说特征跟业务强相关,但是具体的挖掘也有一些套路,常用的有属性特征、计数特征、序列特征

(1)属性特征:用户/广告本身的一些属性,如用户的年龄、性别;广告的类别、样式等
(2)计数特征:用户在特定时间范围(如过去 7d、 3d、 12h、1h 等)对当前广告的特定的维度(如特定类别、特定位置、特定广告主等)的广告进行了特定操作(如点击、浏览等)的次数;
(3)序列特征:即用户在一段时间内的行为序列,如最近 30 个点击过的广告/商品;典型的应用可参考阿里的 DIN

特征工程另一重要部分是特征筛选,特征筛选最简单的做法是删除指定特征,然后重新训练模型并评估,但是这种做法在训练时长较长时开销是比较大的;因此更合理的做法是在训练过程中便能得到每个特征的重要性,对于 logistics regression、tree-model 这种解释性较好的模型能够做到这点,但是在 embedding-based 的 dnn 中,每个特征都只能拿到一个 embedding,怎么能做较好的特征选择的?比较常见的方法有

  • attention unit:为每个 feature 增加一个 attention unit(如 DIN 中的 activation unit),训练过程中通过这个 attention unit 输出的值来衡量每个特征重要性;其假设是对于重要特征,模型能够自动学习出其权重情况
  • embedding weight:根据每个 feature 对应的 embedding 的值大小来判断重要性, 常见的有基于 embedding 的 L1 norm,L2 norm 等;其假设是对于重要特征,其对应的 embedding 的值越大,类比 lr,其实 nn 可以近似认为是多个 lr 组成的

上面的两种方法都存在着较强的假设,有没有更直接一点的方法呢?回到最开始的想法,即删除指定特征,然后重新训练模型并评估,能否在训练过程中便达到这一目的呢?其实是可以的,在训练过程中通过 mask 的方式近似将 embedding 全置为 0,近似当做 drop 掉这个特征,然后通过 multi-head 的方式计算这部分 auc 即可。

另外,在召回阶段,出于效率的考虑,线上往往只会抽取 user/ad 的单侧特征,一些交叉特征虽然效果好,但是无法直接在线上抽取,这时可以考虑一些其他方法,如蒸馏,可参考阿里的 Privileged Features Distillation for E-Commerce Recommendations 或 Distillation 简介

训练

在数据决定上限后,怎么通过模型逼近这个上限呢? 以下几部分或许值得关注一下:模型结构,初始化,优化器和损失函数;这里说的模型主要还是针对 DeepLearning 中的 NN 模型,在算力和数据量都达到一定标准后,NN 的确能够取得 sota 的效果,

  • 模型结构

这里的模型结构针对是 NN 这一类模型,NN 里的各种结构可以说是百花齐放,如推荐领域的 Wide&Deep、DeepFM、DIN、DCN等,CV 领域的 AlexNet、VGG、Inception、ResNet等,NLP 领域 transformer、Bert等;这些还是笔者读书那会就已经发表的paper 里的结构,如果算上近年发表的相关结构等,那就更多了

而由于深度学习的不可解释性,使得模型的构建这一过程基本没有什么理论基础,基本上只能尝试,然后根据效果推测有效的原因,所以也出现了 autoML 这种自动化去搜寻结构和参数的方法。但是抛开那些玄学的部分,在实际应用中模型结构还是有一些可以借鉴的经验,

(1) VC Dimension: VC Dimension 本质上是在描述数据量大小和模型大小的关系,即模型参数量应该与数据量大小成正比关系,否则容易出现过拟合或欠拟合的问题
(2) attention: attention 用最直白的话来说就是动态加权,而这也很符合直觉,如每个特征的重要性不一样,应该对重要性高的给予更高的权重;在 NN 模型中,attention 常用在两个地方: embedding 和 hidden unit; embedding 的 attention 策略可参考这篇文章 SENet双塔模型:在推荐领域召回粗排的应用及其它;而针对 hidden unit 的 attention 则可参考这篇 paper,Learning Hidden Unit Contributions for Unsupervised Acoustic Model Adaptation
(3) multitask: multitask 结构有两个常见的用处, 第一种认为多个 task 之间有关联,联合训练能增加数据量,同时提升效果;第二种则是对于预估值的准确性有要求的场景,如果广告的 ctr、cvr 的预估,往往数据流中混合了多个场景的数据,且每个场景对应的数据的后验不同的,为了保值预估值的准确性,需要将后验值不同的数据分到不同的 head 中

  • 模型训练

模型训练的过程,笔者认为可分为三大部分:初始化,优化器和损失函数

初始化对效果有影响,而这个问题可以从几个角度去理解,从最优化的角度理解,是因为 NN 的优化往往是一个 non-convex 的问题, 如果初始化不好,一开始可能就处于一个不好的位置;从 bp 的角度理解,初始化的值过小或过大,容易导致梯度消失会梯度爆炸,关于这部分,deeplearning.ai 上的 Initializing neural networks 讲得比较好了,还辅以实践,推荐读一下。

训练过程本质上就是个优化问题,通过 bp 过程不断修正初始化的 parameter,从而达到损失函数最小的目标,更详细的描述可以参考 Parameter optimization in neural networks;中间涉及到了各种超参数的选择:如 learning rate、batch size、optimizer 等;其中 optimizer 也有非常多的选择,其中 optimizer 的选择往往又是一个值得考量的地方,关于各类 optimizer 的区别可以参考这篇文章,一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

损失函数基本都是通过 MLE 或 MAP 推导出来的,其思想都是假设训练样本都是服从某些分布生成的,而训练的目标是让这些样本的联合概率最大;如 mse 的 assumption 是模型预估值与 ground truth 的误差服从正态分布,cross entropy 的 assumption 是预估值服从伯努利分布;而这两个其实也能被统一到 GLM 这个框架下。

目前在业界更常见的做法是把问题转为分类问题,对应的 loss 即为 cross entropy,而其实一些回归的 loss 也能通过 weighted logistics regression 转化为分类的问题,比较经典的就是 youtube 的 Deep Neural Networks for YouTube Recommendations 中 Modeling Expected Watch Time 部分;基于最原始 cross entropy 衍生出来的 loss 主要有两种形式

(1) reweight, 即对样本进行各种加权, 包括但不限于根据物理含义直接加权(如观看时长)、通过 importance sampling 等方式推导出来的 loss,其最终形式也是 reweight 的模式
(2) auxiliary/regularization, 即在原始的 task 上增加一些辅助任务或正则项,如 center loss等

预估纠偏

在推荐场景下,往往只要序准确就可以了,而总体高估或低估理论上不会影响总体的排序;但是广告场景下涉及到计费环节,需要保证计费时的准确性,因此在广告场景下还需要关注模型预估准确性的问题,假设模型高估了,相当于多收了广告主的钱,广告主吃亏,反之平台吃亏。

因此,在广告场景下,模型需要关注的指标不仅仅是 auc,还需要关注预估偏差;为了保证纠偏后不影响总体的排序即 auc 指标,预估纠偏往往采用的是保序回归,关于预估纠偏可参考这篇文章:使用 Isotonic Regression 校准分类器

另外,上面在 loss 中对样本进行 reweight 的方式,会影响正负样本的分布,导致统计意义上预估值的就是有偏的,应对的策略可以在训练阶段就进行纠偏,或者在预估值上直接做一个转换,这部分内容可参考这篇文章 Delayed FeedBack In Computational Advertising 的 Fake negative calibration

出价

上面的无论是召回+精排的架构,还是模型相关的部分,在推荐和广告基本都是通用的;而出价(bidding)这个领域, 则是笔者认为是广告相对于推荐的最大的不同;因为在广告场景中引入了广告主(advertiser)这一角色, 出价则是提供了一种方式供广告主表达其对付费诉求,即对一次曝光/点击/转化愿意付多少钱。

其次,广告平台往往需要提供多种产品形态来满足广告主的各种需求,如最常见的是保成本类产品、还有一些更追求跑量、品牌广告则是对保量有严格的要求;针对这些不同的产品形态,基本上最终的策略都落在了出价上。因为在基于 ecpm 排序的广告系统中,基本上能比较灵活地改动的就是 bid 这个因素了

而针对上面各种产品需求,其实都是可以通过相同的最优化建模的方式来解决的,阿里之前发表过一篇 paper 来描述这个问题,对于出价公式的推导和控制器的构建都有较好的指导意义;笔者针对这篇 paper 也写了一篇文章 《Bid Optimization by Multivariable Control in Display Advertising》阅读笔记,供参考。

业务视角

这里的业务视角,其实就是在实际迭代中直接面临的几个问题,也是会直接影响到客户体验与平台收入的几个问题;上面提到的技术可以说都是为了这些业务服务的。笔者将其总结为: 起量、成本、持续跑量和冷启动四大块。

起量

起量可以说是投放面临的第一个难题,素材过审了、计划建好了、预算也准备好,计划是不是就能够如期地起量呢?答案肯定不是的

信息流广告起量真的要靠大量堆账户堆计划吗?广告投放不起量都是怎么解决的? 就从优化师的角度,描述了为了让计划起量而想出的各种“奇技淫巧”,总的来说,有以下几个方向:优化素材、放开定向、提高出价&预算、堆计划等。

那么从媒体/平台侧的角度来说,有什么手段去缓解广告主起量难的问题么?

一般来说,起量难的问题会随着广告候选变多而愈发严峻,而这也可以从 E&E 的角度去解读,因为在 dau 基本稳定的情况下,媒体展示广告的次数是有限的,如果让更多的新计划得到展示机会,势必会挤压老计划,而且新计划起量后,后续能否持续跑量也是个问题,属于 explore 的部分。

因此,一个朴素的思想是固定一些 explore 的 quota,专门用于处于起量阶段的计划,相当于给这些起量阶段的计划开的绿色通道;有了绿色通道后,需要考虑的第二个问题是:哪些计划能通过这些绿色通道?每个计划都给同等的机会显然不是最优的,因为不同计划起量后的表现不一样,因此一种更合理的做法是建模判断这些计划在起量后的表现能力,然后根据表现能力决定计划是否能进绿色通道,同时还需要考虑那些堆计划的 case,避免对相同或只做了微小改动的计划重复进入绿色通道,给更多广告主以探索的机会。

成本

大部分客户投放广告关注的是其 roi(品牌广告其实也可以认为追求的是长期的 roi),而近年各个媒体平台上也出现了各种 roi 类的产品,但是 roi 类的产品要求广告主把付费金额等敏感数据回传,因此大范围推广还需要时间;当前使用更多的是成本类产品,即认为广告主出价是 truthful bidding 的,可以将广告主的出价作为成本,投放过程中尽量让实际成本贴近广告主填的出价。

由于当前的广告系统都是基于 ecpm 排序和扣费的,因此构成 ecpm 的几个元素(bid, ctr, cvr)的值必须要准确,才能保证成本不会过高(广告主亏)或过低(媒体亏)

首先需要重点关注的是 ctr、cvr 预估的准确性,而这个问题的难点在于能拿到的训练数据的 label 是 0和1(代表是否点击/转化),但是实际中需要预估的是一个 rate,而这导致了没有一个绝对准确的 ground truth,退化成只能通过训练来逼近训练样本中的正负样本的比例,这也是为什么改变了训练样本的分布需要在 loss function 或预估值上做纠偏。另外,从概率论出发,大数定律告诉我们:当样本数量越多,则其算术平均值就有越高的概率接近期望值,但问题是很多计划的的 click、convert 数量非常少,所以训练也没法很好的学习出各个计划的期望cvr。

因此,面对这么一个没有绝对 ground truth,同时大数定律也不完全适用的而带来的预估偏差的问题,需要有额外的策略来应对,最常见的就是上面提到的保序回归,这个也是基于后验数据的统计对预估值做 calibration,因此也需要考虑纠偏粒度上的后验数据是否过少的问题。

另一个关键因素就是出价了,如果预估完全准确的情况下,按照广告主给定的出价来投放是最优的,但这显然是不太可能,因此,才有了控制器不断地调价来控制成本,满足保成本的诉求,可以认为出价是预估不准的兜底策略。

冷启动

无论是在广告还是推荐,冷启动都是一个长期存在的问题,其原因是新用户/计划缺少历史数据,模型/策略对其学习不够充分,从而效果表现得很差;而在广告场景中,新计划比起新用户的冷启动往往是更常见且严峻的,因为对于成熟的媒体而言,dau/mau 等基本都是稳定的,但广告主会不断地新建计划。

冷启动往往会加剧上面提到的各类问题,如在模型上,预估值的准确性更难保证;在出价上,成本更难控制等;而针对冷启动的问题,往往也会从两个方面去优化,即模型和策略。

在模型上,有不少针对冷启动的paper,且基本都是针对 nn 这一类 embedding-based 的模型,其基本思路都是让冷启动 item 的 embedding 贴近 warm-up 阶段的状态,笔者将这类方法归纳成两类 (1)利用 meta-network 为冷启动的 item 生成一个 id embedding (2) 基于 MAML 的方法训练模型,让 embedding 更快收敛

第一种方法的基本思想是利用 item 的 meta 信息(即使冷启动 item 也有)通过一个小网络(即 mata-network)生成 embeddding,然后增加一些 auxiliary task 来训练这个小网络,这些 task 就有很多选择了,更多是对业务的理解,如可以让 meta-network 吐出来的 embedding 与item 在成熟期的 embedding 误差尽量小(针对已经步入成熟期的item 的样本),也可以利用冷启动 item 对网络进行二次的训练等

这种方法的两篇比较典型的 paper 可参考

第二中方法基本上就是基于 meta learning 的思想,让模型能够更好的 learn to learn,即使对于样本量很少的 item 也能较快学习到,代表方法就是 MAML,可以参考下面两篇 paper,另外,关于 MAML 更通俗的介绍可参考知乎上这篇文章

上面的方法基本都是让冷启动 item 的 id embedding 能更快收敛,还有另一种方法是将冷启动的 item 的一些更泛化的特征直接加入到模型中,如图像、文本等描述性特征,通过一些 pretrained model (如 VGG、Bert 等)将其转为 embedding 的模型加入模型中,也是一种常见的套路。

除了模型,策略上往往也需要对冷启动的计划有额外的举措;如在冷启动阶段,可以给计划”绿色通道”, 即一定 explore 的 quota,如同上面提到的起量问题一样(起量其实也可以算是一个冷启动问题),而这也涉及到老生常谈的 E&E 问题了,一个跟 deep learning 的玄学程度不相上下的领域,这部分内容介绍可参考 EE 问题概述。同样地,这些 explore quota 也应该根据每个计划的预期表现给予个性化的分配;即需要识别计划未来的表现,毕竟往往个性化分别比起均分都是最优的。此外,这些 quota 必然会对成熟期的计划造成一定的积压,所以也需要考虑冷启动和成熟期的 trade-off。

除了额外的扶持,冷启动的出价方法也需要额外考虑,因为此时计划的后验数据基本是空的,那怎么才能获取出价调控需要的这些数据呢?这里也有一些思路,比如可不可以利用相似计划的后验数据?或者信任预估,直接对预估值取 sum?或者产品层面就不对冷启动计划做苛刻的成本要求?

同时,在实际产品中,往往也需要联合产品教育广告主,冷启动期间就是会存在不稳定性,更容易出现超成本等问题,而如果客户对平台粘性不高或者整个市场有其他更有竞争力的竞品,这些超成本所带来的损失往往也是需要有平台来承担。

持续跑量

持续跑量可以认为是计划渡过冷启动后,亦即计划进入了成熟期需要面临的问题,因为广告主在投放追求的往往是两个东西:成本和跑量,在成本能控住的前提下,跑量一般是越多越好的,但现状是在不少的媒体上,计划在进入成熟期不久就会掉量,而且往往是掉了之后就再也起不来了,也就是说计划的生命周期较短。

造成这个问题原因有很多,包括但不限于

  1. 广告主频繁地修改出价、定向、预算等有可能改变计划的稳态
  2. 模型预估的不准确、出价调控不够稳定,可能导致计划突然爆量或掉量
  3. 如果竞价环境比价激烈,那么对于有限的展示机会和不断增加的计划数,部分老计划掉量也是不可避免的
  4. 自然衰减,如计划圈定的人群基本都曝光了,或者创意的自然衰减

这个问题会往往会导致广告主为了跑量而不断复制新建计划,进一步加剧起量、冷启动等问题,也直接导致竞争环境变得更激烈,系统的机器负载更大,因此,保证计划的持续跑量是所有广告系统都需要解决的重要问题。

抛开第三个比较难改变的因素,针对其他几个原因,有一些思路也许值得借鉴

  • 广告主要减少频繁修改计划的定向、出价等操作,这些需要平台教育广告主,至于频率多大算频繁,定向又应该放开到何种程度,需要平台同时实验等手段测试出来,最好能给广告主提供一个参考值
  • 要尽量减少系统波动等因素对计划的影响,即要减少各中工程和算法的事故的影响,如尽量保证各种 infra 服务的高可用性,AB 实验要更加谨慎,因为这些操作都是有可能影响计划的稳态
  • 对于要掉量的计划生效额外策略;这里面又可分为两个问题,如识别掉量计划以及对计划做何种策略,这个问题跟冷启动的扶持也很相似

总的来说,从业务视角来看的几个问题:起量、冷启动、成本、持续跑量,都是广告主非常关心的几个问题,也是直接衡量平台给广告主带来的价值的几个方面,值得重点关注;而且这里面也不像第一部分那么偏技术导向了,需要更多地考虑产品形态、如何更好地服务客户等。

产品视角

这里的产品视角也可以理解为广告主的视角,亦即平台披露给广告主的产品形态;一般可将其分为划分为品牌广告、效果广告两大类,而这两大类下面又有很多细分;这里就简单概述一下这两大类广告的一些基本知识。

品牌广告

品牌广告往往是一个广告系统发展初期的广告模式,基本流程是广告主先付钱,平台保证曝光,如 cpt,gd 就是典型的品牌广告,前者没什么好说的,固定的广告位在特定位置强出就好了;后者则一般会涉及到库存预估和库存分配两个问题

  • 库存预估:gd 承诺的是未来的曝光量,因此需要保证当前售卖的库存不能超过未来的曝光量;一般可以通过时序预估模型来进行预估
  • 库存分配:将库存和 gd 计划作为 supply side 和 demand side 构造二部图,然后通过分配算法进行分配,常见的分配算法有 HWM 和 SHALE

上面的做法只是在解决 gd 广告的保量问题,但是随着优化的精细化,除了保量,还需要考虑一些其他问题,如

  • gd 广告和效果广告往往存在竞争关系(因为曝光的机会是共享且数量是基本固定的), 需要联合效果广告建模使得利益最大化
  • gd 广告除了保量,往往客户也会提出效果的要求,否则平台可以把低质流量直接给到 gd 计划;因此,从建模上这成了一个多约束的优化问题

如果额外考虑以上这两点,上面传统的分配算法就有点问题了,首先库存预估出来的量往往是总体的曝光量,gd 能占用其中多少的量需要拍一个数,或者根据 cpm 分配;其次,上面分配算法是直接把这个曝光给这个gd 广告的,不会判断质量的好坏,但我们实际是不希望把太差的量给广告主的,同时也不能对竞价有过多的挤压,因此需要判断流量对于 gd 计划的质量,需要为 gd 计划考虑一种更加灵活的拿量方法。

综上,gd 广告需要考虑保量、效果、溢价率以及对效果广告的挤压,因此建模时也需要把这些因素考虑进去。

效果广告

效果广告占了广告市场的大部分的份额,因为绝大部分广告主关心的是投放的 roi;而上面提到的各种技术,很大一部分都是为效果广告服务的,如保成本、跑量等;这里就不赘述了。

深度转化产品

随着优化的深入,常见的效果广告的优化目标已经不能满足所有广告主的需求了,比如部分行业广告主会希望直接优化到 roi 而不仅仅是成本,同时也能提供相应的数据

这个时候就需要考虑为这个广告主进行额外建模了,这里又有两种选择,一种是广告主直接把数据回传到平台进行常规的模型训练,另一种则是广告主不愿意把 label 直接回传到平台,这中情况下可以通过 Federated Learning 的方法对其进行优化,笔者在实际中对这部分也有一定实践经验,详细可参考 字节跳动联邦学习平台Fedlearner:4个月落地开源,投放增效200%+

建模后往往会通过出价的方式应用模型,除非广告主能够提供直投深度目标的 bid;而这往往又是一个多目标约束的优化问题,具体的策略可以看上面出价部分

小结

综上,本文主要从技术视角、业务视角和产品视角总结了一些笔者比较关注的计算广告领域的知识

  • 技术视角:基本是 “召回+精排” 的结构,里面两个值得关注的部分是模型和出价
  • 业务视角:主要面临4个问题:起量、成本、持续跑量、冷启动
  • 产品视角:主要可分为品牌广告、效果广告和深度转化广告三大类

内容很多也很乱>_<, 但在整个广告系统下也只是冰山一角;同时因为保密性原因,很多具体方法没有在文中提及,但是相信提及的思想都是普适的,欢迎交流指导。