直播广告出价这个赛道,这两年是真的卷。传统货架电商的广告出价,大家已经卷了十多年,各种算法模型、深度学习Agent轮番上阵;但直播电商一出,以前的玩法立刻显得不太顺手——直播间的流量是实时波动的,主播一句话就能把在线人数带起来,也能一句话把人气打到谷底,而广告主预算和ROI目标却始终盯着你。最近看到有团队在KDD'25上放出了关于直播推广出价算法的方案,核心卖点非常明确:轻量、好用。不是堆一个大的强化学习模型,而是把问题重新理解为在线控制问题,用很小的开销把出价调节这件事做到稳、准、省。这篇文章我想以从业者的视角,把这类方案背后的设计逻辑、关键公式、线上落地的参数配置,以及我自己踩过的坑完整拆一遍,希望对正在做直播推广出价、或者读论文想复现思路的同学有参考价值。
先说说这个内容适合谁。如果你在广告商业化团队做出价、做预算控制,或者你在研究计算广告方向、打算把论文里的方法落地,那这篇文章会很对路;如果你刚入行,对"广告出价"还停留在"广告主设置一个价格、平台按价格扣费"的认知层面,那也没关系,我会从最基础的问题讲起,把关键术语点透。整篇文章围绕的核心就一句话:直播推广的出价,怎么在算力有限、反馈又慢又稀疏的前提下,依然做到接近"最优"的投放效果。
1. 直播广告出价难在哪:先搞清楚问题再谈算法
1.1 直播间不是货架,流量曲线每秒钟都在变
传统搜索广告或者信息流广告,广告位的曝光库存相对平稳。我们可以在离线把流量分布、点击率、转化率都预估个八九不离十,出价算法面对的是一个"准静态"环境。直播推广则完全不同:同一场直播里,开播前30分钟、主播讲解爆款单品时、抽奖环节、快下播时,流量结构和转化效率天差地别。在线人数可能从几百瞬间冲到几万,也可能因为主播嗓子哑了断崖式下跌。
这种动态性带来两个直接后果。第一,广告位竞争环境不稳定,同样的出价,在直播间热度高的时候可能拿不到流量,在热度低的时候反而溢出了。第二,直播间内部的转化效率也在变——主播正在推一件高性价比商品,转化率可能比平时高3倍。如果出价算法不能实时捕捉这种变化,就会在该抢流量的时候手软、在垃圾流量上却疯狂花钱。这也是为什么"直播推广出价"需要一个新的算法范式,简单的静态出价系数已经完全扛不住了。
1.2 转化反馈又慢又稀疏,直接照搬传统玩法会翻车
传统电商广告的转化链路通常是"曝光→点击→详情页→下单→支付",每一步都有延迟,但最长的延迟也就是分钟级到小时级。直播电商链路更短:用户看到短视频或广告卡片进入直播间,可能30秒内就会点小黄车下单,看起来转化路径短了,但实际上有大量用户是"先看一会再买""加入购物车后等主播改价再买",甚至会有相当比例的下单后退款。
转化信号又延迟、又稀疏。一场直播可能只有几千个成交订单,但出价决策需要做到秒级甚至毫秒级。如果你只看最近5分钟的实际成交ROI来做决策,方差会大到离谱——运气好的一波爆单让你以为ROI爆表,接下来10分钟没订单又让你以为流量全是垃圾。直接照搬传统出价算法里的"预估点击率/转化率→算期望价值→定出价"这套流程,需要非常精准的实时预估模型,而直播间的状态特征(当前主播状态、观众互动氛围、正在讲解的商品)建模难度极高,数据回流又跟不上,翻车是大概率事件。
1.3 "轻量"不是偷懒,是线上系统的真实约束
很多人看到"轻量"两个字,第一反应是"效果不够好,所以只能用轻量方案"。实际上在广告系统里,轻量是硬约束。广告请求链路从用户刷到信息流开始,到最终展示广告,延迟预算通常卡在几十毫秒以内。出价模块虽然只是链路中的一环,但面对的是每秒几百万次请求的规模,任何一个环节引入复杂模型推理,都意味着成百上千台服务器的成本增加。
而且出价决策的频率极高。同一个广告计划,可能每秒都要决策一次,如果你用一个深度学习模型,哪怕推理只要2毫秒,乘以百万级QPS也是巨大的算力浪费。相比之下,一个基于PID控制思想、用滑窗统计量做输入的出价调节器,整个模块可能只需要几千行代码,在CPU上就能轻松扛住全部流量。这就是KDD'25这篇文章里"轻量好用"的核心诉求:在保证效果的前提下,把工程成本压到极低,让中小广告主、中小直播间也能跑得起这套策略。
2. 方案核心:把出价当控制问题,用闭环反馈代替复杂建模
2.1 经典PID视角:出价调节本质是一个误差修正器
如果不想在线训练一个深度强化学习Agent,那怎么做到"自适应调节出价"?一个非常自然的思路是:把出价过程看成一个反馈控制系统。我们有一个目标(比如目标ROI、目标消耗曲线),系统实时测量当前状态(当前累计消耗、实时GMV、实时ROI),计算目标与实际之间的误差,然后根据误差的大小、累计情况、变化趋势,来调整出价。
这就是经典的PID控制思想,公式长这样:
bid(t) = base_bid × (1 + Kp × e(t) + Ki × ∫e(τ)dτ + Kd × de(t)/dt)其中e(t)是当前误差(目标ROI减去实际ROI,或者目标消耗率减去实际消耗率),∫e是误差的累计项,de/dt是误差的变化速率。Kp、Ki、Kd分别是比例、积分、微分系数。
用大白话解释一下这三个系数的作用。比例项Kp决定了"当前偏差有多大,我就多大幅度地调整出价",偏差越大、提价或降价越凶。积分项Ki解决的是"长期慢性偏差"——比如整个大盘流量变贵了,你的ROI一直压低,但每次只靠比例项调整又不够,积分项会把累积的偏差一直叠加,直到出价高到能把ROI拉回目标水平。微分项Kd解决的是"变化趋势"——如果当前偏差虽然还不大,但误差正在快速扩大,微分项会提前加大调节力度,反之如果误差在快速收敛,微分项就避免你调整过头。
我试过的一类做法里,最有效的是把出价分成两条控制环路:一条盯ROI,一条盯消耗节奏。ROI偏低了要降出价省钱,消耗偏慢了要提价抢量,两者会有冲突,需要加权融合。这也是从论文思想到工程实现之间最需要花心思的地方。
2.2 轻量状态机与模型压缩:不搞大规模强化学习,照样能"学"
这套PID框架听起来简单,但它最大的问题是怎么设定"合理出价"的基准线,以及怎么应对不同直播间、不同时段的效果差异。KDD'25的方案巧妙之处在于:并不需要在线训练一个大模型,而是可以把它拆成一个轻量状态机加一个小网络。
具体来说,系统维护一个低维状态向量,包含当前直播间的热度、实时累计GMV、累计消耗、当前ROI、出价均值、流量曲线阶段(开播、中场、尾盘)等。这个状态向量喂给一个很小的MLP(一两层,几百个参数),输出的是下一时刻的"出价调整偏移量",而不是直接预测出价或者预测ROI。这样模型只负责学习误差修正的"形状",而真正的出价约束、预算控制仍然由外层的控制逻辑保证。
从优化角度看,这种结构实际上是在做带约束的在线优化:目标函数是最大化累计GMV,约束条件是ROI不低于某个阈值、总消耗不超过预算。把约束条件通过拉格朗日松弛变成惩罚项,PID控制器就是在线估计拉格朗日乘子的过程。理解了这一点,你就会明白为什么这种轻量方案在效果上不会比一个复杂的DRL方案差太多——它并没有放弃优化目标,只是换了一种计算开销小得多的方式去逼近最优解。
2.3 冷启动:没有实时反馈时怎么给初始出价
直播出价最尴尬的阶段是开播前半个小时。这时候直播间可能还没有几个用户,一个成交都没有,ROI误差的每一项都是NaN或者零。如果你让PID控制器在无反馈状态下运行,它大概率会输出一个很随机的出价,或者干脆不动。
我见过比较稳妥的做法是"历史相似直播间先验 + 保守初始出价"。系统会找一批相似直播间——同品类、同时段、主播历史转化率接近——把它们的平均ROI、平均成交转化率取出来,作为初始出价的基准。然后用一个很小的探索率(比如5%的请求做轻微扰动),一点点收集当前直播间的真实转化数据。一旦有了前30分钟到1小时的成交样本,控制器就可以切到正常的PID反馈模式,而且切换过程要用"软启动",让出价调整幅度从零慢慢放开,避免从保守状态突然激进加价,导致直播间流量瞬间涌入、消耗失去控制。
3. 从公式到线上:部署链路与参数调优实操
3.1 出价模块在广告系统里的位置,以及双环路设计
先说清楚出价模块在整个广告链路里站在哪里。用户刷到一条短视频或者一个广告位,广告系统先做召回,筛出一批候选计划;然后做了粗排、精排,预估每个计划的点击率、转化率、商品价值;最后到了拍卖环节,系统根据每个计划的"出价"来决定是否赢得这次曝光。出价模块就是在精排后、拍卖前,为每个计划算出一个合适的出价值。
直播推广的实时性要求更高,所以我建议把出价控制拆成快慢两个闭环。快环每1到5分钟跑一轮,负责跟随直播间短时波动,调整的是出价系数;慢环每15到30分钟跑一轮,负责校准整个投放段的预算消耗节奏,确保到大促时段、下播时段预算恰好花完且不超花。这样有两个好处:快环不会被慢环的大调整干扰,慢环也不会因为快环的秒级抖动而频繁误判。
实时数据管道也很关键。消耗流水、成交流水、直播间在线人数这些信号要以分钟级甚至秒级的方式回流,然后聚合出"当前累计消耗、当前实时GMV、当前ROI"等统计量,写进KV存储,出价模块每次计算时直接读取,不需要重复算数。
3.2 参数初始化与调参方法
要跑起来,先给一套相对安全的初始参数。假设你的目标ROI是3,也就是花1元要带来3元GMV。Kp可以设在0.05到0.2之间,意思是误差每差1个单位,出价调整5%到20%;Ki设得小一点,推荐0.001到0.01,因为积分项会累积,设大了很容易超预算;Kd设0.1到0.5之间,但线上我更建议先设0,等稳定了再逐步加。
调参有一个经验口诀:误差很久都拉不回来,说明P太小或者I没起作用;出价来回震荡、曲线像锯齿,说明D太大或者反馈延迟太高;预算总是花不完,说明出价整体偏低,要调高基准价或者调大Kp。我自己习惯的做法是先在离线用历史日志重放,把误差曲线、出价曲线、消耗曲线全部画出来,肉眼观察调节过程是不是"一步到位、但不过冲"。
举个例子,一场直播2小时,预算10万,目标ROI=3。前30分钟应该消耗2万到3万,如果实际只花了5000,说明出价太保守,快环要把基准出价往上提;但如果前30分钟就花了6万,那必须要立刻压价,否则后面没有预算承接高转化时段。慢环这时候要介入,把剩余预算按时间指数平滑地重新分配到后续各个时段。
3.3 轻量化与容灾
即使我们用了一个很小的MLP,在线部署时仍然可以进一步压缩。我试过把网络权重做8bit量化,推理耗时能从亚毫秒级降到几十微秒级,精度损失几乎可以忽略。更激进的做法是直接把模型蒸馏成一张查表表:对状态向量做离散化,静态预计算好对应的出价调整量,线上纯查表,连模型推理都省了。
容灾方面必须有一条底线规则:如果出价模块依赖的实时特征流断掉了,或者KV读取超时,系统不应该报错或者返回一个极端出价,而是回退到默认出价系数1.0,让流量正常跑。宁可效果暂时平庸,也不能搞挂整条广告链路。我见过一次线上故障,出价模块因为依赖的缓存集群抖动,瞬时返回了0,结果一堆计划完全竞价失败,预算花不出去,广告主投诉电话直接打爆。所以兜底逻辑一定要写死,并且要有独立的监控报警。
4. 效果怎么评估?哪些场景吃了红利、哪些场景会翻车
4.1 离线与在线指标怎么读
评估这套出价算法,不能只看单一指标。我一般会同时盯四块:累计GMV有没有提升、ROI有没有守住、预算消耗达成率高不高(理想是接近100%)、以及出价曲线是否平滑。离线重放时,把历史日志里的请求按原顺序重新喂给新的出价策略,对比旧策略,看这四块指标的变化。
但离线重放有一个天然缺陷:它忽略了竞争对手的反馈。你提价抢到了更多流量,可能导致其他广告主也提价,这个互动过程离线模拟不了。所以离线结果通常比线上更乐观,一般我只看趋势,不直接拿离线数值作为上线依据。真正要拍板上线,必须跑在线A/B实验。实验层要隔离,不能把所有流量都切到新策略;最少要跑2到4周,覆盖工作日和周末,有条件的话最好跨一场大促。
4.2 不同类目的适用性差异
直播出价算法的表现,和品类特征高度相关。
| 类目 | 转化时延 | 反馈稀疏度 | 控制策略建议 |
|---|---|---|---|
| 服饰美妆 | 短,冲动消费多 | 稀疏度中等 | 快环灵敏度可以高一点,Kp适当调大 |
| 3C数码 | 较长,决策慢 | 很稀疏 | 反馈波动大,要加大积分项的平滑,Kp别太大 |
| 食品快消 | 短,复购多 | 中等 | ROI口径要注意是否包含复购,LTV口径更合理 |
| 高客单家具 | 很长,咨询链路多 | 极稀疏 | 不建议用纯实时反馈,要配合较长的归因窗口 |
这里分享一个我实际操作中的经验:同一个出价策略,在服饰类目上效果显著,GMV能提升8%左右;但换到3C数码,反而出现ROI波动变大、预算花不满的问题。原因就是3C用户从进入直播间到下单,决策链路长,实时反馈信号太稀疏,比例项的每一次调整都在"猜",越调越歪。后来我把3C类目的反馈窗口从5分钟拉长到1小时,并且把积分项的权重调高,才稳住。
4.3 哪些场景要用反而危险
再好的算法也有边界。第一种是新直播间、完全没历史数据,这时候连相似直播间的先验都找不到,控制器容易乱来,建议前几场用固定出价观察。第二种是大促场景,流量结构突变,直播间热度可能瞬间冲上十倍,纯反馈控制的PID会反应过度,需要引入大促专属的前馈策略,或者干脆降级成保守出价。第三种是广告主把预算设得极低,出价调节空间只有百分之几,控制环几乎没活动范围,这时候算法也作用有限,不如直接告诉广告主预算太低了。
5. 踩坑实录与排查手册
5.1 出价震荡:锯齿状出价曲线怎么修
现象很直观:出价曲线像锯齿一样上上下下,消耗曲线跟着一抖一抖,广告主觉得系统在发疯。最常见的三个原因:反馈延迟高于调节频率、Kp调得过大、微分项放大了噪声。
排查思路是先把出价序列和消耗序列的时间戳对齐,看是不是存在明显的相位差。如果是反馈延迟的问题,把调节周期从1分钟拉长到5分钟,或者对反馈信号做滑动平均,也能缓解。如果Kp太大,直接减半再观察。微分项我建议先设成0,等系统稳定了再说,因为在广告场景里,误差变化率本身受流量波动影响极大,非常容易被噪声主导。
5.2 ROI长期低于目标,但预算花得飞快
这通常是"花对了钱却没买对流量"。控制器发现ROI不达标,已经拼命压价,但消耗还是很快,说明出价虽然降了,但竞价环境里依然有大量低质曝光在向你倾斜。建议检查人群定向是否过宽、素材是否被系统判定为高点击低转化类型,以及归因时间窗是否太短——直播场景下很多用户在直播间看了一会儿之后才去下单,如果归因逻辑不准确,会用短窗口低估真实ROI。
5.3 反馈数据延迟导致控制器误判
直播间的成交数据回传有时会滞后,比如支付回调延迟、异步回传的广告曝光数据晚到。控制器看到的ROI是"过去一小时"的,但当前流量状态已经变了,于是系统根据旧数据做出错误调节,造成新的偏差。
解决办法是把归因逻辑改成"事件时间"而不是"消耗时间"聚合,也就是说,一笔消耗花的钱要等它对应的转化事件回来之后再进行ROI计算。对于延迟实在太长的转化(比如直播间加购后两天才下单),建议设一个衰减权重,超过1小时的转化逐渐打折,避免陈旧的转化信号反复冲击控制器。
5.4 排查速查表
| 现象 | 可能原因 | 验证方法 | 修复动作 |
|---|---|---|---|
| 出价锯齿状、消耗抖动 | 反馈延迟高/Kp大/D项敏感 | 画出价与消耗时序图,看相位差 | 调长反馈窗口、减小Kp、D置0、加低通滤波 |
| ROI低但消耗快 | 低质曝光占比高、定向宽、归因窗口短 | 拆解消耗来源、检查定向报表 | 收窄定向、降低基准出价、调整归因逻辑 |
| 预算前松后紧 | 慢环校准太弱、流量突降 | 看分时段预算执行曲线 | 加大慢环权重、重新做剩余预算分配 |
| 冷启动前30分钟无效 | 无反馈信号、控制器冻结 | 查看初始出价是否=基准价 | 启用相似直播间先验、增加小额探索 |
| 大促当天效果异常 | 流量波动超控制范围 | 对比历史流量基线 | 切换大促模式、手动降级为保守出价 |
最后分享一点我的个人体会
把这类"轻量出价算法"从论文变成线上系统后,我最大的感受是:控制环千万别设计得太贪心。很多同学一上来就想整套全自动、全自适应,恨不得每个参数都让模型自己学。但实际上广告数据本身的噪声、延迟和竞争反馈已经足够复杂,把PID的基本盘做稳,再叠加一个很小的学习率去修正残差,已经能拿到90%的收益。轻量、好用,这意味着部署成本足够低,线上出了问题能快速定位、快速回滚,而不是抱着一个几亿参数的黑盒模型在深夜里摇头叹气。
如果你接下来想往这个方向做深入,我建议从两条线继续挖:一条是给控制器加入更多前馈信号,比如直播间的实时热度曲线、主播正在讲解的商品属性,让它在流量突变前提前调整;另一条是把多计划、多直播间的联合预算分配也纳入控制框架,做一个两层联合调节。这个方向在工业界的价值还远没被挖尽,希望这篇拆解能给你一些实战层面的参考。