论文阅读 (014): Real Time Bid Optimization with Smooth Budget Delivery in... | 技术点评

981 阅读13分钟

1 背景

为什么要做预算控制(Budget Pacing)?

通常,使用预算平滑消耗的约束条件(表示为在设定的时间之前购买不超过一定比例的感兴趣的曝光),可以防止广告主过早地消耗完预算或避免爆发式的支出率。

Typically, a smooth budget delivery constraint, expressed as not buying more than a set fraction of the impressions of interest before a set time, is used to prevent the campaign from finishing the budget prematurely or avoiding a bursty spending rate.

这一限制通常有助于广告主对其广告产生持续的影响,避免在高峰时段推出大量广告(同时性能可能下降),并探索更广泛的受众范围。

进行预算控制,可以避免两种情况发生

  • 广告活动过早停止:广告主希望他的广告在一天中过早花完预算,以免错失剩下时间的机会,如图1(a)所示

  • 支出波动:广告客户希望能够定期地分析广告投放的效果,预算的高波动使得结果的一致性令人怀疑,如图1(b)所示

如果将一天的广告预算按照时间平均分配,如图1(c)所示,则会产生两个问题:

  • 流量问题:由于受众目标的不同,在线交易量在一天中变化很大。比如在前半天可以收到比后半天更加相关的流量,如果不是统一地进行预算分配,可能当天无法消耗完预算或者在后半天购买低质量的流量。针对流量采用统一的预算控制可以在某种程度上解决这个问题,如图1(d)所示

  • 性能问题:对于不同的受众群体,在线流量的质量在一天内会发生变化。无论是通过CPC(cost-per-click),CPA(cost-per-action ),CTR(click-through-rate)还是AR(action-rate)来衡量此质量,预算控制算法都应将大部分预算分配给一天中的高质量时段。如图1(e)所示,并且对于高质量的周期通常很少有选择。这可能会导致较大的波动,可能会违反预算平滑消耗的限制

文章贡献

针对上述问题,文章的贡献在于:提出了一种在线方法来优化性能指标,同时满足每个广告的预算平滑消耗的限制,具体如下

  • 应用控制反馈循环来迭代估计未来支出率,以实现预算平滑消耗的约束

  • 支出率用于选择高质量的曝光,并根据之前的效果分配来调整出价,以最大限度地提高效果目标

2 方法

文章针对两种广告分别进行了预算控制,两种广告为

  • Flat CPM campaigns:出价为一个固定的价格,广告评价指标为CTR或AR

  • Dynamic CPM (dCPM) campaigns:根据不同的流量优化广告出价,广告评价指标为eCPC和eCPA

统一的优化框架如下

minCTR,AR,eCPC or eCPA  s.t. tTs(t)Bϵs(t)btδtt{1,,T}eCPMM(2)\begin{array}{ll}\min & -\mathrm{CTR},-\mathrm{AR}, \mathrm{eCPC} \text { or eCPA } \\ \text { s.t. } & \left|\sum_{t}^{T} \mathbf{s}(t)-B\right| \leq \epsilon \\ & \left|\mathrm{s}(t)-b_{t}\right| \leq \delta_{t} \quad \forall t \in\{1, \ldots, T\} \\ & e C P M \leq M\end{array} \quad(2)

其中第一个约束为当天总预算的约束,将一天的时间分成T份,s(t)s(t)是在时间段t消耗的预算;第二个约束是预算平滑消耗的约束,即对t时刻预算消耗的约束;第三个约束为当天的eCPM不能超过上限M,即不能过高出价。

在这个公式中,优化参数为b(t)b(t),因为总预算BB和平均曝光成本上限MM是由广告主设定的。

2.1 预算平滑消耗

预算控制的最初想法是将每日预算作为输入,并实时计算每个广告的消耗时间表。基于消耗计划,DSP将尝试将获取曝光的行动在一天内分散开来。把一天分成T个时间段,在每个时间段内,为每个广告分配预算。

要查看出价优化系统的消耗率(pacing rate)与其他参数之间的关系,参考如下方程:

s(t)=jItcjxjimps(t)reqs(t)bids(t)reqs(t)imps(t)bids(t)reqs(t)pacing_rate(t)win_rate(t)(3)\begin{aligned} \mathbf{s}(t) & =\sum_{j \in \mathbb{I}_{t}} c_{j} x_{j} \propto \operatorname{imps}(t) \\ & \propto \operatorname{reqs}(t) \frac{\operatorname{bids}(t)}{\operatorname{reqs}(t)} \frac{\operatorname{imps}(t)}{\operatorname{bids}(t)} \\ & \propto \operatorname{reqs}(t) \cdot \operatorname{ pacing\_rate }(t) \cdot \operatorname{win\_rate }(t) \end{aligned} \quad(3)

其中s(t)s(t)是在时间段t消耗的预算,reqs(t)reqs(t)是为t时刻满足定向条件的广告请求数目,bids(t)bids(t)是为t时刻对于收到的广告请求,参与竞价的数目,imps(t)imps(t)为t时刻曝光数目。通过上述方式,定义了pacing ratewin rate

注:如果假设满足某个广告目标受众的那些广告请求均匀地分布在所有传入广告请求中,则可以用一个常数来替换reqs(t)reqs(t)

为了取得进展,希望采用一种动态顺序方法,在这种方法中,将从上一个时间间隔花费中获得反馈,并为下一个时间间隔调整消耗率。通过计算比例(3),可以通过简单的递归获得下一个时间间隔t+1t+1的消耗率。

pacing_rate (t+1)(t+1)

== pacing_rate (t)s(t+1)s(t)reqs(t)reqs(t+1)win_rate(t)win_rate(t+1)(t) \frac{\operatorname{s}(t+1)}{\operatorname{s}(t)} \frac{\operatorname{reqs}(t)}{\operatorname{reqs}(t+1)} \frac{\operatorname{win\_rate }(t)}{\operatorname{win\_rate }(t+1)}

== pacing_rate (t)bt+1s(t)reqs(t)reqs(t+1)win_rate(t)win_rate(t+1)(4)(t) \frac{b_{t+1}}{\operatorname{s}(t)} \frac{\operatorname{reqs}(t)}{\operatorname{r e q s}(t+1)} \frac{\operatorname{w i n \_ r a t e}(t)}{\operatorname{w i n \_ r a t e}(t+1)} \quad(4)

其中reps(t+1)reps(t+1)win_rate(t+1)win\_rate(t+1)是预测的下一个时间间断的请求数和winning rate。可以使用历史数据进行预测,只关心这些参数与它们之间值的比率,而不一定是它们的绝对值。

将(4)中的未来支出,即s(t+1)s(t+1)设置为和时间间隔t+1处的理想期望支出bt+1b_{t+1}相等,以便施加预算约束。bt+1b_{t+1}的不同选择为预算控制引入了不同的策略。例如,一个简单的策略,称为统一控制(uniform pacing),试图在一天中为给定的活动平均花费预算。通过将未来支出bt+1ub_{t+1}^u(u表示统一)定义为

bt+1u=(Bm=1ts(m))L(t+1)m=t+1TL(m)(5)b_{t+1}^{u}=\left(B-\sum_{m=1}^{t} \mathbf{s}(m)\right) \frac{L(t+1)}{\sum_{m=t+1}^{T} L(m)} \quad(5)

其中第一项表示剩余的预算,第二项时段t+1t+1和剩余时间的比值,如果时间间隔相等,存在如下关系

bt+1u=(Bm=1ts(m))1Tt(6)b_{t+1}^{u}=\left(B-\sum_{m=1}^{t} \mathbf{s}(m)\right) \frac{1}{T-t} \quad(6)

文中提出的策略是,对某个广告,在有更多机会获得感兴趣的事件(点击或转化)的时间段上花更多的钱。为此,查看活动历史数据,并在每个时间段测量广告的性能。在此基础上,建立了一个离散的概率密度函数,用一系列点击或转换概率来描述:p0...pTp_0...,p_T假设每天有T个时间间隔,tTpt=1\sum_t^{T}p_t=1。现在在每个时间间隔,计算下一个时间间隔的理想支出bt+1pb^p_{t+1}(p表示概率),如下所示

bt+1p=(Bm=1ts(m))pt+1L(t+1)m=t+1TpmL(m)(7)b_{t+1}^{p}=\left(B-\sum_{m=1}^{t} \mathbf{s}(m)\right) \frac{p_{t+1} \cdot L(t+1)}{\sum_{m=t+1}^{T} p_{m} \cdot L(m)} \quad(7)

如果时间间隔相等,有如下关系

bt+1p=(Bm=1ts(m))pt+1m=t+1Tpm(8)b_{t+1}^{p}=\left(B-\sum_{m=1}^{t} \mathbf{s}(m)\right) \frac{p_{t+1}}{\sum_{m=t+1}^{T} p_{m}} \quad(8)

注:如果对于某些jj来说pj=0p_j = 0,那么该广告将不会在该时间段内花钱,因此,它将永远不会在jj时间段探索出现的机会。为了避免这样的情况方式,可以结合bt+1ub_{t+1}^ubt+1pb^p_{t+1}两种策略。

2.2 选择高质量广告请求

在计算出出价率后,每个广告都可以应用此信息自适应地选择某些高质量流量进行竞价,并调整竞价价格,以最大限度地提高收益。下面讨论Flat CPM campaigns和Dynamic CPM (dCPM) campaigns。

Flat CPM campaigns

以固定价格cc^{*}进行出价,并不知道竞价成功的概率(没有CTR或AR的信息)。为了消耗平滑的约束,曝光需要满足如下约束(没有考虑广义第二出价,认为收费即出价

imps(t)=s(t)c\operatorname{imps^{*}(t)} = \frac{s(t)}{c^{*}}

这样多的曝光产生时,满足如下约束

bids(t)=imps(t)win_rate(t)\operatorname{bids^{*}(t)} = \frac{\operatorname{imps^{*}(t)}}{\operatorname{win\_rate(t)}}

同样的,需要获得这么多竞价机会,满足如下约束

reqs(t)=bids(t)pacing_rate(t)\operatorname{reqs^{*}(t)} = \frac{\operatorname{bids^{*}(t)}}{\operatorname{pacing\_rate(t)}}

将从一组传入的广告请求中选择这些广告请求,这些请求的点击率或转换率很高。为此,基于每个活动的历史数据构建了CTR或AR分布qt(x)q_t(x)的经验直方图,其中qt(x)q_t(x)表示时间间隔t中被认为具有x的CTR或AR的ad请求的数量,例如,参见图2。

文中的在线算法在时间间隔t中找到一个阈值τ(t)\tau(t)来过滤qt(x)q_t(x)区域中具有低CTR或AR的ad请求,从而实现平滑控制(是要实时计算CTR和AR的)。该阈值可表示为

τ(t)=argminxx1qt(s)dsreqs(t)\tau(t)=\arg \min _{x}\left|\int_{x}^{1} q_{t}(s) d s-\operatorname{reqs}^{*}(t)\right|

qt(x)q_t(x)是通过历史数据统计的,对于当前ad的请求分布,如果不满足qt(x)q_t(x),则会在时间间隔中引起振荡。为了防止这种情况产生,评估了阈值参数τ(t)\tau(t)的置信区间。首先使用下面方式来更新阈值τ(t)\tau(t)的均值μτ(t)\mu_{\tau}(t)和方差στ2(t)\sigma_{\tau}^{2}(t)

μτ(t)=μτ(t1)+1t(τ(t)μτ(t1))\mu_{\tau}(t)=\mu_{\tau}(t-1)+\frac{1}{t}\left(\tau(t)-\mu_{\tau}(t-1)\right)

στ2(t)=t1tστ2(t1)+1t(τ(t)μτ(t1))(τ(t)μτ(t))(10)\sigma_{\tau}^{2}(t)=\frac{t-1}{t} \sigma_{\tau}^{2}(t-1)+\frac{1}{t}\left(\tau(t)-\mu_{\tau}(t-1)\right)\left(\tau(t)-\mu_{\tau}(t)\right) \quad(10)

假设τ(t)\tau(t)满足高斯分布,那么τ(t)\tau(t)的上下界为μτ(t)+γστ(t)(d)\mu_{\tau}(t) + \gamma \frac{\sigma_{\tau}(t)}{\sqrt(d)}μτ(t)γστ(t)(d)\mu_{\tau}(t) - \gamma \frac{\sigma_{\tau}(t)}{\sqrt(d)},其中d是查看数据历史以进行统计的天数。

临界值γ=1.96\gamma=1.96提供95%置信区间。在每个时间间隔中更新CTR或AR阈值的上限和下限。

当一个ad请求到达系统时,它的CTR或AR值首先由统计模型估计。如果预测值大于阈值上限,则将保留此ad请求,并将固定出价vv^{*}进行竞价。

如果预测值小于阈值的下限,则此ad请求将被简单地丢弃,而不需要进一步处理。如果预测值在上下界之间,则ad请求将随机选择,概率等于消耗率pacing_rate(t)pacing\_rate(t)。该方案虽然近似,但确保了在高质量和低质量广告请求边界上继续机会探索的同时,满足预算平滑消耗的约束。

Dynamic CPM Campaigns

对于dCPM,可以对每个广告动态地修改出价,目的是以更低成本获得更多的高质量曝光。首先构建竞价直方图,将t时间间隔中出价cic_i的平均值记为cc^{*},用于和Flat CPM campaigns中出价对应。

然后,从一个基本的竞价价格开始,考虑到当前的pacing_rate(t)pacing\_rate(t),适当地提高或降低竞价价格,以满足预算平滑。以CPA计费为例,进行讨论

注:pacing_rate(t)pacing\_rate(t)控制这出价的策略

如果出价不够高,就可能无法赢得竞价;如果出价太高,会导致从CPA上升。为了调节出价,设定pacing_rate(t)pacing\_rate(t)的两个阈值0β1β210 \leq \beta_1 \leq \beta_2 \leq 1

考虑pacing_rate(t)pacing\_rate(t)的三个区间

  • 安全区:当pacing_rate(t)β1pacing\_rate(t) \leq \beta_1,由于受众定位定向,没有消耗不完的情况(预算够少,相对的概念)

  • 关键区:当β1<pacing_rate(t)β2\beta_1 < pacing\_rate(t) \leq \beta_2,正常进行消耗

  • 危险区:当β2<pacing_rate(t)\beta_2 < pacing\_rate(t),很少有时间来获得足够多的曝光

典型的dCPM竞价目标是达到或超过CPA目标G(与eCPA相比)。使用这个目标值来定义一个基本竞价价格ui=AR×Gu_i = AR \times G,AR为对当前请求,模型预测的结果。如果竞价在关键区域,使用c^i=ui\hat{c}_i = u_i作为出价,不需要过多的调整出价。

安全区域降低出价,假设在活动中,实际出价为cic_i, 可以建立关于θ=cic^i\theta = \frac{c_i}{\hat{c}_i}的直方图,可以在直方图底部1%到2%处找到θ\theta^{*},出价为c^i=θui\hat{c}_i = \theta^{*}u_i

在危险区,产生消耗无法达成的原因有:

  • 受众定位限制太紧,因此,没有足够的广告请求可以参与竞价

  • 即使经常竞价,出价也不够高,不足以赢得公开拍卖

针对第二种情况,提高出价,考虑一个出价上限C。通过参数ρ1\rho^{*} \geq 1来提高出价价格,并随着pacing_rate(t)pacing\_rate(t)增加,文中使用了线性增加的方式

ρ=1+C/c11β2(pacingrate(t)β2)(11)\rho^{*}=1+\frac{C / c^{*}-1}{1-\beta_{2}}\left(\operatorname{pacing}_{-} \operatorname{rate}(t)-\beta_{2}\right) \quad(11)

最终出价为c^i=ρui\hat{c}_i = \rho^{*} u_icc^{*}是历史出价的平均值,并且动态的进行变化(变化较慢)。

3 实际问题

3.1 冷启动问题

当新活动开始时,点击或转换事件需要一些时间反馈给系统,因此没有足够的信息来执行CTR或AR估计以及出价优化。这被称为冷启动问题。遵循类似的想法,通过推断现有活动之间的相似性,应用用户和发布者属性等内容特性来推荐高质量网站和受众群体的列表。此外,在在线竞价优化过程中,采用了基于上下文epsilon贪婪的策略。如果传入的广告请求位于其中一个推荐的发布者或受众群中,则会发出更高的出价。否则,广告请求将随机选择一个默认的出价价格探索看不见的网站和用户。随着时间的推移和数据的积累,在线搜索的活跃度将降低,常规预测模型将在竞价优化中发挥主要作用。

3.2 防止经费超支

由于预算支出是由速度控制的,如果突然出现大量的广告请求,总的每日支出可能会超过分配的每日预算B。为了克服这个问题,已经实施了几个监控过程,以经常检查总的每日预算支出以及间隔在每个时间段t中花费。如果总花费超过每日预算B,活动将完全停止。

如果间隔时间超过bt+δb_t+\delta,竞价活动将暂时暂停,直到下一个时隙t+1。

3.3 分布式结构

图3示出了每个单独ad请求的简化算法流程图。请注意,这个提交竞价的工作流需要在不到50毫秒的时间内完成,并且需要在一秒钟内处理将近一百万个广告请求。因此,整个bid优化在跨多个数据中心的多个分布式计算集群上实现并并行化。离线训练过程利用R、Pig和Hadoop生成分层的CTR和AR估计,并在大量广告中训练特定广告的预测模型。在线进程将传入的广告请求流到许多服务器,并通过实时消息总线评估出价。

4 实验

4.1 控制策略对比

离线的实验,具体细节参考原文。分别对比均匀控制策略(公式 6 所示),文中提出的控制策略(公式 8 所示)和理想预算控制的对比。对比均匀控制策略理想预算控制,结果如下所示,误差小于总预算1%。

对比本文提出的控制策略和理想预算控制,结果如下所示,误差为总预算2.3%。

4.2 在线实验结果

实验设置参见原文,结果如下面3个表所示

结论有:

  • 点击率有所提升,提升巨大

  • CPC上升,CPA下降(这里文章中用lift来描述,感觉有点不准确)

5 讨论

  • 选择高质量流量进行出价时,根据pacing_rate(t)pacing\_rate(t)进行调节,但是pacing_rate(t)pacing\_rate(t)的分配根据当天流量的分布来决定的,当时间间隔流量高时,pacing_rate(t)pacing\_rate(t)也高,这个时候降低出价是不是不太合理,没有考虑广告主之间的竞争,做bid landscape预测?

  • 对于实现平滑控制,使用了τ(t)\tau(t)的上下界进行调节,合理,但是没有实现直接调节t时刻间隔预算本身

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情