竞价形势(Bid Landscape)预估总结

市场竞价预估

市场竞价预估的目标是预测每一次请求的市场价格,通常ADX和DSP都使用二价计费,因此市场价格也就是二价(计费价)。

准确地预测市场价格是一个重要的任务。对于ADX来说,每一次广告的请求的计费价都是可知的,因为可以轻易地用回归的方法拟合出。ADX可以用来预估每个DSP的竞价,从而选择要发送的DSP组合(比每次全部请求节约成本),还可以作为低价。但是对于DSP而言,只能获取到竞胜请求的计费价,对于竞价失败的请求,只能知道计费价比自己的竞价要高,这部分数据学术上称为删失数据,所以准确预测是十分困难的。

接下来总结关于模型的四个方法:

1. 只假设对数正态分布(2011 KDD)

参考文献:Bid landscape forecasting in online ad exchange marketplace

本文方法先用Fast-Correlation Based Filtering方法挑选出重要特征,然后提出了星树(star tree)结构存储每条样本的特征和竞价信息。除最后一层叶节点外,每一层表示一个特征,每个节点存储出现次数大于一定阈值的特征值,其余未出现的或次数较少的用星号(star)节点代替。最后一层的叶节点存储本条特征链路上的竞价数据的均值和方差。

上述特征树创建好之后,就相当于生成了一份新的数据集,然后用GBDT方拟合历史竞价,学习每条路径的特征和竞价信息的关系。

在线推理时,根据请求特征从树中寻找到最匹配的叶节点,取出期均值和方差。然后假设竞价服从对数正态分布,代入取到的均值和方差就可以计算出竞价预估值。对于广告活动粒度的预估,论文假设其为每个广告任务的混合分布(FMM),也就是将广告活动包含的样本预估结果进行聚合即可。

2. 假设正态分布+机器学习(2015 KDD)

参考文献:Predicting Winning Price in Real Time Bidding with Censored Data

总体思路:线性回归模型拟合竞胜数据,删失回归模型拟合竞输数据,实时竞价时使用两者混合后的模型。

2.1 线性回归模型拟合竞胜数据

表达式:viβTxi+εi,注意,本文中的winning price表示市场价(计费二价)。

其中,下标i表示样本序号;vi是市场价;βTxi表示市场价的均值;εi假设服从均值为0,方差为σ2的正态分布,用来学习删失信息。

2.2 删失回归模型拟合竞输数据

用上述公式拟合出竞胜均价之后,再用下述公式表示单次竞胜的概率:

P(vi<bi)=P(εi<(biβTxi))=Φ(biβTxiσ)

其中Φ表示累计概率分布,最终实际计算时,还是使用逻辑回归改写了这个公式:

P(vi<bi)=11+eβlrTxi

2.3 损失函数

在竞胜数据上,损失函数目标是逼近市场价,最小化残差

在竞输数据上,公式表示竞胜概率,取负对数作为损失函数,也是最小此公式

2.4 在线预测

预测时,使用混合模型,竞胜率 * 竞胜均价 + 竞输率 * 竞输均价

3. 假设多个分布+深度学习(2018 KDD)

参考文献:[Deep Censored Learning of the Winning Price in the Real Time Bidding](https://github.com/notlate-cn/tech-blogs/blob/main/papers/Bidding Landscape/2018-Deep Censored Learning of the Winning Price in the Real Time Bidding.pdf)

与第2条是同一个作者,本文主要变动点:把原来的线性回归替换成通用函数g,主要采用深度学习网络结构。

假设的分布用fF表示,可以灵活替换成正态分布、对数正态分布和Gumbel分布。

4. 不假设任何分布,直接预估分布(2019 KDD)

参考文献:Deep Landscape Forecasting for Real-time Bidding Advertising

大致梳理一下论文思路,因为原论文中应该是有几处公式错误,可以参考文章《论文复现Deep Landscape Forecasting for Real-time Bidding Advertising》,本文推导的公式与论文和CSDN文章均略有差异。

4.1 生存分析法

本文基于生存分析法(KM)进行问题分析,可阅读文章进一步了解《KM生存曲线的原理及画法》。下面简述一下:

KM法是这样估计生存曲线:首先计算出活过一定时期的病人再活过下一时期的概率(即生存概率),然后将逐个生存概率相乘,即为相应时段的生存率。需要对观察对象一直持续保持关注,但是很难做到终生关注,中间可能会丢失。当观察到结束事件时(比如死亡)就停止记录,其中生存率常用S表示。

则对应到市场竞价预估中,结束事件(比如死亡)竞胜表示。因为竞胜后,就不需要继续分析后续出价范围了。同样的,生存事件则用竞输表示。所以生存率S=p

4.2 在连续空间上表示竞胜率和竞输率

假设市场价(计费二价)z的分布概率密度函数为p(z),累积概率密度函数为P(z),出价为b时:

  • 竞胜率表示为:W(b)=P(z<b)=0bp(z)dz,含义是:当DSP的出价大于市场价时才能竞胜。

  • 竞输率表示为:S(b)=P(zb)=1W(b)=10bp(z)dz

上述表示好理解,但是没法计算,接下来就把市场价离散化,重新表示。

4.3 在离散空间上表示竞胜率和竞输率

把出价离散化,可以用计费的最小单位(分)表示,例如:0=b0<b1<b2<...<bl1<bl,那么相邻两个价格组成的区间记为V0=[b0,b1),V1=[b1,b2),...,Vl1=[vl1,v),Vl=[bl,bl+1),则:

  • 新增定义 市场价z恰好落到价格区间Vl的概率为:pl=P(zVl)

  • 竞胜率重新表示为:W(bl)=P(z<b)=i=0l1P(zVi)

  • 竞输率重新表示为:S(bl)=P(zb)=1W(bl)=1i=0l1P(zVi)

综上可得:

(5)pl=P(zVl)=W(bl+1)W(bl)=S(bl)S(bl+1)

4.4 引入RNN

此时就可以把离线的竞胜率和竞输率转换成模型,然后使用三元组(x,b,z)样本数据计算概率分布p(z)。其中x是输入特征,b为实际出价,z为市场价。当本次竞价获胜时,z为计费价;否则z为0(因为竞输时,DSP拿不到计费价)。

但是目前p(z)还是不好用模型结构表示,所以作者巧妙的构造了辅助变量来解决这个问题。

定义:在已知出价为bl1竞输的条件下,出价为bl时恰好获胜的概率hl,则:

(6)hl=P(zVl1|zbl1)=P(zVl1,zbl1)P(zbl1)=P(zVl1)P(zbl1)=pl1S(bl1)

其中zbl1包含范围zVl1=[bl1,bl),其交集为zVl1

由新的辅助变量可得:计算bl出价的恰好获胜概率只需要出价为bl1的竞输率和市场价格正好落在Vl1的概率。所以引入RNN模型(本文使用的是LSTM结构),用fθ表示,则公式(6)可改写为:

(7)hli=P(zVl1|zbl1,xixi;θ)=fθ(xixi,bl|rl1rl1)

公式(7)的含义就是:在上一个出价区间竞输(rl1rl1)的条件下,本次出价bl竞胜的概率,所以:

(7-1 本文作者补充)rl1rl1=1hl1i

基于公式(6)(7),重写竞输率和竞胜率为公式(8)

S(bl|xixi;θ)=P(zbl|xixi;θ)=P(zV0,zV1,zV2,...,zVl1|xixi;θ)(8.1)=P(zV0|xixi;θ)P(zV1|zV0,xixi;θ)P(zV2|zV0,zV1,xixi;θ)...P(zVl1|zV0,xixi,...,zVl2;θ)(8.2)=1P(zV1|zb1,xixi;θ)P(zV2|zb2,xixi;θ)...P(zVl1|zbl1,xixi;θ)(8.3)=k=1l1P(zVk|zbk,xixi;θ)(8.4)=k=1l1(1P(zVk|zbk,xixi;θ))(8.5)=k=1l1(1hk+1i)(8.6)=k=2l(1hki)(8.7)=k=1l(1hki)(8.8)

上式(8.7)(8.8)解释:当k=1时,h1i=P(zV0|zb0,xixi;θ)=1

W(bli|xixi;θ)=1S(bli|xixi;θ)=1k=1l(1hki)(8.9)

再由公式(6)得到,对于第i个样本来说,zi正好落在区间Vl1的概率为:

(9)pl1i=hliS(bl1i)=hlik=1l1(1hki)

4.5 损失函数

本文定义的损失函数形式类似于第3篇文章,采用了两种损失函数加权和的方式。

第一种方式是用市场价概率分布函数拟合竞胜数据。当已知给定的样本都是竞胜时,则优化目标可定义为最大化市场价z恰好落在Vl的概率,最好为1。定义损失函数为负对数似然函数,则最小化以下公式即可:

L1=log(xixi,ziDwinP(ziVl|xixi;θ))=log(xixi,ziDwinpli)=log(xixi,ziDwin(hl+1ik=1l(1hki)))=(xixi,ziDwin(loghl+1i+logk=1l(1hki)))=xixi,ziDwin(loghl+1i+k=1llog(1hki))=xixi,ziDwin(loghl+1i+k:kllog(1hki))(10)

第二种方式是用市场价累积概率分布函数同时拟合竞胜和竞输数据。对于竞胜数据,我们希望P(zi<bli|xixi;θ)1,对于竞输数据,我们希望P(zibli|xixi;θ)1。采用负对数似然函数定义损失函数如下:

Lwin=log(xixi,biDwinP(z<bli|xixi;θ))=log(xixi,biDwinW(bli|xixi;θ))=log(xixi,biDwin(1k=1l(1hki)))=xixi,biDwinlog(1k=1l(1hki))(11.1)=xixi,biDwinlog(1k:kl(1hki))(11.2)

Llose=log(xixi,biDloseP(zbli|xixi;θ))=log(xixi,biDloseS(bli|xixi;θ))=log(xixi,biDlose(k=1l(1hki)))=xixi,biDloselog(k=1l(1hki))=xixi,biDlosek=1llog(1hki)(12.1)=xixi,biDlosek:kllog(1hki)(12.2)

因为这两个损失函数是通过竞胜还是竞输区分的,所以作者设计了一个指示函数:

(13)wi={1,ifbi>zi,0,otherwise

就可以把LwinLlose合并成:

L2=Lwin+Llose=log(xixi,biDwinP(z<bli|xixi;θ))log(xixi,biDloseP(zbli|xixi;θ))=log(xixi,biD(W(bli|xixi;θ))wi(1W(bli|xixi;θ))1wi)(14.1)=xixi,biD(wilog(W(bli|xixi;θ))+(1wi)log(1W(bli|xixi;θ)))(14.2)

最终的损失函数为:

(15)argminθαL1+(1α)L2

公式实在太多了,可累坏了。

posted @   稳住·能赢  阅读(26)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示