做竞价广告的算法同学应该都遇到过这种时刻:账户的出价策略没动,预算、定向、素材也没动,但某一天开始,实际成交成本突然走高,想加大投放却发现跑量怎么都追不回来。这种“环境变了”的失控感,正是KDD 2025上的Bid2X想要正面回答的问题。论文标题写得很直白:基于基础模型视角的广告竞价环境建模。一句话里有两个重点:竞价环境建模是任务,基础模型视角是解题角度。前者在计算广告里是个老问题,后者是这个方向以前少有人认真尝试的新变量。
很多同学一听到“基础模型”就以为是什么神奇的大模型炼丹,然后把论文放到一边。我建议先别急着划走。这篇文章值得关注,恰恰是因为它把广告竞价这个工业场景和基础模型能力做了一个务实的结合:不是用大模型去生成文案,而是用大模型的表征、先验和条件生成能力,去刻画一个随时在变的竞争环境。下面我会从问题本身说起,再拆Bid2X的建模思路、落地工作流、评估方法和容易踩的坑,最后聊聊我自己的实战体会。不管你是做DSP出价策略的,还是研究竞价博弈、智能拍卖机制的,这篇解读应该都能给你一些启发。
1. 先厘清:竞价“环境”是什么,为什么它决定了你的出价能不能赢
1.1 一次实时竞价里,环境由哪些成分组成
先回到最基础的场景。以程序化广告为例,一次广告展示机会到达时,需求方平台(DSP)需要在几十毫秒内决定“出多少钱”。这个过程的对手不是系统,而是其他参与这场拍卖的买家。每位买家都有自己的估值和出价策略,大家在同一时间,对同一个用户、同一个媒体位置、同一个上下文窗口里争抢流量。你愿意出的钱、别人愿意出的钱、以及市场整体愿意出的钱,共同构成了这场拍卖的“环境”。
从工程角度看,这个环境可以被拆成三个层面。第一层是流量上下文,也就是用户、媒体、时段、地理位置、设备信息这些描述“这次机会长什么样”的特征;第二层是竞争格局,即当前有多少活跃买家、大家大概的出价区间、市场的价格水平在什么位置;第三层是外部市场变量,比如大促周期、行业预算调整、新广告主入场等,这些信息往往不直接在特征里,却会剧烈改变竞争烈度。竞价环境建模要做的,就是把这三个层面综合起来的“状态”刻画出来,尤其是对出价决策最关键的竞价分布。
1.2 出价策略对“环境模型”的依赖度
为什么不直接按自己对流量价值的估价来出价?因为拍卖里的胜负不是看你出多少,而是看你相对别人出多少。如果出价过高,你可能为价值很低的流量付了过高的价格,利润被消耗掉;如果出价过低,流量拿不到,再好的模型也没有用武之地。这里存在一个“胜者诅咒”问题:你都赢了,往往意味着在这一轮里没有任何一个对手比你更看好这个流量,你要防止自己因为信息不对称而支付过多。
于是最优出价本质上是在“赢的概率”和“赢下后的利润”之间取平衡。要做这个平衡,至少需要知道:在某个出价水平下,赢得竞价的概率是多少;赢下来时通常要付出什么成本。这两件事本质上都来源于竞价分布和胜出价格分布。换句话说,整个出价策略的质量,被捆绑在环境建模的精度上。Bid2X把这个环节做扎实了,我后面展开它在工程上意味着什么。
1.3 环境建模的“三座大山”:非平稳、不对称观测、跨流量泛化
为什么竞价的“环境”建模这么难,难在三个地方。
第一个是非平稳。竞价环境不是静止的,竞争对手的策略会动态调整,新买家会进入,旧买家会退出,平台方的竞价机制也可能调整。你今天拟合出来的分布,可能明天就完全不适用。这种时间上的漂移,让所有基于历史经验的方法都面临“过期”的风险。
第二个是不对称观测。回看数据你会发现:赢下的拍卖能拿到真实成交价,而输掉的拍卖只有一个信息——你的出价没有过线,至于赢家出了多少,你永远不知道。所以观测数据不是完整样本,而是被右截断的样本。如果直接把赢单价格当作总体分布来拟合,估计出来的价格水平会有系统性偏差。
第三个是跨流量泛化。不同流量之间的竞争格局差异很大。头部媒体、高价值用户、特定时段的流量可能竞争激烈,而长尾流量竞争很小。对新流量来说,历史样本几乎为零,怎么估计它的竞价环境是一个冷启动问题。这三个问题叠加起来,正是传统方法力不从心的核心原因。把这三座大山放在脑子里,再去看Bid2X提出的“基础模型视角”,会发现它针对的恰恰就是这些痛点。
2. 传统竞价环境建模的三条路线,和它们共同的天花板
2.1 参数化分布:把世界压进一个公式,代价是猜错形状
最早、也最直观的做法,是假定竞价环境中胜出价格服从某种已知分布,最常见的是对数正态分布,然后用历史成交价去拟合均值与方差。这样做的好处是简单高效,占用资源少,可解释性也强,线上服务能扛得住很大的请求量。而且在对数正态假设成立的时候,拟合出来的竞价分布会有稳定漂亮的形态,出价策略也能直接解出闭式结果。
但问题恰恰出在“假设成立”这四个字上。真实竞价市场并不是稳定的对数正态过程。竞争对手的策略切换可能让价格分布从单峰变成多峰,尾部的厚度也会变化。我见过的一个案例是:某个媒体侧突然引入了一种新的竞价策略,原本分散的出价快速向几个离散价位集中,对数正态假设直接失效,基于它计算的出价整周都在亏损,事后复盘才发现根因在分布假设上。参数化方法最大的隐患,是它把真实世界压进一个公式,一旦公式的形状不对,后面的所有优化都建立在沙地上。
2.2 非参数经验分布:不做形状假设,却被数据稀疏按在地上
既然参数形态容易被猜错,一个自然的思路是“我干脆不猜了,直接按历史样本构建经验分布”。具体做法是按流量维度做聚合,把同类型流量在某个时间窗内的成交价格累积成一条经验累计分布曲线,在线查询时直接查这条曲线。这条路线避免了参数形态错误,在小而稳定的流量池里也非常有效,实现起来也简单。
但它有两个硬伤。第一,经验分布需要大量样本做支撑,长尾流量和全新流量根本凑不齐足够的成交记录,估计出的曲线全是锯齿状;第二,经验分布天然“重过去、轻现在”,如果靠滑动窗口来解决非平稳问题,又会面临窗口长了不灵敏、窗口短了样本不够的矛盾。我在实际项目里把窗口调到过小时级,结果白天流量大时还能用,凌晨低峰期的长尾流量直接失效。非参数方法就像一个记忆力很好的人,但这个人只记得昨天,而且面对没见过的场景毫无办法。
2.3 深度回归与逐点预测模型:能把特征用起来,但容易“平均化”
深度学习出现后,行业里开始用神经网络把“报价-胜率”关系学成一个条件概率曲线。模型输入是请求特征、媒体、用户、时段的embedding,输出是对某个出价水平的胜率估计,或者直接输出赢单价格的条件分布。相比前两条路线,深度模型最大的进步是特征泛化:有相似特征的流量即使没有历史成交,也能通过特征空间插值得到环境信息,冷启动问题得到一定缓解。
但这条路也有明显局限。它本质上学习的还是一个“平均水平上的竞争烈度”,缺少一个显式的环境状态表示,难以及时反映竞争格局的突变,因为特征空间是静态的;同时它难以引入文本、图像等非结构化信息,比如一条素材的样式、一个行业活动的热度、一条外部市场资讯,这些信息在统计上可能不会立刻体现在特征均值里,但确实影响竞价行为。用一个不算严谨的比喻:前两类方法是在“背历史”,深度模型是在“算平均”,而真正想让环境建模往前走一步,需要的是“理解市场”。
3. “基础模型视角”到底新在哪里:Bid2X的动机拆解
3.1 基础模型能带给竞价建模的三样东西
基础模型这几年在语言、视觉、代码等领域的能力大家都有目共睹。它能做的事,本质上可以归纳为三种能力:一是大规模预训练带来的先验知识,二是对异构信息形成统一表征的能力,三是条件生成与上下文推理能力。这三样,恰好每一样都能回应竞价环境建模的一个痛点。
先验知识对应的是冷启动。基础模型在预训练阶段消费了大量广告生态相关的数据,对“什么类型流量竞争激烈”“什么品类广告主的出价更高”“什么时段的CPM更高”这类规律已经有了隐含理解。哪怕某个新流量一条历史样本都没有,模型也能从上下文特征出发,给出一个比“默认常量”靠谱得多的先验估计。
统一表征对应的是异构信息融合。竞价环境不只有数值特征,还有媒体类型、行业类目、地理信息,甚至创意描述、素材内容。基础模型擅长把这些异构信号投射到同一个语义空间里,再通过条件生成来描述市场的当前状态。这为“环境”赋予了一个更丰富的输入集合。
条件生成对应的是输出表达。传统模型通常输出一个数值或一条曲线,基础模型范式更容易输出一个条件分布、一组分位数,甚至模拟多轮竞价过程。这种输出形式和出价决策所需的“竞价分布”天然匹配。
3.2 从“拟合分布”到“理解市场状态”:Bid2X的范式迁移
理解Bid2X,我觉得关键不在于它用了多大的模型,而在于它改变了我们看待竞价环境的方式。传统方法把环境当成一个待拟合的量,比如“今天这个广告位的成交价服从对数正态分布,参数是mu和sigma”;Bid2X所代表的“基础模型视角”,把环境当成一个有上下文、有演化过程的市场状态,模型要学习的是“在给定的上下文背景下,市场竞争状态是什么”,以及“这个状态接下来会怎么演化”。
这种视角变化看起来有点抽象,但对建模设计的影响是具体的。如果你把环境当成一个静态分布来拟合,所有工作都围绕曲线拟合展开;如果你把环境当成一个可理解、可编码的状态,你就会去设计环境表示,让它能编码历史竞价序列、能接受当前请求上下文、能在线上被更新和刷新。后者显然更接近一个智能出价Agent正常运行所需的内部表征。这也是我把Bid2X里的X理解为环境状态或者未知环境向量的原因。
3.3 为什么叫Bid2X:一个命名里的建模姿态
再回到标题本身。“Bid2X”这个写法,我第一反应是“Bid to eXchange”或者“Bid to eXternal state”,后来按论文里“环境建模”的定位去理解,更倾向于把它读作“出价到环境”或者说“从出价行为学到环境表示”。X在这里有点像数学里的未知数:它是需要在竞价过程中被推断出来的环境变量,也是出价Agent决策所依赖的状态。
这个命名的姿态很有意思。它意味着模型不再满足于“给定特征,预测一个胜率”,而是试图回答“一场拍卖的环境变量是什么,以及我的出价如何影响它”。从“赢单概率预测器”变成“环境建模器”,这是Bid2X在思维方式上最明显的一次转向。
4. 按工业落地惯例推演的Bid2X工作流:从环境编码到出价衔接
4.1 核心模块一:环境编码器,把一个“市场状态”压缩成向量
先说句实话:Bid2X的完整论文细节,我目前没有拿到的信息就不逐字复述了,这篇解读里我对工作流的拆解,是基于该领域主流研究框架加上我做类似项目时的工程经验做的合理推演。如果你的目标是复现,建议以正式论文的公开代码为准;如果你的目标是理解设计思路,可以把下面这套模块框架作为参考。
任何基础模型视角的竞价环境建模,第一步都是把杂乱的环境信息变成模型能处理的向量。输入来自几部分:当前请求的上下文特征(用户、媒体、时段等)、一段时间内的历史竞价记录(win/loss序列、赢得时的成交价)、以及可选的文本/类目等描述信息。环境编码器的输出是一个环境表示向量,它要能概括“当前这个市场的竞争状态是什么样的”。
这个向量很关键,因为它同时承担两个职责:一是成为出价策略的状态输入,二是被在线更新的轻量模块持续调整。从结构上来说,用Transformer风格的时间序列编码器比较常见,因为竞价记录天然是一条有先后顺序的序列,注意力机制能捕捉不同时间点竞争强度的变化关系。时间戳一定要作为特征明确输入,否则模型很难区分“昨天的状态”和“今晚的状态”。
4.2 核心模块二:分布生成头,把环境向量落成出价可用的竞价分布
有了环境向量,下一步是把它转换成出价决策能用的东西。最常见的输出有几种:一是分位数回归,直接输出竞价分布的若干分位点,比如10%、50%、90%分位价格;二是混合密度网络,用一个可学习的混合分布去逼近真实竞价分布;三是离散化分布,把价格区间切成若干桶,输出每个桶的概率。三种方式各有优劣,分位数回归简单稳定,混合密度表达力更强但训练也更容易不稳定。
我自己做类似模型的时候,比较偏好先输出关键分位数,因为它在工程上容易布线,离线上排错也直观。分位数输出来之后,可以再拼接一个轻量网络,把环境向量和出价水平映射成胜率估计,这样出价策略只要查询“在出价b下的获胜概率”,就能走经典的需求方出价框架。
4.3 核心模块三:在线适配,让基础模型跟得上环境漂移
这是基础模型落地竞价场景最需谨慎的一环。竞价环境的小时级漂移意味着模型必须要更新,但一个参数量很大的基础模型不可能每条请求都做梯度更新,也不适合频繁全量微调。常用的折衷方案是给基础模型加一个轻量adapter,线上只更新adapter层,底层的通用表征保持稳定。这样模型既能保留预训练阶段的先验知识,又能通过adapter快速吸收最近几分钟的市场变化。
另一个务实的选择是双编码器架构:一个慢编码器,更新周期较长,负责稳定的大盘特征;一个快编码器,更新周期短,负责捕捉近期的剧烈波动。在实际项目中,这种“快慢结合”的设计往往比单纯追求模型参数新鲜度更有效,因为既不会因为一次异常流量导致全模型震荡,也不会因为更新过慢而错过市场拐点。
4.4 部署与推理延迟:基础模型不是说上就上的
广告出价链路对延迟极其敏感,尤其在程序化广告中,决策通常要求在几十毫秒内完成,留给环境建模模型的预算通常只有个位数到十几毫秒。一个完整的基础模型推理很难塞进这个预算,所以工业落地上需要做一些结构上的妥协。
我见过比较合理的做法是分层部署:离线用大规模基础模型做高精度环境编码,把每种典型上下文对应的环境表示预计算好或蒸馏到一个轻量在线模型中;在线只跑轻量模型和一个很小的adapter更新模块。这样既享受了基础模型的表达力,又不会把线上延迟拖垮。核心原则是:基础模型负责“教”和“蒸馏”,轻量模型负责“跑”和“守”。
5. 评估竞价环境建模,建议分三层来看指标
5.1 第一层:分布拟合质量,检验模型“看得准不准”
最自然的评估是看模型输出的竞价分布和真实成交价格是否吻合。常用的指标包括样本外负对数似然(NLL)、分位数覆盖率、KS检验距离、分位点误差等。做这一步时要注意一个细节:由于输单样本没有成交价格,你只能拿赢单样本去计算指标,而赢单样本天然偏向下端或上端,取决于你的出价策略。为了尽量公平,可以在固定出价策略下生成评测集,或者在评估时考虑截断似然。
这一层的指标是基础,但别盲目追求极致。我见过模型分位数拟合得异常漂亮,一到线上却完全不动的情况,原因在于拟合的是“历史平均”,而不是“当下状态”。所以拟合指标只能证明模型“会看”,不能证明模型“会决策”。
5.2 第二层:决策质量,用离线竞价模拟器跑一遍端到端效果
比分布指标更接近业务的是决策质量。常规做法是搭一个离线竞价模拟器,给定一批流量日志和市场竞价记录,让预算控制、出价策略、环境模型共同参与回放,对比不同环境模型下的预算消耗率、eCPC、ROI、胜率等指标。离线模拟的好处是可以反复重放同一批流量,消除一部分随机波动,快速筛出候选方案。
需要提醒的是,离线模拟环境与真实在线环境总有一定差距。比如模拟器中的竞争对手出价是固定的,而真实对手会根据你的出价行为做出反馈。因此离线模拟指标在多数情况下只能作为淘汰性筛选,不能作为上线决策的唯一依据。我一般把它当作“安全护栏”:离线端到端效果差的方案绝不上线,离线效果好的方案才进入A/B测试池。
5.3 第三层:在线A/B,准备好和波动做长期斗争
最后才是真刀真枪的线上A/B。竞价广告的线上指标方差很大,流量分桶也不一定完全均匀,再加上市场环境的宏观波动,稍微不给实验留足时间就会出现“假阴性”或“假阳性”。做这类实验我比较强调三点:第一,实验周期要覆盖至少一个完整天级周期,避免只跑晚高峰;第二,不要只盯均值,还要看分位数和稳定性,比如日内成本变异系数;第三,准备好回滚机制,一旦环境模型在线上表现异常,能立刻切回旧策略。
评估这件事,本质是在回答三个递进的问题:模型看得准不准?用起来好不好?上线稳不稳?三层都通过了,一个竞价环境建模方案才算是真正达到了可落地的标准。
6. 落地阶段最容易翻车的四个坑
6.1 坑一:拿赢单价格当真实分布来训练
这是所有靠成交日志做竞价建模的项目最容易犯的错。赢单价格只是真实竞价分布的一个截断子集——你只有出价足够高时才观察得到价格,输单只能知道自己没赢。如果直接把这些赢单记录当成完整数据去训练分布模型,模型会系统性低估高价位竞争的情况,导致出价偏保守,跑量起不来。
处理方式一般有两类:一是把“没有赢”也当成一个观测信号,让模型学会“给定我的出价b,赢/输是一个可观测的二元事件”,通过截断似然或加权的训练方式处理;二是在离线评估时永远带上决策链路,用最终业务指标来对冲分布层面的偏差。我在项目里吃过这个亏,第一版模型离线NLL很好看,上线后跑量效率低,排查了一整天才意识到是训练数据的截断偏差在作祟。
6.2 坑二:特征里混进了“未来信息”
时间泄漏在竞价环境建模里很隐蔽。常见的例子是:把“最终成交价”当作特征加进去,模型一秒就学会躺赢,线下指标全线飘红,线上直接失效;更隐蔽的是用全天的聚合统计量来预测当天某个时段的竞价分布,这类跨时间泄漏在数据集里很难自动发现。对付它的办法很简单,也很老土:所有特征生成必须严格按时间戳做guard,绝不允许使用训练时刻之后产生的信息进入特征;同时,任何看起来“好得不真实”的离线结果都值得怀疑。
6.3 坑三:长尾流量被大模型的“平均智能”拖累
基础模型在很多任务上靠“泛化”赢下比赛,但在竞价环境建模这个任务里,泛化过头也会变成缺点。头部流量和长尾流量竞争格局差异很大,如果共用一个全局模型,长尾流量容易被平均化拟合,要么被高估竞争烈度导致出价过高,要么被低估导致赢不到量。我在实战中倾向于按流量分层出价:头部流量用精细建模,长尾流量用一个更保守的粗粒度模型兜底。基础模型在这里更应该承担迁移先验的任务,而不是用同一个头去覆盖全市场。
6.4 坑四:忘了给模型装“保险丝”
任何对环境做推断的模型都会遇到分布外场景。基础模型在没见过的新场景上不一定会像传统模型那样“保持沉默”,它有概率在没有足够证据时也编造一个看起来合理的结果,这对在线竞价来说是要命的。我建议在环境模型输出后接一个置信度判断模块,当置信度低于阈值时自动回退到最近可用的历史分布或保守出价策略。宁可少赚,也不能让环境模型的幻觉把账户成本直接推爆。
说回我自己的一次经历。有一年我们服务的一个账户,在某天下午遭遇了竞争对手策略突变,我们所有基于历史拟合的分布模型在那两天里集体失效,账户成本翻了将近一倍。当时没有环境模型能在小时级感知这种变化,团队只能临时手动调低出价,配合保守策略硬扛了两天,直到市场重新稳定。事后复盘,我一直在想,如果当时有一个能在线更新、能感知环境状态变化的模型,我们至少不用那么被动。这也是我看好Bid2X这个方向背后的原因:它把竞价环境建模从“统计拟合”推到“可理解、可更新、可推理”的层面,这是很多出价系统走到一定阶段都会遇到的硬需求。
不过最后想给读者一句冷静的话:基础模型是放大器,不是保险柜。它可以把更好的特征和更强的先验带进系统,但也带来了延迟、成本和不确定性的新问题。论文读下来思路很好,真正落地时还是要结合自己的流量结构、链路延迟和预算体量,一层层做设计和验证。如果你也在做类似的事情,欢迎在评论区聊聊你遇到的坑。