自从Facebook引入oCPM出价以来,国内的头条广告、微信广点通、百度信息流都陆续推出了自己的oCPX出价,oCPX出价已经成为主流广告投放平台的标配。
简单而言,oCPX是一种出价机制,允许广告主按照转化行为成本出价;假设对于游戏类的广告主,希望优化App的激活,那么广告主在投放系统中设置了激活成本之后,算法就会根据以往转化数据和广告主的出价,自动筛选有价值的人群,针对高激活概率的人提高出价赢得广告曝光,对低激活概率的人群降低出价减少广告曝光以减少广告浪费。
常见的广告出价方式还有CPM、CPC。
- CPM:Cost Per Mille,每千次曝光成本,即按照曝光次数出价,如微信朋友圈视频形式广告在上海就按照¥180一千次曝光扣费,不管你是否点击了广告。这在短期内显然是最有利于媒体的,因为它不用care本次曝光是否有效;但是为什么说是短期?很简单,广告主又不是傻子,若发现广告后续转化一直很差,势必会减少在该媒体的投放。
- CPC:Cost Per Click,按照点击出价,如果广告只有曝光没有点击,就不扣费;看似比较公平,但是广告主需要大量的测试,才能找到最优的投放方法,其实还是有一部分点击是浪费的,这对于媒体也是损失。
于是oCPX模式就应运而生,它能帮助广告主优化更深层次的转化行为,同时提升有效点击,提高媒体受益。
这段时间在网上找到一篇淘宝的关于oCPC论文,逻辑很清晰,在这里简单转述一下。
文章细节很多,没兴趣看的同学只要关注以下几点:
- 本次预估的点击率*转化率与历史平均的点击率*转化率的比值,决定了系统出价调整的系数;
- 淘宝的论文中,广告保证eCPM最大和各方利益总和最大。
先定义:
- 出价:广告主原始出价为b0,算法调整后的出价为b1(也就是我们经常说的:“系统会自动调整出价”);
- 预估转化价值p=pCTR*pCVR*v;v代表平均每次购买带来的价值,可以假定是常数;pCTR表示预估的广告点击率,pCVR表示预估的转化率(如转化行为可以定义为“购买”);
- 历史转化价值h=hCTR*hCVR*v;hCTR代表历史广告点击率,hCVR代表历史点击后转化率;淘宝实践中,hCVR是用过去一段时间的竞品广告数据(估计是解决冷启动的问题,如果账户已经积累了转化数据,肯定会用广告主自己的数据),利用pCVR预估模型进行计算,去掉最高&最低10%取均值得到的。
为了简化说明,做两个假设:
- 假设广告主的目标是保证(或者提高)ROI;
- 单个点击ROI = (pCTR * pCVR * v)/ b0;b0是该广告出价,比如广告带来的购买GMV除以该广告的投放费用,即得到该广告的ROI(为了简化计算方式,假定广告主出价即等于广告点击费用,即不考虑广义次高价的逻辑,广义次高价GSP机制可以参考此前的的文章)
要维持或者提升ROI,那么只需要保证 b1/b0 ≤ p/h。
b1代表算法优化后的出价;举个例子,假设本次曝光,预计能带来1.5倍的转化价值,那么只要优化后的出价/广告主出价小于等于1.5倍,那么整体的ROI是不会下降的;反之,若预估转化价值低于历史均值,那么降低出价;由于b0、p和h都已知,那么只需计算b1,满足该约束即可。
真实广告投放环境中,为了兼顾品牌安全和账户稳定,将b1/b0的范围控制在[1-α, 1+α]范围之内,淘宝论文中将α值设置为0.4,即广告最高出价不会超过广告主设定的140%,下限也不会低于广告主设定的60%。
- 若p/h≥1,那么系统优化后出价b1的下限l(b)=b0,出价上限u(b)=b0*min(1+α, p/h))(因为有ROI约束在,不能突破p/h的约束);
- 若p/h<1,那么系统优化后出价b1的下限是l(b)=b0*(1-α),上限是u(b)=b0。
通过以上约束,也就能实现我们经常说的:对于转化概率高的流量(p/h>1,即本次广告转化率比历史平均转化率要高)提高出价,获得更高展现概率;反之,对于转化概率低的流量(p/h<1)降低出价,减少展现机会。
那么问题来了,若多个广告竞争,到底谁赢得此次出价?
广告排序我们都知道采用了eCPM排序,eCPM=b0*pCTR,eCPM高者赢得广告展现机会。那么在ROI约束下的,eCPM能够取到的最大值即上限u(eCPM)=pCTR*u(b),eCPM能够取到的最小值即下限l(eCPM)=pCTR*l(b);
淘宝给定的排序机制是:按照eCPM排序,同时保证各方利益总和最大。
各方利益总和的计算,淘宝给出了两个公式:
f(1) = pCTR1 * pCVR1*V
f(2) = pCTR2 * pCVR2*V+β*CTR2*b0
f(1)计算的是广告带来的所有GMV;f(2)计算的是广告带来的GMV和平台的广告收益。需要指出的是,f可以扩展,因此可以优化任何目标;这里认为f是单调递增函数,随着系统调整后的出价b1提高,收益也提高。f(1)虽然没有将b1作为参数,但是假设b1的增加,能拿到更好的资源位从而带来更高的CTR、更加优质的流量。
广告排序过程如下(稍微有点繁琐,请记住每个字母代表啥意思):
① 对候选广告池子A中每一个广告计算f(u(eCPM)),按倒序排序;即按照最高出价来计算f,由于假设f是b1的递增函数,那么按照b1的上限值来计算,理论上是能保证f最大,即保证各方收益总和最大;
② 计算所有备选广告中,所有eCPM下限的最大值t=l(eCPM);
③ 按顺序,找到第一个满足u(eCPM)≥t的广告k,k广告赢得此次竞价,并将该广告移出A池子;即,只要某条广告最高出价下的eCPM大于其他广告的最低出价下的eCPM,就能赢得此次广告曝光。这是为了保证媒体收益,如果只按照f排序而不考虑eCPM,那么可能对于媒体而言是一个亏本的买卖;
④ 比较剩下所有广告的最大出价下的eCPM即u(eCPM)与上一个赢得广告k的u(eCPM),取两者当中最小值,这样就能保证已经赢得展现机会的广告k的eCPM,在所有候选广告中是最大的;若广告i的eCPM上限u(eCPM)被调整,也就意味着广告i的eCPM上限u(eCPM)大于广告k的u(eCPM),将其调整为广告k的u(eCPM)。
此时,那么广告i的出价同样需要被调整,看淘宝的代码更直观一点:
- 第一步:u(i-eCPM)=min(u(i-eCPM),u(k-eCPM));
- 第二步:u(b)=min(u(b),u(i-eCPM)/pCTR);
第一步首先比较广告i的上限eCPM与已经赢得展现机会的广告K的上限eCPM,取两者 当中最小值,这就能保证已经赢得曝光的广告k的eCPM是最大的。
第二步,更新广告i的出价上限;如果u(i-eCPM)在第一步被更新了,那么广告i的出价 在第二步也会被更新;需要注意的是,由于出价上限改变了,那么广告i的f(u(eCPM)) 同样会被更新(由于f()是一个单调递增函数,f()会减小);
至于这里为什么要调整剩余候选广告上限eCPM,使其不高于胜选广告的上限?我的理解是(不一定准确):首先是兼容eCPM排序机制,也就是保证了媒体收益最大化;其次,兼顾f(u())排序是为了保证平台、广告主和消费者的利益。
重复以上4个步骤,直至广告数量填充满所有广告位,或者所有没有广告赢得该次展现,此时结束循环,并将所有广告出价b1设置为u(eCPM)/pCTR,也就是所有广告按照上限出价。
投放启示:
① 单纯从逻辑上看,真实出价是对广告主最优的策略。若广告主最初出价b0小于其真实成本,那么拿不到预期的流量,这对广告主不利;若最初出价b0高于其真实成本,这对拿量有好处,但是会导致模型会不断往该出价水平去靠近(p(c|u,a)/h(c|u,a)不断趋近于1),后期要控成本时势必需要重新积累数据重新学习;
② 开启oCPC之前,需要稳定的投放。换句话说,用户转化路径是走得通且成本达到预期的。比如目前虽然激活成本达标,但是后续的转化(注册、购买、申请贷款等等)都还不达标,即使开启oCPC去优化激活意义也不大,因为这样带来的激活用户后续转化率也不会存在很大变化。
这是淘宝oCPC的思路细节,我们跳出这些细节,看看一条广告从请求到展现涉及到的全过程:
为了保证不丢失细节,我直接把论文描述贴过来:Front Server接收到页面曝光请求之后,将该用户信息传给Merger Server,Matching Server分析得到该用户的特征(一连串的标签),这些标签被传入Search Node Server检索符合条件的候选广告,此时候选广告数量降低为400条左右。
Real-time Prediction Server预估得出pCTR和pCVR。Stragedy Layer包含oCPC的逻辑和GSP机制。经过该逻辑层,赢得展现的广告被Data Node Server和Smart Creative Service优化,最后Front Server返回广告元素并展现。
淘宝论文直达,点击