Aside: DSP的bidding算法

Aside: DSP的bidding算法

作者:@Ainika Peng && @三疯兰尼斯特

时间:2018年1月

出处:zhuanlan.zhihu.com/p/32

声明:版权所有,转载请联系作者并注明出处。


0. 前言

基于SSP-ADX-DSP的程序化购买模式是目前非常流行的广告业务架构之一。

我们将会讨论基于DSP场景的公开竞价RTB算法。事实上,DSP涉及多种不同领域的算法;作为CTR预估系列的Aside,我们着重介绍与预估相关的一些算法、其中包括某些DSP独有的概念。我们可以看到,针对这个特殊业务场景的情况,预估算法作了哪些假设、解决了哪些问题。


我们不会从最基本的定义开始。您可以从网络和书籍中容易地找到我们对于DSP场景所作的一些前提假定:

  • 目标由KPI决定(如CTR、CVR等),视广告主的需求而不同。除非特殊说明,我们以CTR预估为例。
  • 向广告主以CPC方式收费、向ADX以CPM方式付费。
  • 投放计划受预算限制。在这种情况下,KPI一般含有约束目标(如最小化eCPC)。
  • 为简化问题,假定ADX采取第二高价拍卖机制(GSP/Generalized Second-Price auction)。


1. Ranking & Bidding

DSP如何赚钱?

  • 成本:从ADX手中购买impression的支出;
  • 收入:从广告主手中得到的点击事件收费。

由此引申出DSP中两类关键算法:

  • Ranking:我要从素材库中投放更好的广告,让它更可能被点击或转化、从而从广告主手中得到更多收入。
    • 主要技术:CTR/CVR prediction
    • 主要特征:
      • 广告位信息(ADX传过来的):页面位置、广告位大小等等;
      • 用户信息(ADX传过来的+你有的):用户cookie等ADX提供的特征、cookie mapping出的本地存储特征、向DMP取到的数据特征等等;
      • 素材信息(你有的):各个素材自身的特征。
  • Bidding:我要给ADX一个合适的报价,保证我的广告能展现的同时,不会因为买这个impression而太亏钱。
    • 主要技术:bid optimization
    • 主要特征:
      • 预估CTR或CVR;
      • 市场的出价成功率分布;
      • 用户预算限制。

可以看到,这不是一个自闭的优化系统,而是需要同时关注市场“行情”。因此,为了更好地进行bid optimization,需要对当前的市场状态建模,即bid landscape forecasting。

2. Bid Landscape Forecasting

在bidding中,我们应该向ADX报什么价格呢?

其它DSP也在觊觎这个impression。如果出价低了,我抢不到这次展现;如果出价高了,我又亏钱。

在理想的second-price auction中,最佳出价应当是truth-telling的;但在有预算等其他条件约束时,最佳出价策略需要修正。

自然想到看一下市场常规数据。都想要一个东西,我出1块钱,别人都出10块钱,肯定是不太合适。

所谓Bid Landscape Forecasting技术,就是看一下当前市场上出什么价格才可能拿下这个impression,由此指导我们的出价。

在数学上,一般将其建模为:给定bid request \bf x ,当你出价 b_x 时,竞标impression获胜的概率;记为 P(win|{\bf x}, b_x)

此处,我们用高维向量 {\bf x} 表明一个bid request,它也就是将来进行CTR预估时使用的特征。由于 x 是通过影响 b_x 来影响最终获胜概率的,我们把它简记为 w(b_x) \equiv P(win|{\bf x}, b_x)

根据竞拍规则我们可知:竞拍获胜的概率为市场价格 z 低于出价 b_x 的概率:

~~~~~~~~~~~~~~~~~~~~~~~~~~~w(b_x) \equiv P(win|{\bf x}, b_x) = \int_0^{b_x}p_z^{\bf x}(z)dz.

实际应用中,一般使用广告计划的价格分布 p_z(z) 代替每个素材的价格分布进行估计,防止计算过于复杂和数据过于稀疏。


如何估计 p_z(z) ?一个比较简单的想法是利用历史信息进行统计,比如

~~~~~~~~~~~~~~~~~~~~~~~~~~~w_o(b_x) = \frac{\sum_{({\bf x}', y, z)\in D}I(z\lt b_x)}{\left|D\right|}.

y : 观察到的请求 x' 最终的用户响应(如点击、转化与否);只有bid获胜后才能取到该值。
z : 观察到的请求 x' 最终的市场价格;只有bid获胜后才能取到该值。
D=\{({\bf x}, y, z)\}: ADX公开的所有可见竞价获胜数据。
I :indicator function,在条件满足时取1,否则取0。

[1]中使用了一种树状结构来进行bidding的统计,并使用GBDT进行优化。这使得对于一条新请求,即使其中的部分特征是新出现的,也可以从泛化节点来推断包含该请求的一类请求的平均出价和方差。这是一种层次性的统计方法。

上图:使用GBDT优化的star-tree结构。对于特征 a_1b_1c_1 的impression,将路径 *****c_1*b_1**b_1c_1a_1**a_1*c_1a_1b_1*a_1b_1c_1 下的impression参与进行统计计算。

但基于统计的方法存在一个假设:不存在数据缺失(data censorship),即我作为DSP赢下了所有bidding请求,并可以观察到所有bidding的市场价格。然而,在RTB中,各家DSP的策略不断调整,导致每家DSP都无法得到竞标失败的数据的反馈,且这种数据缺失是非随机的。这会导致非常严重的后果:从ADX得到的反馈用于训练的数据和bid request时的数据分布不同。

上图:竞价过程等同于一个动态的数据过滤器,随bid value而不同。由于竞价失败的请求无法得到曝光,不能出现在模型依赖的训练数据中,整个训练数据相对于full-volume data是有偏的。

训练数据与测试数据的总体分布相同”是监督学习(supervised learning)的理论基石。在常见的业务场景如推荐中,训练样本与测试样本存在采样偏差,但总体分布是相同的;而在DSP中,样本的总体分布都不相同。在有偏分布下,任何监督学习方法都是低效且过拟合的;需要的一种解决思路是将有偏的训练数据分布试图重构到整体分布上。

很多算法被设计用来针对“存在非随机数据缺失”的情况进行分布估计。Kaplan-Meier Product-Limit[2]是其中一种较为高效而简洁的方法。步骤如下:

1. 将训练数据排序为 \left\langle b_j, d_j, n_j \right\rangle _{j=1...M} ,其中bid price b_j \lt b_{j+1}

  • d_j 表示在 market price 等于 b_j-1 时竞标获胜的数目。
  • n_j 表示在 bid price 等于 b_j-1 时不能获胜的auction数目,包括:
    • 在 market price 不低于 b_j-1 时竞标获胜的数目,以及
    • 在 bid price 不低于 b_j-1 时竞标失败的数目。
这里的两个概念含义不同:market price表示以bid price竞价获胜后的实际付费额。在second-price auction中,market price数据只在竞标获胜后可以从ADX获得,且一般会低于bid price。
由于该算法原文用来预测的是存在离院患者的疾病生存率问题,所以搬过来后需要 假定bid price是离散的。如果实际业务中的bid不是整数型,需要将其视为离散序列。

2. 可以求得在bid price b_x 下竞标失败的概率为

~~~~~~~~~~~~~~~~~~~~~~~~~~~l(b_x) = \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j}

3. 因此竞标获胜的概率为

~~~~~~~~~~~~~~~~~~~~~~~~~~~w(b_x) = 1 - \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j}

下图为一个例子:左图表示bid price、是否获胜、获胜时的market price;右图计算竞标获胜率估计 w(b_j) 和统计方法估计 w_0(b_j)

可以看到,由于lose在价格低的情况下发生,导致训练数据右偏,统计方法估计的竞标获胜率会普遍偏高

3. Bidding Adjustment

在bidding optimization中可以看到各种bid landscape forecast的身影,但早期算法并没有意识到数据有偏的问题,主体思路是基于当前市场状况进行基准调整。[3]是较为基础的一个例子,让实际出价在运营设定的bid price上根据当前inventory的CVR实际表现进行线性变换:

~~~~~~~~~~~~~~~~~~~~~~~~~~~B^* = B * \Phi^*

其中

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~\Phi^* = \frac{p(c|u,i,a)}{E_j[p(c|u,i,a)]}

简单解释是:如果广告投在这个inventory上能获得两倍的CVR,那么我就应该出两倍的价钱。


[4]中则使用了加性修正:

~~~~~~~~~~~~~~~~~~~~~~~~~~~ \text{bid} = \text{eCPI} - \alpha

其中  \text{eCPI} = \text{CTR} \times \text{CPC}\alpha 为一个调整参数。文中认为:当市场竞争趋于激烈时,应当降低 \alpha 以提高价格参与竞争。在这个模型中,\alpha 由一个单独模型进行调节,主要依据历史上的 \alpha 值进行迭代修改,例如使用model-based controller:

~~~~~~~~~~~~~~~~~~~~~~~~~~~\alpha_j(t+1) \leftarrow \alpha_j(t) - \gamma\left(F^{-1}(r_j(t)) - F^{-1}(r'_j(t))\right), \quad \forall j

其中, F(b_{ij}; \theta) = p(w\le b_{ij}) 表示以 b_{ij} 进行bidding时获胜的概率( i 为impression, j 为campaign); r_j(t)r'_j(t) 表示在时间t的需求胜率和实际胜率, F^{-1} 会将其映射回某一个bid value。 \gamma 为控制参数。

可以看到,这个方法已经开始使用估计出价胜率的方法估计出价偏差。


[5]将bidding问题更加形式化,定义为在campaign约束下寻找最大化campaign KPI的问题。这个问题的解是一个从 estimated CTR f({\bf x}) 映射到 bid price b(f({\bf x})) 的函数 b

在auction volume T 和 campaign budget B 约束下,问题定义为

~~~~~~~~~~~~~~~~~~~~~~~~~~~\arg\max_{b()}T\int_{\bf x}f({\bf x})w(b(f({\bf x})))p_x({\bf x})d{\bf x} \\~~~~~~~~~~~~~~~~~~~~~~~~~~~ \text{subject to }\quad T\int_{\bf x}b(f({\bf x}))w(b(f({\bf x})))p_x({\bf x})d{\bf x} = B

其中 w(b(f({\bf x}))) 表示给定bid request \bf x \rightarrow estimated CTR f\rightarrow bidding function b\rightarrow winning probability w 的一系列过程的结果。

由Euler-Lagrangian条件:
~~~~~~~~~~~~~~~~~~~~~~~~~~~f({\bf x})p_x({\bf x})\frac{\partial w(b(f({\bf x})))}{\partial b(f({\bf x}))} - \lambda p_x({\bf x})\left[w(b(f({\bf x})) + b(f({\bf x}))\frac{\partial w(b(f({\bf x})))}{\partial b(f({\bf x}))} \right] = 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~ \Rightarrow \lambda w(b(f({\bf x}))) = \left[f({\bf x})-\lambda b(f({\bf x}))\right]\frac{\partial w(b(f({\bf x})))}{\partial b(f({\bf x}))}
因此最优 bidding function b_{ORTB}(f({\bf x})) 取决于 winning function w(b) 。举个例子,一种常用的设定是
~~~~~~~~~~~~~~~~~~~~~~~~~~~w(b(f({\bf x}))) = \frac{b(f({\bf x}))}{c + b(f({\bf x}))}
其中 c 是一个常数,如下图。其含义为:当出价较低时,每提高一个单位出价带来的对winning probability的提升较大。

~~~~~~~~~~~~~~~~~~~~~~~~~~~b_{ORTB}(f({\bf x})) = \sqrt{\frac{c}{\lambda}f({\bf x}) + c^2} - c .


[6]则在[5]的基础上形式化地讨论了数据有偏的问题。假设bid request的分布是 {\bf x} \sim p_x({\bf x}) 而曝光数据 D=\{({\bf x}, y, z)\} 的分布是 {\bf x} \sim q_x({\bf x}) ,则

~~~~~~~~~~~~~~~~~~~~~~~~~~~\underbrace{q_x({\bf x})}_{\text{impression}} = \underbrace{P(win|{\bf x}, b_x)}_{\text{auction selection}} \cdot \underbrace{p_x({\bf x})}_{\text{bid request}}

在此条件下,bidding objective所依赖的是实际能取到的训练数据:

\arg\max_{b()}T\int_{\bf x}f({\bf x})w(b(f({\bf x})))\frac{q_x({\bf x})}{w(b_x)}d{\bf x} \\ \text{subject to }\quad T\int_{\bf x}b(f({\bf x}))w(b(f({\bf x})))\frac{q_x({\bf x})}{w(b_x)}d{\bf x} = B

其Euler-Lagrangian条件:

~~~~~~~~~~~~~~~~~~~~~~~~~~~\begin{split} &~~~~~~ \partial\mathcal{L}(b(f({\bf x})), \lambda) / \partial\lambda = 0 \\ & \Rightarrow \int_{\bf x}b(f({\bf x}), \lambda)w(b(f({\bf x}),\lambda))\frac{q_x({\bf x})}{w(b_x)}d{\bf x} = \frac{B}{T} \\ & \Rightarrow \frac{1}{\left|D\right|}\sum_{({\bf x},y,z)\in D} b(f({\bf x}),\lambda)\frac{w(b(f({\bf x}),\lambda))}{w(b_x)} = \frac{B}{\left|D\right|} \end{split}

因此,其objective可设置为最小化其loss,即

~~~~~~~~~~~~~~~~~~~~~~~~~~~ \min_\lambda \sum_{({\bf x},y,z)\in D} \frac{1}{2}\left(\frac{b(f({\bf x}),\lambda)w(b(f({\bf x}),\lambda))}{1- \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j}} - \frac{B}{\left|D\right|}\right)^2

b(f({\bf x}),\lambda)\lambda 单调递减, w(b_x)b(f({\bf x}),\lambda) 单调递增。因此 objective 对 \lambda 是convex的。


由此提出的Bid-aware Gradient Descent(BGD)梯度优化方法:

 \lambda \leftarrow \lambda - \eta\cdot\overbrace{\frac{1}{1- \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j}}}^\text{instance reweighting}\cdot\overbrace{\left(\frac{b(f({\bf x}),\lambda)w(b(f({\bf x}),\lambda))}{1- \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j}} - \frac{B}{\left|D\right|}\right)}^\text{gradient direction}\cdot \\ \underbrace{\left(\frac{\partial b(f({\bf x}),\lambda)}{\partial\lambda}w(b(f({\bf x}),\lambda)) + b(f({\bf x}),\lambda)\frac{\partial w(b(f({\bf x}),\lambda))}{\partial\lambda}\right)}_\text{bidding function gradient}


可以看到,相比于一般的bidding function gradient,多了两项正则:

  1. instance reweighting: 较小的历史bidding b_x\rightarrow 较大的weight \rightarrow 在训练中更重视。直观理解,较小的bidding出现在training data里的概率不高,在这个价位上大部分的bidding都失败了。因此可以假定,当看到一个较小bidding的训练数据时,我们存在着更多相似的“沉没数据”,因此在补齐数据分布的时候要将其“补全”。
  2. 历史bidding影响梯度方向。当第二项gradient direction为0时,模型收敛。而 B/|D| 约束着模型将预算平均分配给new bids。对于被减数项,预估价格的胜率 w(b(f({\bf x}),\lambda)) 和历史出价的胜率 1- \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j} 都参与调整一条样本在训练和预测时出现的概率偏移。

4. CTR Adjustment

其实这一步应该在Bidding Adjustment之前。但如果不考虑数据偏移,任何常规的CTR预估方法都可以起效,比如Logistic Regression[7]。如果考虑数据偏移的话,[6]中提供了和bidding adjustment类似的方法,即对于LR:

~~~~~~~~~~~~~~~~~~~~~~~~~~~{\bf \theta} \leftarrow (1-\eta\cdot\lambda){\bf \theta} + \frac{\eta\cdot y\cdot e^{-y{\bf \theta}^T{\bf x}} \cdot {\bf x}}{(1+e^{-y{\bf \theta}^T{\bf x}})(1- \prod_{b_j\lt b_x} \frac{n_j-d_j}{n_j})}

我们看到仍然是通过影响梯度的权重来模拟数据的权重。对较低价格获胜的bid,它在训练数据里出现概率更低,因而提升了其梯度权重。

可以看到这个思想与本身CTR预估方法是无关的,而在消除分布偏移后,各种预估算法也可以继续将重心放在AUC和CTR的提升上。那么用什么算法好、怎么用才合适,请大家继续关注本专栏咯:)

5. Unbiased Data

最后要提一句数据工程问题。DSP本身是一个missing data problem,因此无论模型需要还是作为测试基准,unbiased data都是必要的。一种常用的手段是使用绝对高价无差别地随机竞标一部分流量作为无偏数据,使用这组数据作为upper bound。它对于分辨是数据分布问题还是模型问题非常有效。


References:

[1] Bid Landscape Forecasting in Online Ad Exchange Marketplace.

[2] Non-parametric Estimation from Incomplete Observations.

[3] Bid Optimizing and Inventory Scoring in Targeted Online Advertising.

[4] Real-Time Bidding Algorithms for Performance-Based Display Ad Allocation.

[5] Optimal Real-Time Bidding for Display Advertising.

[6] Bid-aware Gradient Descent for Unbiased Learning with Censored Data in Display Advertising.

[7] Predicting Clicks: Estimating the Click-Through Rate for New Ads.

发布于 2018-01-05

文章被以下专栏收录