ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

直播广告出价算法:轻量好用的实时控制策略解析

直播广告出价算法:轻量好用的实时控制策略解析 昨晚翻KDD25的录用列表看到阿里妈妈那篇关于直播广告出价算法的文章一下子想起自己去年大促被直播间出价折腾的场景。直播广告大概是计算广告里少有的、能把“实时性”三个字推到极限的战场主播话术刚切场观数据就变了流量稍微抖一下ROI立刻往下跌广告主嘴上说着保ROI眼睛却盯着GMV峰值。出价算法在这样的环境里不是简单“跑个模型调个价”而是一个需要在几十毫秒内做决定、同时兼顾预算、ROI、流量波动和可控性的实时控制问题。这篇KDD25文章把“轻量好用”摆上台面正好戳中了很多团队一直以来的痛点——不是没有算法是算法太重、太黑盒、太不敢上。下面按我的理解拆开聊把难点、设计思路、落地细节都交代清楚。1. 直播广告出价难在哪1.1 直播间和搜索/信息流广告根本不是一回事很多做搜索广告出身的人一转到直播广告第一反应是出价嘛我熟。但实际一接需求马上就会发现之前那套经验基本没法直接用。搜索广告的用户带着明确意图来query背后是一个稳定翻译好的需求广告计划的出价可以相对固定分钟级甚至小时级调价都够用。信息流广告虽然也是实时竞价但优化目标相对集中用户兴趣变化是缓慢的模型可以用离线批量更新兜住大部分波动。直播广告完全反过来。直播间是一个“人货场”都在剧烈变化的空间主播状态、讲解节奏、场观人数、商品顺序、优惠力度任何一个变量抖动都会直接影响流量价值。同一个用户在主播讲爆品时点进直播间和在其他时段点进直播间成单概率可能差好几倍。这意味着出价决策必须做到单请求级别而且要做到“一边消耗预算一边保ROI一边追GMV”三线并行。搜索广告里的“计划”和“单元”概念在直播场景下被压缩成了“一场直播的实时节奏”原来那种批量改价的玩法在这里完全跑不通。我习惯用下面这张简表来说明差异带过的实习生基本看完就能理解为什么直播出价不能照搬老办法对比维度搜索广告信息流广告直播广告竞价更新粒度分钟级/小时级准实时秒级甚至单次请求核心优化目标点击/转化转化/留存GMV/ROI/场观主要约束条件预算预算频控预算ROI实时节奏不确定性来源query意图相对稳定用户兴趣漂移主播状态、流量脉冲、讲解节奏等复合来源可解释需求中低高因为广告主就盯着直播间消耗看1.2 出价算法要同时伺候四个“大爷”直播间出价的难点归根到底是要在一个强实时环境里满足四重约束。第一重是预算平滑。广告主对“预算花得太快”极度敏感一场直播好不容易攒起来的自然流量如果付费流量半小时就把预算烧光后面就眼睁睁看着直播间冷场。预算平滑本质上是要求消耗曲线近似一条直线而不是一把梭哈。第二重是实时性。这里说的实时不只是“模型推理要快”而是整条链路要快曝光事件、点击事件、成交事件要实时回流预算消耗口径要实时统计出价倍率要实时更新。任何一环出现分钟级延迟策略就是在用昨天的数据做今天的决定效果必然打折扣。第三重是ROI约束。直播广告主对ROI的执着程度远超其他广告类型。大促期间几乎所有商家都会在后台设一个ROI红线一旦策略让ROI跌破红线广告主可能当场关停投放。所以算法必须在“追量”和“保ROI”之间做动态平衡这不是一次性的约束而是全程实时变化的约束。第四重是可解释性。广告投放系统出了问题运营和广告主的第一个问题永远是“为什么出价突然翻了3倍”。如果策略是个黑盒没人能回答这个问题那么不管你离线指标多好看线上都不敢给你放量。这个“不敢用”的成本比算法本身的效果损耗还要致命。1.3 为什么传统RL方案在直播间“不轻也不好用”强化学习在出价方向上被反复尝试过理论上它确实很适合做这种序贯决策把出价建模成马尔可夫决策过程状态包含剩余预算、时间进度、流量预估动作是出价倍率奖励是GMV与ROI的加权。但真正落地的时候问题一个接一个。首先是部署成本高。一个RL策略要上线需要维护状态特征链路、在线推理服务、奖励归因模块和持续训练任务这套基建对中小团队来说非常重。其次是样本效率低。直播广告的成交信号稀疏出价动作的反馈延迟又长要训练出一个稳定的策略需要很长时间的积累而这个过程中业务还得持续承担探索代价。最要命的是可诊断性差。RL策略一出问题你很难判断是环境变了、状态估计偏了还是策略本身探索出了问题往往只能整体回滚。我在多个项目里的实际感受是直播间不缺更聪明的黑盒模型缺的是一个能解释清楚、能快速调参、能兜底保命、同时还有不错效果的出价方案。“轻量好用”这四个字本质上就是冲着这个缺口去的。2. 轻量好用的算法到底在“轻”什么2.1 轻量不是牺牲效果而是重新分配复杂度很多人一听“轻量”就觉得是效果妥协这个误解要先纠正。直播出价场景里的轻量是把复杂度从“模型容量”挪到“控制逻辑”上。一个重模型的出价策略就算离线AUC再高线上在面对实时流量脉冲时照样可能失灵。反而是那些结构简单、反馈直接的控制策略在各种极端流量下表现得更稳。我习惯把这种思路类比成“请一个熟悉业务的熟练工”而不是“请一个顶尖专家团队驻场”。专家团队确实上限高但磨合成本、沟通成本、出错后的排查成本都太高了。在直播间这种“今天必须把钱花出去还要花得值”的现实压力下稳定可靠、随时可控往往比理论上的最优更重要。轻量算法追求的不是绝对最优而是在“可上线、可解释、可快速迭代”的前提下尽可能逼近最优。还有一个容易被忽略的点轻量算法的上限其实不低。因为控制逻辑简单透明工程师可以快速定位瓶颈把精力集中在更关键的信息利用上比如更准的实时转化预估、更细的流量价值分群。这些改进带来的增益很多时候比模型换架构还要大。2.2 业界两条技术路线的对比PID控制与强化学习在直播出价方向我见过最主流的两条技术路线一个是基于PID反馈控制的路线另一个是基于强化学习的路线。PID路线的核心思路是把出价倍率看成一个控制量用“实际消耗速度与目标消耗速度的偏差”作为反馈信号实时调整倍率。它的优点是简单、可解释、调参直观缺点是面对多约束时容易顾此失彼需要加各种保护逻辑。RL路线的优势在于能自动学习出复杂的出价策略把预算消耗、ROI、竞争环境都揉进一个策略里。但前面说过它的部署门槛和高线上风险是现实阻力。真正在业务里跑得稳的团队我观察到多数是“用PID保底用RL在局部环节调优”而不是一上来就全量替换。对比维度PID控制路线强化学习路线模型复杂度低几个反馈项即可高需要策略网络和价值网络可解释性好每个调节项都能拆开讲差策略行为难解释离线验证方式历史回放参数扫描离线环境模拟难度较高线上风险相对可控有上限保护探索动作可能导致消耗异常维护成本低调参即可高需要持续训练与监控实际落地案例大量探索中部分大厂有落地2.3 从KDD25这类新工作反推核心模块大概长什么样我这里不替论文背书具体公式更准确地说我读这类工作的方法是先拆出它要解决的模块再对照原文验证我的推断。就“直播广告轻量出价”这个方向我把核心框架拆成三个模块。第一个是出价倍率生成器核心任务是接收预算消耗进度、ROI达成情况、实时流量强度输出一个出价倍率。这个模块用可控的数学表达代替黑盒模型是“轻量”的关键。第二个是流量强度感知模块用来感知当前竞价环境是激烈还是冷淡常用手段是盯竞价成功率的滑动窗口、实时ecpm水位、头部流量价格变化。第三个是约束保护层负责把出价限制在安全区间比如ROI低于阈值时立刻压价、出价变化幅度超过上限时自动熔断。这三个模块合在一起正好形成一个闭环感知环境、计算偏差、调整出价、保护约束。它不需要大模型的推理开销也不需要复杂的训练流水线工程师半天就能把逻辑摸透这才是“好用”的本意。论文里可能还有更细致的改进但底层逻辑大概率跑不出这个框架。3. 手把手一个可落地的出价算法框架3.1 整体架构和数据流不管论文里的方案多精巧拿到自己业务里落地时最终都要落到一套清晰的数据流上。我自己设计过一个通用框架分层拆开是这样的事件实时上报层是所有动作的前提。曝光、点击、成交、竞价请求结果这些事件必须进实时链路延迟控制在秒级以内才能支撑后面的策略计算。然后是状态计算层这一层维护直播间粒度的实时统计包括已消耗预算、当前ROI、消耗速率、竞价成功率等指标这些指标会被策略层高频读取。再往上是策略计算层输入状态输出出价倍率。最外层是出价执行层把基础出价乘以倍率夹在设置的上下限里最终发给竞价系统。注意一个细节出价执行层必须设置超时机制。策略计算如果超过预期耗时直接使用上一轮的倍率不让线上请求因为等待策略而卡死。直播场景的流量峰值很夸张宁可降一点精度也不能把链路堵死。# 数据流可以简化为这样一条链 # 竞价请求 - 实时状态聚合 - 策略计算(倍率) # - 出价上限/下限clamp - 提交竞价3.2 核心公式与参数调法基于常见的反馈控制做法我给出一个可当作起点的出价倍率框架这个框架在多个场景下实测过基本稳定具体参数需要按业务调整。核心思路是把出价倍率拆成三个因子的乘积bid_t base_bid * pace_factor * roi_factor * heat_factorbase_bid是基础出价来自转化预估模型和单品价值估算pace_factor是预算进度调节项roi_factor是ROI保护项heat_factor是流量热度修正项。三个调节项都设计成围绕1.0波动的数最后作用在基础出价上。pace_factor用比例控制来写elapsed_ratio 已过时长 / 总投放时长 budget_ratio 已消耗预算 / 总预算 pace_factor 1 k_p * (elapsed_ratio - budget_ratio)这个公式的含义很直观如果时间过去一半但预算只花了三成说明出价太保守适当提价反过来预算花太快就压价让消耗曲线回归匀速。k_p控制调节力度我通常建议初始值取0.02到0.05先跑一天看消耗曲线再微调。roi_factor是ROI保护项roi_diff roi_target - roi_current roi_factor clip(1 k_roi * roi_diff, 0.8, 1.3)roi_current高于目标时不忘加价去抢量低于目标时就压价保ROI。k_roi初始值建议取0.05到0.1夹带的上下限防止ROI保护项过度反应。heat_factor则基于竞价环境的实时水位比如竞价成功率滑动窗口如果快速下降说明竞争加剧适当降低倍率避免花冤枉钱。为什么用乘法而不是加法这是我自己踩过坑之后的体会。不同直播间的base_bid差异可能差出一个量级加法调节的尺度很难统一乘法调节天然形成了一个与基础出价解耦的倍率因子不管是大主播直播间还是小商家直播间同一套策略逻辑都能直接用。def compute_bid(base_bid, ctx): # ctx实时状态上下文 elapsed ctx.elapsed_ratio budget_ratio ctx.budget_used / ctx.total_budget pace 1.0 k_p * (elapsed - budget_ratio) roi_diff ctx.roi_target - ctx.roi_now roi_protect clip(1.0 k_roi * roi_diff, 0.8, 1.3) heat clip(ctx.heat_index, 0.8, 1.5) # 流量热度修正 bid base_bid * pace * roi_protect * heat return clip(bid, ctx.min_bid, ctx.max_bid)调参顺序也有讲究。我一般先调pace_factor让预算消耗曲线接近直线再调roi_factor守住ROI底线最后才放heat_factor去追流量红利。反过来调你一定会被三个因子互相干扰搞到崩溃。3.3 离线评估和线上验证的基本流程新算法上线前离线验证能帮你挡掉大部分低级错误。直播广告因为没有完整的离线竞价环境最常用的办法是历史回放取过去一周的真实竞价日志模拟不同策略在同一批流量上的表现。重点看三个东西虚拟消耗曲线是否平滑、模拟ROI是否达标、出价倍率的分布是否合理。历史回放有个陷阱它只能告诉你“同一批流量下策略怎么动作”无法还原对手竞价行为的变化。所以离线结果再好也必须走线上小流量实验。我自己的习惯是先拿5%的流量跑prototype观察2到3个小时重点盯消耗速率有没有突变、出价分布有没有尖峰、ROI有没有跌破红线。确认没有明显异常后再逐步放大到20%、50%直到全量。线上验证期间要盯的指标不只是ROI。我整理过一张复盘指标表每次实验结束都对着填一遍监控指标关注原因异常信号参考消耗速率预算平滑的直接体现单分钟消耗环比突变超过50%出价分布P50/P99判断出价是否稳定P99激增说明调节项可能失控竞价成功率验证heat_factor是否合理成功率长期过低说明出价没有竞争力支付ROI核心业务目标跌破红线优先于其他指标GPM直播间整体成交效率优化ROI时要防止GPM崩塌4. 落地中的坑与排查实录4.1 冷启动阶段出价震荡直播刚开播的头30分钟我几乎每次都遇到出价震荡倍率要么冲到上限抢不到量要么压得太低没量。原因不难理解冷启动阶段实时统计窗口里样本太少ecpm和转化率预估的置信度都不够反馈控制就会左右猛打方向盘。解决思路是在策略前面加一个“先验期”。开播前用过去几场同类型直播的消耗曲线生成初始倍率前10分钟尽量沿用这个倍率不做过大幅度的调整。同时把k_p和k_roi临时调小出价变化幅度限制在20%以内。等统计窗口攒够样本、置信度上来之后再逐步放开控制器恢复正常调节力度。这个“先稳后敏”的策略本质上是用开播前10分钟的微小损耗换掉后面几小时的剧烈震荡我觉得非常值得。4.2 预算消耗过慢或过快时的排查思路预算消耗过慢先别急着把k_p调大。我的排查顺序是先看实时ecpm和竞价成功率如果ecpm没有异常、成功率也正常说明不是竞争不过而是策略压价压得太狠。再查pace_factor是不是卡在了一个过低的水平比如出价倍率长期小于0.9那就要考虑是不是历史数据里把过去某次的消耗过快错误地学成了保守信号。预算消耗过快正好相反多半是ROI保护项没起作用。常见情况是roi_now统计延迟了策略以为ROI达标就拼命加价等真实ROI数据回流后已经造成了一波超支。解决办法是给ROI统计加一个“半衰期加权”让最近几分钟的成交数据权重更大减少延迟带来的误判。另有一个容易被忽略的地方出价上限的夹取逻辑。如果max_bid设得过高某个热点商品讲解片段可能把出价顶到天上产生超高价成交。排查时如果发现P99出价异常第一件事就是检查max_bid设置和heat_factor的夹取范围。4.3 大促流量脉冲下的降级策略大促流量波峰是直播出价系统最严峻的考验主播带着全场流量一起爆发时实时统计、预估模型、出价服务都会瞬间被打到高负载。我采用的降级策略是分级的先削峰对实时计算请求做限流和采样降级保证核心链路在能力范围内运转再缓存对热门直播间的出价结果做短时间缓存同一个直播间同一秒内的重复请求直接命中缓存最后兜底策略计算超时就直接采用最近一个已知有效的倍率同时停止更新倍率直到系统恢复。大促期间我会额外加一个熔断规则如果出价倍率在几个周期内波动幅度超过设定阈值立即冻结倍率让流量恢复平稳后再重新放开。我自己踩过最大的坑就是大促时忘了调大监控告警阈值结果正常的策略波动也触发告警半夜被叫醒好几次。4.4 一张问题速查表把常见的直播出价问题整理成一张速查表团队里的新人照着排基本能解决八成问题现象可能原因排查步骤常用处理冷启动出价震荡统计样本不足查开播前先验倍率、查浮动幅度使用先验倍率临时收紧调节力度预算消耗过慢pace_factor过于保守查竞价成功率、查倍率分布增大k_p或放宽下限预算消耗过快ROI保护失效或统计延迟查roi指标延迟、查出价P99半衰期加权调低max_bidROI达标但不出量base_bid和倍率乘积过低查基础出价、查heat_factor微调基础出价或放开上限大促流量高峰打爆服务实时链路过载检查CPU/GC、请求排队时长分级降级缓存熔断最后再分享一个小习惯每次上线新的出价策略前我都会在后台挂一个“出价漂移监控”连续五分钟的出价均值偏离基线超过30%就自动告警。这个小东西帮我挡住了至少三次线上事故比任何模型指标都管用。直播广告出价这块稳定永远是第一位的聪明算法是锦上添花而不是雪中送炭。KDD25这篇阿里妈妈的工作最打动我的地方不是它多新奇而是把“让业务敢用、能用、愿意用”放在了第一位。毕竟再好的算法上不了线就是零。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进