多目标广告混排机制在超级APP中的技术

先插个招聘信息: 急招推荐,搜索,语音算法,数据挖掘,工程人才,阿里P5~P9,欢迎推荐和自荐,扫码关注以下二维码了解详细信息

背景

近年大家会发现一个现象,行业中新的爆发性发展的创业公司在不断变少,最直接的原因应该是移动互联网的红利增长已经放缓,同时各个巨头也在使用不同的方式,将流量收口到自己的超级APP中,例如淘系的电商,社交的微信, 内容则为头条,线下服务则是美团。其他创业公司想通过某个领域切入,进行弯道超车,在技术缺少重大变革的情况下变得更加困难;另一方面,各个超级APP,无论是何种属性,解决用户的何种需求,也都在尝试着商业化,以便让自己的业务生态形成可造血的良性闭环。

当然各家超级APP在商业化的过程中,也都遵循着商业化一直的准则在构建良性生态,尽量避免使用吃药打兴奋剂的模式,伤害到生态中的任何一个环节。 总体上,在健康的商业生态中,都需要考虑C(Customer)端用户,B(Bussiness)端商家,以及P(Platform)端平台三方的利益平衡。其中C端重点要满足用户体验,解决用户痛点需求;B端主要是广告主的ROI,需要给他带来收益;P端在中间进行调整平衡,需要考虑生态的良性发展同时需要考虑收入。

同时目前的一个大趋势是超级APP中提供给用户的内容和服务已经多种多样,已经是多模态的内容提供,同时穿插着内容,服务和广告。 如何对这些内容进行最高效的多目标混合分发,就是需要重点解决的课题。
例如此处单独看自然结果和原生广告的混拍, 如何在保证体验不受影响(或者大的影响)的情况下提升广告收入,就是一个非常值得研究的课题。

本文会以作者在多个平台的广告经验,向大家进行目前的主流方案。原文参见semocean.com及微信公众号:semocean

混排问题分类

以出行超级APP高德为例,在高德中用户搜索后,会给用户展示匹配的POI list,该过程中,广告投放的POI会和自然结果的POI进行混排。此时就会面临自然结果和广告如何进行混排的问题。此时混排一般有两大类模式:定坑和非定坑。

  • 定坑,简单来说定坑就是具体展示广告的位置,以及数量是固定的。该方式的优点是广告的数量,收入可控,而且自然结果和广告结果可以相对独立地进行优化; 缺点是广告质量和自然结果质量不能同一拉起,可能出现自然结果质量较好但出的广告质量很差,或者反过来的情况,导致用户体验或者广告收入受损
  • 非定坑 ,非定坑则相反,逻辑会相对复杂,广告和自然结果需要统一优化,不管是工程架构上,还是算法上,要求都更高。但能够同时考虑广告和自然结果的质量,理论上收入上限会更高。 同时非顶坑也可以有多种方法,各种方法的复杂度也不尽相同。

    图:(1)为定坑3和6,(2)为动态定坑,隔2插1,(3)为加权混排广告A和B

具体方法

定坑

即广告坑位出现的位置,数量,都是事先根据业务需要,或者实验方式确定下来的。 属于计划经济类型。 类似百度凤巢说前3个坑位可以出广告, 或者某些超级APP上说放回结果list结果中第3,5,8位置上可以出广告。 当然这些位置上, 如果广告系统自己判定觉得在某些流量上广告总体放回结果较差,也可以不出,但这个判定也是广告系统自己进行的判定,主要会影响最终的PVR(出广告流量占总体流量占比)

动态定坑

动态坑位方式比定坑模式进了一部,相当于在出广告的时候,加入了一定的个性化因素,可以将问题定义为对于每次流量三个参数的优化[N,S,I],其中N:出广告的条数,S:广告开始的坑位位置,I:广告之间的间隔。 根据每个请求的个性化信息,以及召回后的广告质量,来动态确定参数三元组的具体值。该方式能够在广告质量较高的时候,多出广告,且能够将广告排的更靠前

加权混排

该方式需要对自然结果和广告结果进行综合考虑,拉通排序的标准进行混排。本质上相当于需要将自然结果和广告结果的价值进行统一度量。简单来说的建模方式如下:
$v=\beta \cdot rankscore+ecpm$
其中$v$为同一价值度量,$rankscore$为作为自然结果的质量分,$ecpm$为预期的广告收入。其中$rankscore$由LTR模型进行预估。$\beta$为自然结果rankscore的权重
所以:

  • 自然结果:相当于$ecpm=0$,仅考虑rankscore自然结果的质量分。
  • 广告结果:广告结果rankscore一般偏低,但$ecmp=Q\cdot Bid$,相当于对广告的商业价值进行加权,一般情况下按照$Q=pctr$进行计算
    使用该方式就可以将自然结果和广告的价值度量进行拉起,之后进行统一排序。

    具体操作

    加权混排,在具体操作的时候,会面临以下几个问题:

    1. rankscore和ecpm一般都不是相同分布的,具体的值不能直接线性加权计算
    2. $\beta$ 值如何确定
    3. 如何计费

调整具体分布
因为rankscore和ecpm是两套相对独立系统的打分,所以理论上二者分布肯定不一样


【图:rankscore&ecpm为不同分布】

所以在排序前,需要将二者的分布拉齐,否则仅简单调整$\beta$值并不能解决问题。所以我们需要找到一个函数$f$,使得$ecpm=f(randscore)$,具体对两个分布进行插值可以求解。

$\beta$求解
这个就比较考验超参数调整的经验了,当然目前超参数的调整有较多的方法和开箱即用的框架。 一般现在较为常用的方法是贝叶斯优化(Bayesian Optimization)。 一般具体应用场景中,广告的实效性较强(受广告供给,预算等的限定,甚至很多APP分发的场景,每天的广告变化可能超过20%),所以该超参数调整很多时候需要做到准实时化。

计费方式
业界目前最常使用的方式,还是GSP方式的二价计费。其原理是扣费并不是直接按照胜出的广告的报价进行扣费,而是按照下一位广告的报价进行扣费,该方式的好处主要是简单,以及能够让竞价者能够按照自己内心的真实性进行报价(相对来说VCG会更加复杂)
经典的$cpc=\frac{ecpm_{i+1}}{pctr_i}$ 但在自然结果和广告混排的场景中,下一位可能是自然结果, 那如何进行计费?

思路是看下一个广告, 例如下一个当前广告假设为$A$,下一个广告为$B$,则:
$v_A=\beta rankscore_A+ecpm_A$ $v_B=\beta rankscore_B+ecmp_B$,则我们设计 :
$cpc=\frac{v_B-\beta \cdot rankscore_A}{pctr_A}$
其物理含义为:大思路仍然是GSP,但在进行扣费的时候, 广告主按照下一位广告的出价进行扣费,但会扣除掉自身因为自然结果体验值带来的位置前移。 相当于当前广告为了保持当前的位置,仅需要付出将结果从下一位值,提升到当前位置的钱。

端到端多目标模型混排

理论上来说端到端的结果是最好的方式,但该方式会导致自然结果排序和广告结果完全耦合黑盒化,提升了系统不可控的风险。 所以很多商业系统中都还不是这种方式。
而且自然结果体验和商业化变现目标的平衡,最后还是一个商业上的决策,并不是一个一尘不变的优化问题,例如如果一个上市公司有财报的压力,则可能会加大商业化的粒度,提升广告占比,或者在某段时间反过来更加注重用户的体验。

总结

总结下几种模式的优缺点:

模式 效果天花板 自然&广告结果耦合 系统风险
定坑 解偶
动态定坑 解偶
加权混排 耦合
端到端混拍 较耦合

广告实时性能力建设

先插个招聘信息: 急招推荐,搜索,语音算法,数据挖掘,工程人才,阿里P5~P9,欢迎推荐和自荐,扫码关注以下二维码了解详细信息

背景

在很多广告的场景,我们需要对广告及流量进行实时数据特征的建设。 例如对于广告侧,对于很多ADNet,可能每天的新广告能占20%, 新的广告没有很强的历史数据积累,需要实时地对效果数据特征进行统计以便反馈到模型中(很多广告联盟都会面临该情况) 对于流量侧, 用户的需求也是在实时变化的, 特别是对于很多低频的应用产品, 例如高德的用户, 可能平常也不用高德, 但使用高德的时候, 基本上都是带着LBS的本地生活需求来的, 而且这类的需求需要立马得到满足,否则用户可能就使用其他应用满足其需求了。例如异地的用户到了目的地城市需要住酒店, 就需要马上满足。

图:高德酒店搜索

所以, 无论从广告的角度, 还是流量的角度,都需要建设实时数据特征的能力来提升算法的效果。 同时,如何让实时方案更加高效, 如何保证流批一体的一致性, 就是极有挑战和意义的工作。

技术方案

广告侧能力建设

短周期统计特征

一般从模型使用特征的角度,在搜广推中,我们都会认为主要是流量+广告+场景的特征。 一般我们会周期性地(例如按天,或者按周,按月)统计广告在各个维度上的统计特征来作为广告侧的信号,例如统计广告在不同时间,不同地域,不同距离,甚至不同人群上的点击量等作为广告的统计特征。 上文提到,很多场景中, 广告更新比较频繁,这样就会导致在周期性统计会失效。 主要有以下原因:

  1. 新广告较多,导致很多广告没有周期性统计信息
  2. 长周期的广告侧统计相对稳定,但是很难捕捉近期快速的广告效果变化

基于以上考虑,我们不仅需要有长周期的统计特征作为模型输入,同时需要有短周期的实时特征,让模型能够感知到实时效果的变化。 具体的使用方式,可以根据特征物理含义的不同,使用不同的短周期对特征进行统计(例如15分钟/1小时/3小时/12小时),然后将统计值(例如impression,click, ctr,cvr)作为模型的输入。 具体的输入方式和特征的形式和模型相关, 例如可以直接embedding.

缺失值

很多时候, 如果最近一段短周期拿不到对应的广告特征,则我们使用最近的一段短周期特征作为替代,此时为了保证特征的一致性,我们在生产特征的时候, 就需要在特征生产计算的时候带上版本号, 例如版本号以生产的时间t表示,则在t+1的时间周期内, 我们都使用版本t的特征数据, 如果没有,则使用t-1周期产生的特征数据进行拟合。

效果

一般来说,如果广告变化越快,引入广告侧的实时数据,效果就越明显,在很多LBS的本地生活场景,引入这样的短周期(多个维度)后,点击率等指标的相对提升都超过10%

用户侧实时特征

在很多低频应用中,例如高德,美团等非kill time场景,用户带着需求而来,需要快速捕捉用户在端内的需求并在端内的各个场景都体现出来,此时用户侧的实时特征建设,更像是一个用户实时画像的快速动态刻画。 包括用户在各个场景的搜索,推荐内容的点击等显式和隐式的表达信息。 此时一方面需要有实时的流批一体建设捕捉这些信息,同时需要将在不同场景的query,点击,甚至挖掘内容均在同一个空间进行表达,此时一方面可以将所有的query,点击广告使用预训练的embedding进行pooling到同一空间,同时可以用人可以理解的tag体系进行这些信息的显性融合,之后作为模型的用户侧特征。 对于LBS这样的场景,经过丰富的实时特征处理,CTR的相对提升可以达到5%

工程实现

该部分不是本文的重点,后续可以由专门的文章介绍。但以上流批一体的操作,因为特征丰富多样,对时效性要求又极高,所以需要有高效的工程架构来支持。 我们团队目前实现了基于Blink的事件总线平台,能够通过配置, 就可以使用丰富的底层算子,生成Blink逻辑,并使用流水线的方式对实时数据进行加工,生成需要的特征供线上使用。类似于机器学习的tensorflow,能够根据底层算子自动进行组合。

目前平台还在打磨, 后续视情况可能会开源,有兴趣的同学也可以加入我们团队一起来进行该方面的建设。