资讯动态

Bid2X:基础模型驱动的广告竞价环境建模与出价策略

发布时间:2026/10/17 18:10:41 来源:尧图企业网站定制
做竞价广告的人看到“Bid2X基于基础模型视角的广告竞价环境建模”这个标题大概率会停下来多读两遍。广告竞价发展到今天出价策略的难点早就不在怎么把一个请求的CTR/CVR估准而在“我们到底身处一个什么样的市场”当前竞争烈度是强是弱对手是在激进抢量还是已经偃旗息鼓成交价分布有没有在悄悄右移。这些外部信息叠加在一起就是广告竞价里的环境而传统做法要么把它当噪声忽略要么用一个手工统计量简单近似。Bid2X这个工作的核心主张很直接把竞价环境本身当成一个可以被基础模型理解、表征和预测的动态系统让出价决策真正建立在“环境感知”之上。这篇KDD‘25的工作适合正在做RTB/DSP出价策略和广告算法的同学也适合想知道基础模型怎么落进真实决策系统的朋友。我先从一个从业者的视角把这个题目掰开揉碎讲清楚。1. 项目概述广告竞价里的“环境”到底是什么1.1 一场广告拍卖从请求到成交的完整链路先把基本链路对齐。用户打开媒体App或网页媒体端发起一次竞价请求DSP需要在几十到一两百毫秒内做出决策这个请求要不要出多少钱。之后所有参与者的出价进入拍卖环节按照一价、二价或广义二价等机制决定赢家和实际扣费。对DSP来说能感知到的不是市场实时报表而是自己手里攒下的一条条拍卖记录参加了多少次、赢了多少次、成交价是多少、赢单之后用户有没有转化。这套信息天然是稀疏且不完整的。你永远不知道对手出了多少钱只能从二价机制下的扣费里反推一点信息你也永远不知道某个请求没赢到底是因为自己出价太低还是对手在那个流量上特别激进。所以竞价环境建模本质上是在不完整信息下做推断难度比直观想象要大不少。1.2 环境为什么是出价策略的暗物质很多团队把竞价者建模成“价值预估加固定系数出价”但实践久了就会发现同一个价值预估在A时段能赢单在B时段却大量输单原因往往不在预估本身而在环境。环境有四个很难缠的性质。第一个是非平稳。凌晨和白天、工作日和周末、大促前后竞争水位完全不是一个量级。用过去一周数据训练出来的模型到了下一周可能就明显偏离。第二个是部分可观测。对手策略不会告诉我们市场也没有“竞对出价分布查询接口”只能靠自身拍卖结果反推。第三个是因果耦合。出价策略会影响哪些拍卖能成交成交样本又决定了后续看到的数据分布环境和决策是互相纠缠的不是独立外生变量。第四个是延迟稀疏。转化信号经常会延迟数小时甚至数天大部分曝光也没有转化标签噪声大、样本稀疏。用一个粗浅的比喻环境之于出价策略就像水况之于游泳。泳姿再标准不知道水是急流还是静水也很难游好。1.3 Bid2X的切入点把环境从噪声提升为状态传统上环境常被建模成几个统计特征比如近一小时均价、竞胜率、预算消耗速率。这种做法的问题在于手工特征会丢失结构或者说丢掉了“市场状态是怎么一步一步演变过来”的过程信息。Bid2X的想法是换一个视角把环境看作一个整体状态用基础模型的序列建模能力去学习环境表征。历史拍卖记录可以被序列化被注意力机制处理环境表征再注入出价决策。换句话说出价不再是看到请求就算一个数而是先感知当前市场状态再决定这轮怎么出。这个视角最大的价值是把环境建模从“工程师拍脑袋设计特征”变成了“模型从数据里自己学”我觉得这是它值得拿出来讲的核心原因。2. 方案思路拆解基础模型视角到底新在哪里2.1 传统环境建模的三板斧及其边界第一板斧是统计分布。假设成交价服从某个分布比如对数正态用均值、分位数、尾部概率做特征。优点是简单坏处是假设错了就全错。市场一旦进入大促模式成交价分布形状和日常完全不同固定参数很难自适应均值会失真尾部信息也基本丢失。第二板斧是显式对手建模。这类方法受博弈论启发假设对手在用某一个策略族然后用自己观测到的拍卖结果去反推对手参数。在模拟器里效果常常不错到了真实工业环境对手不可能是单一策略族预算调整也随时在发生反推过程很难稳定噪声一大就发散。第三板斧是市场状态离散化。人工把流量按媒体、时段、地域切分在每个格子里算平均竞争指标。这是落地最多的做法但状态边界靠经验定义比如“凌晨”到底从几点开始不同账户答案不一样而且很多细小的市场变化会被粗糙分区直接抹平。这三板斧的共同问题是环境的状态空间由人来定义而不是由数据自己涌现。2.2 基础模型视角带来的三个实质变化基础模型视角的本质是与其手工设计环境的状态空间不如让模型从大量历史数据里自己学出环境表征。具体到竞价场景历史拍卖记录序列很像语言模型里的句子每条拍卖记录包含时间、媒体、出价、是否获胜、成交价等字段把这些字段token化就得到一条可以训练的序列。用带注意力机制的编码器去读这段历史输出的向量就可以理解为对当前竞价环境的压缩描述。这个视角的优势有三点。第一是长程依赖。市场状态往往有跨小时甚至跨天的惯性MLP或者简单RNN很难刻画这种长程关系注意力机制天然适合这种场景。第二是迁移能力。基础模型的预训练范式可以在大盘数据上先学到通用的市场规律新账户、新渠道只靠少量数据微调就能用。第三是统一性。环境表征一旦训练出来可以输出给下游多个策略模块复用不只是服务一个出价模型后面我会详细说这个点。2.3 我对“Bid2X”这个名字的理解我第一次看到这个题目第一反应是“Bid to X”核心意思是从一次出价出发把外部环境这个X显式地建模出来。从这类工作在工业界的普遍形态来看通常是一个双分支结构一边是环境编码分支一边是出价决策分支中间通过环境表征连接起来从结构上理解“2X”这个命名也没有问题。我更想强调的是环境表征必须是“为了出价而建模”而不是单纯重建历史。否则很容易训出一个信息很丰富但对决策完全没有帮助的编码器。这个区别在实操中会体现得非常明显后面我展开讲。2.4 为什么这类结构在竞价场景里成立一个直觉解释是如果广告竞价是一场比赛传统策略是每次站在场上只看眼前这个球怎么打Bid2X的思路是先把整个球场的风向、对手站位、比分趋势扫一遍再决定这一球怎么出。注意力机制做的就是这个“扫一遍”。当然这并不意味着模型有人的意识而是说结构上它有能力把分散在不同时间点上的拍卖事件关联起来。比如过去两小时成交价在持续抬升单看一条记录看不出来放在序列里注意力机制就能捕捉到这种趋势并把它编码进环境表征。这种能力在非平稳市场里特别值钱。3. 核心模块与实操要点3.1 输入怎么组织从原始日志到token序列要把环境交给基础模型第一步是把原始日志变成可学习的token序列。一次竞价记录大约有以下字段请求到达时间、用户和媒体信息、广告位信息、计划ID、是否提交出价、提交的出价、是否获胜、成交价、之后是否发生转化。环境编码器的输入我建议按四类组装。第一类是请求上下文包括用户特征、媒体、广告位尺寸、地域、时段可以做embedding。第二类是历史拍卖序列也就是过去一段时间里自己参与拍卖的记录按时间排序。第三类是预算投放状态包括剩余预算、已消耗速度、投放计划的起止时间。第四类是市场侧信号比如大盘成交价分位数如果数据能拿到的话。这里有几个特别容易踩的点。历史拍卖序列里的时间戳必须参与编码否则模型分不清早晨和凌晨的差异连续值字段比如成交价和出价不能直接丢进embedding需要做分箱或者数值编码未成交时的成交价属于缺失字段需要用特殊mask表示不能直接填0填0会让模型把缺失当成一个真实的低价信号。只要做过这类系统的都知道输入组装阶段的错误占最终上线问题的一大半。宁可多花一周把特征加工做规范也不要急着把模型训起来。3.2 环境编码器的任务设计不能只做重建环境编码器输出一个向量z_t问题是怎么让z_t包含对决策有用的信息。一个可靠的做法是叠加辅助任务。第一个辅助任务是成交价分布预测。不建议用均方误差去拟合成交价本身而是预测成交价的分布比如分成若干分位桶做分类或者直接预测概率分布。这比回归稳定因为它鼓励模型把市场价格的完整形状编码进z_t而不仅仅是平均值。第二个辅助任务是竞胜率预测对“提交出价之后是否赢得拍卖”做二分类这个任务能逼着模型捕捉竞争激烈程度。第三个辅助任务是预算消耗速度预测预测下一个时间窗口内预算消耗的速率让模型理解投放节奏。这些辅助任务和出价决策不直接挂钩却能极大提升环境表征的可用性。如果只用一个重建loss环境编码器很容易学到“平均成交价”这类低维统计量丢掉对决策至关重要的尾部信息和变化趋势。3.3 出价决策头与预算控制怎么衔接环境表征出来后怎么用它决定出价是关键。在生产环境里我不建议模型直接输出原始价格而是输出一个相对eCPM的乘数。假设t时刻的价值估计是v_t通常等于pCTR乘以pCVR再乘以目标出价环境感知的调整系数是α_t它由环境表征z_t和预算状态s_t共同决定最终出价可以写成b_t min(α_t * v_t, price_ceiling)α_t的含义非常好解释环境竞争不激烈时大于1敢于提高出价抢量环境竞争激烈时小于1保存预算保护ROI。这样一个结构也便于人工审核和干预出价策略团队能够理解模型在做什么。预算控制我强烈建议独立出来。常规做法是外层套一个预算节奏控制器用PID或者类似机制控制消耗速度。预算不是普通的特征它是带约束的全局资源神经网络很难自己学会“今天还剩10%预算但已经花了95%”这种边界情况。Bid2X的环境表征可以让节奏控制器做得更聪明比如在环境热度高的时候提前减速但预算约束本身不能完全交给网络。如果走强化学习路线状态往往定义成环境表征加预算状态动作为出价乘数或者调价间隔奖励则是成交率、ROI和预算平滑度的加权。离线训练时用模拟器或者历史重放并且要加一个执行噪声项防止策略过拟合到确定性环境。3.4 训练流程与部署细节三步走训练部分建议分三步。第一步在大盘全量日志上预训练环境编码器用上面说的辅助任务让基础模型学到通用的市场规律。第二步在具体账户或投放计划上微调把环境编码器和出价决策头一起端到端调整。第三步上线之后保持低频滚动更新一般按小时或者按天重训。部署中要特别注意特征时间对齐。模型推理时只能使用当前时刻之前已经发生的数据凡是需要用未来信息计算的特征都不能进模型。最常见的翻车现场是离线训练时用了当天大盘均值作为特征在线当天还没过完均值根本算不出来就用昨天的值替代离线在线数据分布直接错开指标必然崩。简化后的核心逻辑结构大概是这样def build_env_repr(history, budget_state, context): tokens tokenize(history, budget_state, context) z_t env_encoder(tokens) return z_t def bid(context, pctr, pcvr, z_t, budget_state): value pctr * pcvr * target_goal alpha bid_head(z_t, budget_state) return min(alpha * value, price_ceiling)虽然只有几行但结构表达得很清楚环境编码器是独立模块出价决策头只负责给乘数预算控制发生在外层。4. 实验评估与效果观察4.1 离线怎么评、在线怎么分桶评估一个环境建模工作的目标是证明环境表征真的改变了出价行为而不只是刷高某个数字。离线层面除了常规的AUC和loss要重点看成交价分布预测的校准度比如分桶后的ECE以及环境表征的聚类结果是否和业务时段对应。在线层面核心指标是预算利用率、成交率、ROI、成本达成率。我特别想提醒一点不要只盯一个ROI必须同时看预算消耗速度。有时候ROI提升是因为模型变保守了把钱省下来只投最稳的流量这种结果对业务没有实际意义。分桶时按账户或计划分不要在同一账户内做流量级分流。不同流量之间存在相互竞争流量级分流会引入竞比效应实验组和对照组会互相污染。实验周期至少要覆盖周中加周末并且横跨一个计费周期否则受流量结构周期性影响很容易得出错误结论。4.2 消融实验怎么排强烈建议按这个顺序记录指标变化第一步不加环境表征只用请求特征加价值估计出价作为baseline第二步加入环境表征但不训练辅助任务第三步加入环境表征和成交价分布预测辅助任务第四步完整版本包含双辅助任务和在线滚动更新。这个顺序能回答三个问题环境表征本身有没有用辅助任务有没有把表征推向决策可用的方向在线滚动更新对非平稳环境有多大帮助。很多工作只对比第一步和第四步中间变量完全是黑盒出了问题都不知道在哪一环上线排查的成本会高很多。4.3 上线后比较典型的效果变化从这类方案的实践反馈看通常会带来两类行为变化。一类是预算利用率提升。传统固定系数出价在低竞争时段会白白输掉很多本来能赢的单环境感知出价会在竞争低时自动放大乘数预算利用率普遍能提升5到15个百分点。另一类是成交成本波动率下降。环境表征让出价在不同时段之间更平滑不会出现白天激进抢量、晚上没人出价这种断层。最典型的case是低竞争时段的“敢加价”行为变化。这个行为变化比具体数值涨跌更重要因为它说明模型真正理解了环境而不是在死记硬背特征。5. 常见问题与排查技巧实录5.1 离线在线不一致最典型症状是离线指标涨、线上负向。排查顺序我一般是这样先查特征穿越确认每个特征在推理时刻能否实时拿到再查训练集与线上流量域是否一致用训练集里占比最高的流量域做单独验证最后查推理耗时看是否因为延迟导致特征时间点错位。处理建议是建立一个按时间切分的时间穿越测试集专门用当前时间之后的数据去构造特征用来拦截穿越类问题。这个测试集一旦建起来每次迭代都能自动发现一批问题比上线后靠监控报警主动得多。5.2 市场非平稳导致环境漂移大促是检验环境建模的试金石。大促一开始成交价分布右移竞胜率下降如果环境表征的分布明显偏移到训练范围之外模型行为就会变得异常。应对方法包括滚动重训窗口从全量历史改成最近N天或者做环境强度归一化把绝对价格和出价变换为相对当日均值的比值消除市场水位变化带来的输入分布偏移。我个人经验是不要指望基础模型能完全解决非平稳问题它的优势是适应速度快但仍然需要监控和环境漂移检测机制。可以定期计算当前环境表征和训练分布之间的距离超过阈值就触发重训。5.3 延迟反馈和数据稀疏转化信号延迟会导致训练时标签还没到位直接把缺失当负例会造成严重低估。处理方法常见有两种延迟反馈建模对未转化样本按时间加权或者使用逆概率删失加权根据观察时长调整样本权重。实践中观察窗口至少要覆盖到转化延迟的中位数以上否则模型学到的节奏是偏的。广告竞价里“当天没转化不等于没价值”这个道理在环境建模阶段同样成立。5.4 预算花不完、超预算和抖动预算控制问题要区分两类。一类是花不完模型太保守。此时优先检查出价下限是否太低、环境表征是否把竞争强度估计过高。另一类是花太快超预算需要检查价格上限约束是否生效、预算节奏控制器的反馈周期是否太长。建议预算控制器至少每5到10分钟对账一次而不是等到整点才发现超了。现象可能原因排查方向解决建议预算花不完环境表征把竞争强度估计过高看环境表征的竞争维度分布调低竞争强度信号权重提高出价乘数上限超预算预算反馈周期太长检查控制器对账频率和出价上限缩短对账周期加价格上限约束关键指标波动大滚动训练窗口太敏感看窗口内市场分布变化用EWMA平滑参数加大训练窗口离线在线不一致特征穿越跑时间穿越测试拦截穿越特征并重训模型5.5 独家避坑历史序列长度要用时间窗口而不是条数这是我个人最想强调的一点。很多实现把“最近100次拍卖”作为序列窗口但流量高峰和低谷的密度差异极大高峰期的100条可能只覆盖几分钟低谷期却覆盖几个小时。建议直接用“最近一小时内的拍卖记录”作为窗口甚至按固定时间间隔做重采样。这样能保证环境表征在不同时段有可比的时间视角否则模型学到的“环境”实际上是“最近多少条拍卖”而不是“最近什么市场状态”。这个细节在Bid2X这类方案里尤其重要高峰期看到的是极短时间窗低谷期看到的是几小时前的陈旧信号环境感知就会失真。6. 个人实操中的几点体会我自己在模拟环境里按Bid2X的思路搭过一个简化版本最深的体会是环境编码器一定要单独先训好再接入出价决策端做端到端调整。一上来就端到端训练在工业级噪声下很容易让环境编码器退化成价值预估器的重复计算z_t里全是请求本身的信号几乎没有市场信号那这个环境建模就白做了。另外环境表征的可解释性要当成一个正式模块来建设而不是事后分析。我习惯定期把z_t做降维可视化按业务标注看一眼能否聚类出凌晨、白天、大促前这几个已知时段。如果聚类结果乱糟糟说明输入组装或者辅助任务出了问题不需要等线上指标来告诉你这样能省很多试错成本。最后分享一个扩展思路环境表征不光能服务出价还可以用到频控、预算分配、创意优选这些相邻任务上。同一个z_t在出价侧学到的是市场状态在频控侧学到的可能是当前流量对同一个用户的拥挤程度。基础模型的通用表征能力在这里的价值可能比单点出价提升本身更大。这也是我后来继续沿着这个方向做研究的原因。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑