做广告投放系统或者研究在线竞价算法的人,应该都纠结过同一个问题:模型离线评测的指标明明很好,一上真实流量就掉链子。根子往往不在模型结构,而在你对所处环境理解得不够。竞价市场是一个高度动态的竞争环境,对手的出价策略、流量供给结构、用户注意力波动,任何一个变化都会让历史数据分布失真。KDD‘25 上这篇 Bid2X 的切入点很有意思,它提出站在基础模型的视角去建模整个广告竞价环境,而不是继续在单样本、单广告主的粒度上打补丁。这篇文章适合三类人:正在做自动出价系统的工程师,研究竞价博弈与市场设计的算法同学,以及想了解基础模型如何落到广告场景的从业者。下面我把结合工程实践的理解、技术拆解和落地思考整理出来,尽量把“为什么这样设计”讲透。
1. 这套方案解决的问题,为什么值得认真看
1.1 广告竞价建模的真正难点不在出价,而在环境
过去很长一段时间,我们做竞价建模的逻辑很直接:把每一次竞价看成一条独立样本,特征无非是广告 id、用户 id、上下文信息,标签就是是否点击、是否转化。模型学到的是一个条件概率分布 P(点击|广告, 用户, 上下文),然后再把概率换算成出价或者 eCPM 排序分。
这套范式的问题在于,竞价本身不是一个静态拟合问题,而是一个博弈问题。每次竞价都发生在某个“市场状态”里:这场流量多少广告主在抢,对手的出价分布是怎样的,预算消耗到哪个阶段,实时成本水位是否超标。这些变量不会出现在单条样本的特征里,但它们直接影响最优出价。
我印象很深的场景是:某广告主的成本很稳定,结果一个下午成本突然涨了 30%,查了一圈发现不是自身模型问题,而是几个大投放主同时在抢某个品类流量,市场整体出价水位被抬高。传统模型面对这种情况只能被动适应,等数据量够了再慢慢调整参数,但等它调整完,市场可能又变了。所以喊了很多年的“动态定价”在实际业务里,多数还是滞后于市场变化的。
Bid2X 想解决的核心问题就是这个滞后。它的思路不是把出价模型做得更大,而是把“竞价环境”这个被长期忽略的变量显式地建出来,让决策模型能感知市场状态,并用一种通用的、类似基础模型的方式去理解环境的变化规律。
1.2 基础模型视角带来的本质变化:从“拟合数据”到“理解环境”
“基础模型视角”这个词听起来抽象,其实说白了就是:像大模型用统一方式理解不同自然语言任务一样,Bid2X 试图用统一方式理解不同竞价环境下的决策逻辑。
传统方法每接到一个新任务,比如一个全新的广告主,就要重新收集数据、重新训练参数。但人不是这样工作的。一个做过信息流广告优化的人,转到电商广告场景,不需要从零学起,他会带着对“竞价机制怎么运转、流量成本大概什么水位、不同时段效率差异”的理解快速上手。Bid2X 就想让模型拥有这种“跨场景的常识”。
具体来说,就是用海量历史竞价数据训练一个环境编码器,让它把任意时刻的市场状态映射成一个表征向量,再基于这个向量去生成出价动作。这个环境编码器学到的是通用的市场运转规律,而不是某个广告主的特定偏好。这样当一个新的广告主或者新的市场环境出现时,模型只需要少量样本做适配,而不是从零开始。
这个思路和当前大模型领域的预训练-微调范式很像:先用通用数据学一个基础能力,再在具体任务上做轻量适配。从方法论的角度看,Bid2X 是这种范式在广告竞价建模上的一次具体实践。
1.3 Bid2X 具体能解决哪些实际场景
从工程落地角度看,Bid2X 对应的痛点很明确:
第一个是“冷启动”。新广告主没有历史转化数据,传统模型很难给出合理的出价,给高了亏钱、给低了没量。如果有一个训练好的环境模型,就能参考同类广告主在同环境下的最优行为,快速给出一个不算差的开局策略。
第二个是“市场突变”。双十一大促、突发舆情、流量供给波动,这些场景下历史数据快速失效。环境感知能力可以让模型在市场状态变化时及时调整出价,而不是等着损失扩大后再被训练任务纠正。
第三个是“多任务共存”。同一个账户下可能同时跑品牌广告和效果广告,两者的目标函数差异很大。环境表征是共享的,目标适配是分叉的,这种结构比每个任务各训一套模型省力得多。
第四个是“预算分配与出价联动”。竞价决策不只影响单次出价,还影响整体预算消耗节奏。环境建模做出来之后,预算分配也可以基于同一个环境判断来做,避免出价和预算两个模块各说各话。
这几个场景做投放系统的人应该都不陌生。Bid2X 的价值在于把过去分散的“规则 + 单独模型”整合成了一套可学习、可迁移的框架。
2. 核心技术机制拆解
2.1 环境表征层:把市场状态变成“一行能读懂的向量”
Bid2X 的第一个关键模块是环境表征层。它要做的事情是:输入当前时刻的市场快照,输出一个低维稠密向量,这个向量要能代表“现在的市场长什么样”。
那什么样的信息算市场快照?从工程角度看,大概有几类:
- 竞争水位:最近一小时内参与竞价广告主的数量、出价分位数、头部竞价者的出价走势。
- 流量供给:流量的时段热度、分广告位或分品类供给量、点击率基准水位。
- 成本信号:近期平均点击成本、转化成本、消耗速度,以及和目标成本的偏离程度。
- 自身状态:账户当日预算消耗比例、已获得流量结构、创意新鲜度。
单看任意一条,都是零散指标。Bid2X 的做法是把这些指标按时间顺序组织成一段序列,然后用序列模型去提取整体语义,相当于把“市场”这个不可直接观测的变量转成模型可计算的中间表示。
这里有一个技术细节值得展开说:为什么用序列而不是直接用拼接的特征?因为竞价决策对时间上下文高度敏感,同样是“成本超标 20%”,发生在预算消耗 10% 时和发生在预算消耗 90% 时,正确动作完全不同。序列结构保留了这种时序依赖关系,拼接特征会把这些关系打散。这个设计取舍和自然语言处理里用 Transformer 处理句子而不是词袋的原因是一致的。
2.2 决策生成层:从环境表征到出价动作
环境编码器输出的向量本身不能直接用于决策,还需要一个决策生成层把它翻译成具体的动作。高频的动作包括三类:基础出价、Bid Shading 调节系数、预算分配权重。
基础出价,就是 eCPM 竞价机制下要给这次展示机会出多少钱。Bid Shading 系数是指要不要对原始估价进行打折,以及打多少折,这个在高竞争场景下很关键,打多了丢量,打少了亏钱。预算分配权重解决的是“当前阶段应该花多快”的问题,比如一天 24 小时的预算节奏控制。
决策生成层的设计亮点在于,它把环境表征作为条件输入,同时把广告主的目标(比如成本约束、量级要求)拼接进去,最终输出一组满足约束的动作参数。这样同一个环境表征,配上不同广告主目标,就能生成不同动作,而不是所有广告主共用一套行为策略。
在实际落地时,动作平滑是一个容易栽坑的点。环境表征每隔几分钟就会更新,如果每次更新都让出价产生大幅跳变,会造成流量采买结构的震荡,表现就是成本曲线像锯齿一样。常见做法是在动作输出后加一个平滑约束,限制相邻决策间的最大变化幅度,这个约束用简单的比例限制可以实现,但要不要加、加多大,需要根据账户历史波动情况来做决策。
2.3 两阶段训练范式:先学环境常识,再做任务适配
Bid2X 的训练分成两个阶段,这是我个人觉得整篇工作里最有实操借鉴意义的部分。
第一阶段,在大规模历史竞价数据上预训练环境编码器。训练目标可以是“给定一段市场观察序列,预测下一时刻的市场状态”,本质上是在学一个市场状态的时序预测模型。也可以加入对比学习目标:同一个市场状态的不同观察视角应该映射到相近表征,不同市场状态的映射应该拉远。这样学到的表征就具备跨场景泛化能力。
第二阶段,在具体广告主数据上微调决策生成层。微调时环境编码器通常可以冻结,因为市场运转规律是相对通用的,不需要针对每个广告主重新学一遍。只需要用这个广告主自己的历史数据去训练“环境表征到动作”的映射,样本需求量就小很多。
为什么这种两阶段设计能减少新场景的数据需求?因为预训练阶段已经帮模型建立了“什么环境条件下大致该做什么动作”的先验,新场景只需要修正偏差即可。这和我们用人做事的逻辑很像:有经验的人转岗,上手速度比应届生快得多,因为他脑内已经有一个“在不同组织环境里如何开展工作”的模型,新岗位只需要补足领域差异。
2.4 和现有竞价方法的直观对比
为了更清楚地说明 Bid2X 的定位,我把常见竞价建模思路放在一个表里对比:
| 方法类型 | 对样本量的依赖 | 是否感知市场状态 | 跨场景迁移能力 | 工程复杂度 |
|---|---|---|---|---|
| 传统监督学习竞价 | 高,需要大量近期样本 | 无,只依赖单样本特征 | 弱,新场景需要重新训练 | 低 |
| 强化学习竞价 | 较高,需要大量探索样本 | 部分感知,靠 reward 间接学习 | 一般,策略迁移依赖状态定义 | 高 |
| Bid2X | 低,预训练后少量适配 | 显式建模环境表征 | 强,环境表征可复用 | 中高 |
这个表格的对比维度是按实际选型时最关心的几项来列的。传统方法胜在简单,但在市场快速变化时容易掉队;强化学习胜在长期收益优化,但对数据量和工程链路的要求很高;Bid2X 在样本效率和场景迁移方面有明显优势,代价是需要额外维护环境表征相关的模型和数据管线。
3. 实操过程与复现要点
3.1 数据准备:日志整理与训练样本构造
把 Bid2X 从论文思路落到生产,第一步是数据准备。这里的核心变化是:训练样本不再是单条竞价记录,而是一段固定窗口长度的市场观察序列。
我以一个日预算 20 万、主投信息流广告的账户为例来说明样本怎么构造。假设我们要建一个环境序列,时间窗口取 6 小时,采样粒度取 5 分钟,那么一段样本就是 72 个时间步。每个时间步的特征大致包括:
- 当前时刻该广告位所属流量的平均竞争出价、出价 p50/p90。
- 当前时刻整体行业点击率基准值,以及该账户自身的点击率偏差。
- 当前账户累计消耗、消耗进度、近期平均点击成本、转化成本。
- 时间特征:星期几、小时、是否特殊营销日。
这些特征会组成一个 shape 为 [72, feature_dim] 的张量,对应一个样本。标签可以设计成对未来若干个时间步的市场状态预测,也可以设计成该窗口期内的最优动作(从真实投放日志里逆推出来)。
这里有一个细节必须强调:采样粒度越细,环境表征的时效性越好,但序列长度也会变长,训练算力和在线推理时延都会上升。实际落地时,采样粒度不一定要非常细,5 分钟到 15 分钟之间是一个合理的探索区间。我见过一些团队为了追求效果直接上秒级采样,结果序列长度爆炸,模型训练成本翻了好几倍,实际效果并没有明显提升,因为市场状态的变化本身没有那么快。
3.2 模型训练与调参
训练阶段可以先从一个参考配置起步:
| 参数/配置项 | 参考值 |
|---|---|
| 环境编码器结构 | 自注意力编码器,4 层,hidden size 128 |
| 序列长度 | 64 ~ 128 个时间步 |
| 特征维度 | 50 ~ 100(取决于特征工程设计) |
| 环境表征维度 | 64 ~ 128 |
| 决策生成层 | 2 层 MLP,输出出价和预算权重 |
| 预训练目标 | 未来市场状态预测 + 对比学习 |
| 微调目标 | 动作误差 + 约束惩罚 |
| 优化器 | Adam,学习率 1e-4,微调时降到 1e-5 |
上面的配置不是唯一的解,但从实际操作看,编码器层数不需要太深,4 到 6 层就足够表达市场状态的复杂度。原因是环境表征的输入特征是结构化时序数据,不是高维非结构数据,深度太深反而容易过拟合噪声。
微调阶段要特别注意约束条件的处理。竞价动作必须满足预算约束和成本约束,否则即使模型预测误差很小,策略也不可用。比较稳妥的做法是在损失函数里加入约束惩罚项,当动作超过成本红线时给予惩罚。还有一种做法是结构约束:把动作输出经过一个归一化层,保证输出值在合法区间内。两种方式可以同时用,效果更稳定。
离线圈层验证的依据,我习惯看三个信号:环境表征是否稳定(同一市场状态的表征方差小)、动作分布是否符合业务直觉(比如高峰期出价更高)、模拟器里跑出来的预算消耗曲线是否平滑。这三个信号有一个明显异常,都不要急着上真人流量,先回去查数据和模型逻辑。
3.3 上线与评估:模拟器优先,再小流量 A/B
真正上线前,最值得投入的是做一个竞价模拟器。模拟器的输入是历史真实竞价数据,输出是给定策略条件下的流量分配和消耗结果。在模拟器里可以安全地测试模型在极端市场状态下的行为,比如突发的流量峰值、成本剧烈波动,如果策略在模拟器里出现预算突然花超、频繁调整出价这些问题,就说明模型对环境变化还不够鲁棒。
模拟器验证通过后,再切小流量 A/B。实验分组时要注意环境干扰的问题:竞价是一个零和的环境,对照组和实验组同时争抢同一类流量,实验结果会互相影响。更合理的做法是错开流量分配时段,或者在同一个广告主账户内部分地分配预算做测试。这些细节做不好,A/B 结果很容易失真。
在线评估的核心指标,短期看消耗进度、成本达成率和竞价成功率,长期看转化成本和量级增长。这些指标在实验报表里能看到,但要注意归因窗口:转化数据有延迟,如果只看当天实时成本,会误判模型效果,至少观察 3 到 7 天再下结论。
3.4 实测中的几个工程细节
模型写出来只是一小步,真正的工程量在数据链路和推理部署上。
第一个坑是特征一致性。离线训练时用的特征口径和在线推理时用的特征口径如果存在偏差,模型效果就会打折扣。比如离线用的成本信号是“过去 30 分钟点击成本的均值”,在线也是这个口径,但一个是按事件时间聚合,一个是按日志落地时间聚合,两个时间口径在高峰时段差异很大。解决方案是把特征计算逻辑抽成统一的 SDK,离线在线共用一套代码。
第二个坑是环境嵌入的缓存。环境表征是全局共享的,同一时刻所有广告主看到的竞价环境是相同的,至少在同一个流量池里是相同的。这个特性让环境嵌入可以做缓存:每隔一个采样周期计算一次,期间所有请求直接读取缓存,能大幅降低推理时延和算力消耗,不用为每个广告主单独计算一遍。
第三个坑是日志闭环。如果没做结果日志和动作日志的闭环对齐,后续评估会非常被动。每次请求要记录当时的动作参数、当时的市场快照摘要、最终的竞价结果,三个信息能对上,才能支撑后续的特征复盘和模型迭代。
4. 常见问题与排查技巧实录
4.1 环境嵌入变化太快导致出价抖动
上线后如果发现出价序列呈锯齿状,最可能的原因就是环境嵌入更新频率过高,或者动作生成层对环境表征的变化过度敏感。
排查方式是记录环境嵌入的逐时刻变化量,画出变化量的时间分布。如果变化量普遍大于某个阈值,说明输入的市场指标本身波动剧烈,比如竞争出价在短时间内大起大落。解决思路有两个:一是对输入的市场指标做平滑处理,二是对决策层的输出做时间维度上的平滑约束。两招都用上,抖动基本能压下来。
还有一类情况是模型本身不稳定:同一个环境状态输入两次,输出的动作差异较大。这种模型内部不稳定的问题,优先检查训练是否收敛,决策层是否容量不足,以及特征是否存在收益泄漏。环境建模里偶发的极端值很容易导致特征尺度异常,预处理阶段做一个分位数截断通常能解决大半问题。
4.2 离线效果和在线效果对不上
离线效果不错、在线效果拉胯,是竞价系统里最经典的困境。四个方向去排查:
第一个,训练数据分布和在线分布不一致,尤其是市场状态发生了结构变化,离线评测集和线上的环境时序对不上。这个好理解,用昨天的数据训练,今天的市场已经变了。
第二个,模拟器和真实环境的反馈机制不同。模拟器里设定的是“低价就少拿量”,真实环境里可能还有平台调控、对手策略应对这些复杂因素,导致模拟器验证通过的策略到真实环境里表现变差。
第三个,归因数据不完整。转化数据延迟和流失,导致在线成本估不准,系统误判模型效果。这种情况排查起来最快,看看归因接入的数据明细就能定位。
第四个,策略评估中存在 survivor bias。只看获得展示的样本,不看被过滤掉的样本,导致对策略效果的高估。要修正这个问题,需要记录全量决策日志,包括未竞得流量的记录,再按整体漏斗重新评估。
4.3 新广告主冷启动依然很吃力
即使有预训练的环境编码器,冷启动也不是完全不用数据。新广告主没有自己的行为日志,微调阶段缺少监督信号,光照不到的地方还是会黑一段时间。
实操中比较管用的做法是“相似广告主迁移”:在环境表征空间里找到和新广告主特征最相近的若干广告主,用他们的行为数据作为弱监督信号做一轮过渡训练,再用新广告主自己产生的少量真实数据进行精调。这个做法不需要改模型结构,只需要在微调时调整样本采样的权重结构。冷启动的安全感会比完全从零开始好不少。
即使这样,新账户前一两天的成本波动可能还是会超过正常范围,给一个相对宽松的监控水位是合理的,别一看成本超标就急着下线,模型需要一小段时间来校准环境表征和自身动作的匹配关系。
4.4 算力与成本约束
环境编码器如果做得太重,在线推理时延会超标,毕竟竞价系统对时延的要求通常很严格。几个行之有效的优化方式:
第一,环境嵌入缓存,这是最有效的一招。同一市场状态对环境编码器的计算结果是全局共享的,不用每个请求重算,只需要按采样周期更新一次。
第二,异步预计算。环境编码器的输入是市场快照,天然具备异步计算的特性,可以在请求到来之前提前算好,请求时直接读取,在线只跑决策生成层这个轻量网络。
第三,蒸馏。如果预训练模型太大,可以把环境编码器蒸馏成一个小模型,蒸馏后的模型可以显著降低推理耗时,精度损失在可接受范围内。蒸馏的收益在资源紧张的场景下很明显,值得作为标准优化手段来考虑。
4.5 问题速查表
| 现象 | 可能原因 | 优先排查点 |
|---|---|---|
| 出价抖动、消耗曲线锯齿状 | 环境嵌入更新过快或动作无平滑约束 | 检查输入指标波动、输出是否加平滑限制 |
| 离线好在线差 | 数据分布漂移 / 模拟器失真 / 归因不准 | 对比线上线下特征分布、检查日志完整性 |
| 新账户成本剧烈波动 | 微调信号不足 / 环境表征过拟合 | 做相似广告主迁移、放宽初期监控水位 |
| 推理时延超标 | 环境编码器太重 / 未做缓存 | 启用缓存、异步预计算或模型蒸馏 |
| 成本长期超标无法收敛 | 特征存在泄漏 / 约束惩罚权重过小 | 复查特征工程、调整约束项权重 |
这张表我整理自实际踩坑记录,不一定覆盖所有情况,但优先级基本是按出现频率排的。
5. 影响范围与未来扩展
5.1 从出价到全局控制:一张环境表征多处复用
Bid2X 的建模思路如果能跑通,它的影响不会只停留在出价这个环节。环境表征是一个全局信息,理论上凡是依赖“当前市场处于什么状态”做决策的模块都可以复用:预算分配可以基于环境表征判断当前时段的流量性价比,决定是加速消耗还是放慢节奏;创意选择可以结合环境表征判断当前用户群体更吃哪种素材风格;频次控制也可以根据环境竞争激烈程度动态调整展频阈值。
这意味着,一个团队可以围绕环境表征搭建一套共享的基础设施,而不是每个算法模块各自维护一套状态判断逻辑。过去的广告系统里,出价模型、预算控制、创意策略经常是三个独立系统,各算各的账,集成的时候常常冲突。Bid2X 提供了一个潜在的解决方案:让他们都读同一个环境判断,在统一的“世界模型”下做各自的任务决策。
5.2 对广告平台和广告主两侧的价值
对广告主侧的投放系统来说,Bid2X 的价值是让投放策略的切换成本更低。新账户、新品类、新市场都能更快找到合适的出价策略,减少试错期的浪费。
对广告平台侧来说,Bid2X 的思路也有可能帮助平台更好地建模广告主行为。平台在优化拍卖机制时,需要预估广告主对不同机制的反应,如果平台自身也有一套竞价环境模型,就能更准确地估计机制变化带来的连锁反应,从而在机制设计和流量分配上做得更精细。
这里有一个值得玩味的点:当越来越多的广告主开始用环境感知型策略时,整个市场的竞争格局会变得更加理性,但同时也更复杂。每个参与者都在预测对方的行为,博弈就上了一个台阶。这种“环境感知的军备竞赛”对未来竞价机制设计提出了新问题,也值得继续观察。
5.3 值得持续跟进的方向
从论文价值延伸开来,我认为有三个方向值得持续关注。
第一个是更丰富的环境信号。当前的竞价环境建模主要依赖出价和成本这类价格信号,如果能把流量质量分、用户兴趣分布这类内容信号也纳入环境表征,模型的泛化能力应该还会再上一个台阶。
第二个是环境表征的可解释性。环境嵌入是稠密向量,虽然效果好,但业务方很难理解向量里的语义。如果能把环境表征拆解成若干可解释的因素,比如“当前竞争热度高”“当前流量质量低”,对业务沟通和信任建立会很有帮助。
第三个是多智能体环境建模。真实广告市场中,广告主之间是彼此博弈的关系,竞价环境的变化本身就是所有参与者共同作用的结果。如果环境模型能显式建模其他广告主的可能反应,做出的决策会更接近真实博弈均衡,而这一步目前还处在很早期的探索阶段。
我个人在实际操作中的体会是,Bid2X 这类思路更大的价值不在某一个具体网络结构,而在于它逼着你重新思考数据组织方式。过去我们总把每个竞价看成独立样本,现在你得把市场当作一个需要持续理解的对象,这种视角转换带来的收益,往往比换一个更复杂的神经网络效果更明显。如果你的团队正在为竞价模型的非平稳问题头疼,不用急着上大模型,先从环境建模入手,用一个共享的环境表征去串联现有各个模块,可能比想象中更快见效。最后想提一个小建议:无论参考哪篇工作,真正动手前先把数据链路和评估体系想清楚。算法方案可以快速迭代,数据地基打得稳不稳,才是影响最终上限的底层因素。