ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

直播广告轻量出价算法:从实时竞价到工程落地的核心设计

直播广告轻量出价算法:从实时竞价到工程落地的核心设计 阿里妈妈在KDD‘25放出的直播广告出价算法核心标签就四个字轻量好用。这四个字在直播广告场景里比想象中难得多。直播间的流量像潮水一样涨落一场直播的黄金时间就那几个小时出价模型既要跟得上实时竞价又不能在算力和成本上把中小商家压垮。很多团队做直播广告出价一上来就堆大模型、上复杂架构结果线上延迟扛不住预算消耗曲线还抖得厉害最后ROI反而不如人工调价。所以这次提出的轻量出价算法真正值得聊的并不是“论文分数多高”而是它在工程落地和实际投放中到底解决了什么问题适合谁来参考——尤其是正在做直播推广的算法工程师和优化师。1. 先看直播广告出价到底难在哪1.1 一场直播的流量和搜索广告完全不是一个玩法传统搜索广告的流量是相对平稳的用户搜索一个关键词背后有明确意图广告主可以按关键词和历史转化率来出价。但直播广告不一样流量高度集中在开播后的几十分钟到几个小时内。同一个直播间在开播前十分钟和开播后一小时流量的质量、用户的购买意愿、主播的讲解节奏完全不同。这意味着出价不是一个静态函数而是要在短时间内不断感知状态、调整价格才能拿到合适的流量。更要命的是直播间的承接能力一直在变。主播状态、库存余量、优惠券发放进度都会影响转化率。如果出价模型只按历史数据定一个固定值就会出现两种情况要么流量来得太猛直播间承接不住转化率跳水要么出价太低流量根本进不来场观和成交全废。这就像约饭你不能提前三天定好菜量得一边看着桌上菜被吃掉的速度一边决定要不要加菜——隔几分钟就得判断一次。1.2 出价在实时竞价里扮演什么角色直播广告通常走实时竞价每次曝光机会来临时广告系统要根据广告主的出价、预估点击率、预估转化率等因素计算ECPM然后参与拍卖。出价算法要解决的就是在广告主给定的预算和成本约束下决定“这个流量我出多少钱”。如果只负责“出多少钱”听起来很简单。但出价算法背后还有预算分配和成本控制。预算是一个整体上限你不能在前半小时把全天预算全花完也不能一直花不出去成本控制是你要让实际成交成本尽量贴近广告主的预期。直播场景里流量价格波动剧烈高峰期流量贵低谷期流量便宜出价算法必须在不同时段的流量价格之间做动态平衡。打个比方出价算法像是一个经验丰富的家庭采购员。你给他一千块钱要求买回足够多且品质达标的菜他不能看到什么菜都冲上去买也不能一直等便宜菜等到菜市场关门。他需要观察行情、掂量手里的钱、判断菜的品质然后灵活出手。直播广告的出价算法也是这个角色只不过它是在毫秒级时间内面对成千上万次流量机会做决策。1.3 多目标、延迟转化和稀疏样本三个坑叠在一起直播广告出价还有一个特征多目标。广告主要的不只是成交往往还想要直播间互动、粉丝沉淀、商品收藏。不同目标之间有时是协同的有时是打架的。比如低价引流款能带来大量互动但成交额很低高客单价款成交额好看但转化率低、流量不容易获取。出价算法如果只看GMV很容易把预算全砸在高客单商品上结果成本飞了如果只看互动又会进来一堆“看热闹不买”的用户。延迟转化也是一个坑。用户可能在直播间看到商品没立刻下单但过几个小时之后去店铺复购了。这种延迟成交如果处理不好会让出价模型误判“这个流量没价值”进而降低出价。而直播广告的样本天然稀疏——一场直播也就几十万到几百万曝光有转化的样本更少模型训练数据远不如搜索广告充足。这些问题叠加起来就是直播广告出价的本质难点你需要在不确定性极高的环境里用一个足够轻量可靠的策略同时在实时性、成本、多目标和稀疏样本之间找到平衡。这也是我对这个轻量出价算法最感兴趣的原因。2. 轻量出价算法的核心设计思路2.1 “轻量”不是砍功能而是找主线看到“轻量好用”第一反应是什么我第一反应是它肯定没有堆上百亿参数的模型也没有复杂的多级架构。但这里要澄清一个概念轻量不等于简陋更不是为了省算力牺牲效果。更合理的理解是它把出价问题的主线拎出来了砍掉的只是旁支末节。在直播广告出价里真正的主线是三个环节预算分配、动态调价、价值预估。预算分配决定“钱怎么分到不同时段和不同直播间”动态调价决定“每次竞价出多少钱”价值预估决定“这次曝光能带来多少成交和GMV”。三个环节之间是闭环的价值预估提供预期收益动态调价把预期收益转化为出价预算消耗情况再反过来修正出价水平。轻量的设计思路就是把这三个环节做成一个个独立的、可插拔的模块而不是把它们塞进一个巨大的端到端模型里。这样做的好处是什么第一模块之间可以单独调参和上线不用每次都全量重训第二每个模块都很小在线推理的耗时可控第三出了问题容易定位是预算分配的问题还是价值预估的问题看对应模块的指标就行。2.2 用控制论的思路做调价而不是纯靠模型预测传统出价算法通常走预测路线预估点击率、预估转化率、预估成交金额然后乘上目标ROI得出一个出价。这个路线在没有太大波动时效果不错但在直播这种非平稳环境里预测模型很容易因为市场环境变化而产生系统性偏差。比如大促期间流量价格上涨模型还在按平时的成交率预测出价就会偏低流量骤降。所以轻量出价算法通常会引入反馈控制机制简单说就是“看结果再纠偏”。这有点像空调的温控器设定目标温度实际温度低了就加大功率实际温度到了就减小功率。出价也一样设定一个成本目标实际成本低了就说明出价太保守可以适当提高实际成本高了就说明出价太激进要压一压。这里最常用的就是PID控制思路——比例、积分、微分三个项。比例项根据当前误差调整积分项消除长期累积偏差微分项抑制瞬时波动。把PID用在出价上并不是一个新鲜想法但难点在于怎么把PID参数调好以及怎么和预估模型配合起来。轻量算法在这块做得比较巧妙的地方是它没有把PID当“外挂”而是把控制误差直接建模成了出价修正项让模型预测趋势让控制逻辑管收敛各司其职。2.3 价值预估用“够用就好”的特征体系价值预估是出价算法里最容易做重的地方。很多团队喜欢把用户行为序列、商品画像、直播间的实时互动、短视频内容特征全塞进模型认为特征越丰富效果越好。但在直播广告场景有几层现实问题用户行为序列很长在线推理成本高很多特征在竞价那一刻根本取不到实时值取到了也已经过期样本稀疏特征太多反而过拟合。轻量出价在这个环节的做法我理解是“抓大放小”。保留三类特征用户维度的历史成交流水偏好、商品维度的价格和类目信息、直播间维度的历史转化率和场均GMV。这三类特征互相补充用户特征解决“这个人会不会买”商品特征解决“这个品好不好卖”直播间特征解决“这个场能不能转化”。至于实时互动、弹幕情绪、当前在线人数这些信息不是不用而是放在控制模块里隐式感知不再进入预估模型。这样预估模型保持小体量训练快、推理快而且线上不易出幺蛾子。3. 核心模块拆解预算、出价、控制3.1 预算消耗曲线怎么规划预算分配在直播广告出价里往往被忽略但恰恰是“轻量好用”的一个关键。直播广告不像日常搜索广告可以全天匀速消耗预算直播间的流量峰值就那么一段时间如果按固定速率花预算很可能在流量最高峰时预算已经花完后面眼睁睁看着转化最好的流量被别人买走。合理的做法是把预算消耗安排成一条和流量价值曲线匹配的曲线。系统先根据直播场次的历史流量分布计算出一条“期望消耗曲线”比如开播前10%的时间消耗总预算的5%高峰期前后消耗40%后半场消耗55%。出价算法会实时把实际消耗和期望消耗做对比如果实际消耗太快就适当压低出价如果太慢就调高出价或者放松成本约束。这里有一个操作细节预算曲线不需要精确到分钟颗粒度太细会导致调价过于频繁系统抖动颗粒度太粗又起不到约束作用。经验上以10到15分钟为颗粒度比较合适既能感知时段变化又不会让系统跟着分钟级噪声走。3.2 出价修正比例、偏移和死区动态调价模块里最核心的是一个修正公式。基础出价一般由价值预估给出比如预估这次曝光能带来5元成交目标ROI是2那基础出价就是2.5元。光靠这个还不够还要加上控制修正项。修正项的设计通常有三种比例修正、偏移修正、综合修正。比例修正就是把基础出价乘上一个系数系数大于1表示加价小于1表示减价偏移修正是直接在基础出价上加一个正负偏移量综合修正则是两者结合。比例修正的好处是能让出价和预估值保持正比关系适合流量价格整体上涨或下跌的情况。偏移修正的好处是在出价本身很小的时候能保证一个最低力度避免出价被压得太低导致根本拿不到量。实际落地时不能把修正项直接无脑叠加必须设“死区”。死区是指误差在一定范围内时系统不调整出价。比如实际成本比目标成本高了2%以内这个误差可能是自然波动不值得调整一旦超过2%才启动修正动作。没有死区的系统会像神经敏感的人一样一有风吹草动就乱动结果调价频率极高系统反而更不稳定。3.3 多目标出价的组合方法直播广告的多目标出价在轻量算法里有一个很朴素的思路不要试图用一个模型同时预测所有目标而是把不同目标拆成主目标和辅助目标。主目标是成交金额或者成交订单量辅助目标是直播间互动、粉丝增长、商品收藏。出价时以主目标收益为核心辅助目标以加权加分的形式参与。加权加分怎么加实际操作里可以给互动、粉丝这类目标分别设定一个“价值折算系数”比如一次互动折算成0.1元一个新增关注折算成0.5元。商家设置好期望权重之后系统实时计算每次曝光机会的“总价值”再参与竞价。这种做法的好处是灵活商家如果想冲粉丝就把粉丝折算系数调高如果想清库存就把成交金额权重调高。但这里要提醒一个坑辅助目标的折算系数不能设得太高否则出价会被辅助目标牵着走。比如一个互动能带来很多关注但成交转化极低的直播间如果粉丝折算系数过高预算就会大量花在只看不买的用户身上。实际调参时辅助目标折算系数一般控制在主目标预期价值的20%以内既起到辅助作用又不会喧宾夺主。4. 从零落地一套轻量出价算法的实操过程4.1 数据准备和指标口径要先对齐动手写第一行代码之前先把数据和指标口径定清楚这比模型设计更影响效果。直播广告出价算法至少要采集四类数据曝光数据、点击数据、转化数据和成交金额数据。严格来说系统的日志里都能拿到这些数据但口径经常对不齐比如“成交金额”到底是曝光后一小时内的成交还是整场直播的成交是用户在直播间直接下单还是包含用户之后在店铺里的复购我建议一开始就设定一个统一口径曝光归因窗口和成交归因窗口都要显式配置。曝光归因窗口可以设为整场直播因为用户只要看过直播间后面再回来看直播转化功劳都可以算给这次曝光成交归因窗口可以设为曝光后1小时或者直播结束后2小时兼顾延迟转化和数据新鲜度。口径一旦定了全链路都按这个口径计算不能线上一个口径、离线另一个口径否则调参时看到的结果全是假的。数据粒度上除了原始曝光点击明细还要生成时间维度的聚合表。聚合粒度建议按分钟聚合统计每分钟的曝光量、点击量、转化量、消耗金额、成交金额。这张表是后续所有监控和调参的基础一定要做好数据质量校验否则后面一切分析都是沙上建塔。4.2 离线仿真先别急着上线上直播广告出价算法最怕直接拿线上流量试错一次错误出价可能几万块钱就花出去了。所以落地第一步不是部署而是搭离线仿真环境。离线仿真怎么做简单说就是把历史一段时间的真实竞价日志回放一遍。日志里会记录每一次曝光机会、当时的竞争价格、最终成交价、是否展示、是否成交。仿真的思路是假设出价算法当时给出的出价是多少判断它能不能在这场拍卖中胜出然后继续回放后续行为。如果胜出就认为这次曝光被买到手后续点击、转化、成交数据都归入这次买量的结果如果没胜出就跳过。仿真环境的价值在于可以快速对比不同出价策略的效果而不花一分钱真实预算。我在实际项目里一般会准备两周到一个月的历史日志分别覆盖平日和促销日这样仿真的结果才能代表不同流量环境下的表现。离线仿真跑完之后再看几个关键指标总GMV、ROI、预算消耗率、出价分布、成交笔数。只要离线指标不低于人工出价或者老版本算法再考虑上线上小流量测试。4.3 线上小流量灰度怎么设计离线仿真表现好不代表线上就能跑。线上环境有实时性要求有数据延迟还有真实的竞争对手。所以灰度设计很重要不能一上来就把100%直播间的出价切到新算法。灰度策略我可以给一个参考先拿5%的直播间或者5%的预算用量做对照组剩下的继续用老策略跑两三天看差异。灰度期间重点看两个指标一是成本控制稳定性比如目标ROI是2.5那实际ROI不能长期低于2.2二是预算消耗节奏看是不是能稳定消耗到预期比例。如果这两个指标都没问题再逐步放量到20%、50%、100%。放量的节奏也不能拍脑袋每个阶段至少要观察一个完整的直播场次周期。比如每场直播4小时那就至少观察一天里几场完整的直播避免因为单场异常数据做出错误判断。放量过程中如果出现成本飙升、预算花不出去、调价频率异常立即降回原来的比例不要犹豫。4.4 参数调优和上线脚本实例轻量出价算法的核心参数就那么几个这里我可以给一个启动配置参考。注意这不是唯一正确的参数只是经验值实际要根据场景调整。参数建议初始值说明目标ROI根据广告主历史平均ROI设定出价算法的核心目标定太低会花不出去太高会成本失控预算曲线颗粒度10分钟调价模块读取预算消耗的间隔比例修正上限±20%单次修正不能超过这个幅度防止剧烈抖动偏移修正下限基础出价的30%保证低出价时还能拿到基础流量PID比例系数0.3调整响应速度太大会震荡太小会迟钝PID积分系数0.05消除长期偏差但不希望它反应太快死区范围±2%成本误差在这个范围内时不调整出价代码实现上动态调价模块可以做得非常轻量。下面给一个简化版Python代码示意虽然线上通常用Java或C实现但逻辑一致class LightBidder: def __init__(self, target_roi, base_bid): self.target_roi target_roi self.base_bid base_bid self.budget_start None self.integral_error 0.0 def set_budget_plan(self, budget_plan): self.budget_start time.time() self.budget_plan budget_plan def predict_value(self, user_feat, item_feat, live_feat): # 轻量价值预估返回预估成交金额 # 实际场景这里会是一个小模型或者规则打分 return 5.0 def calc_bid(self, user_feat, item_feat, live_feat): predicted_gmv self.predict_value(user_feat, item_feat, live_feat) base_bid predicted_gmv / self.target_roi # 预算消耗偏差 budget_ratio self._get_budget_consumed_ratio() budget_error self.budget_plan.get_current_target() - budget_ratio # 成本偏差 real_roi self._get_real_roi() roi_error self.target_roi - real_roi # 死区判断 if abs(roi_error) 0.02 * self.target_roi: return self._apply_limit(base_bid) self.integral_error roi_error p_term 0.3 * roi_error i_term 0.05 * self.integral_error adjust p_term i_term # 比例修正 bid base_bid * (1.0 adjust) # 预算偏差修正预算消耗过快就整体压低出价 if budget_error 0: bid * (1.0 - 0.15 * budget_error) return self._apply_limit(bid) def _apply_limit(self, bid): # 防止单次调价过大 max_change self.base_bid * 0.2 if bid self.base_bid max_change: return self.base_bid max_change if bid self.base_bid - max_change: return self.base_bid - max_change return max(bid, self.base_bid * 0.3)上面的代码看起来简单但已经把控制逻辑、预算修正和死区都包含进去了。真正上线时要在这个基础上加上监控日志把每一次出价、修正量、预测值都记录下来方便事后分析。5. 常见问题与排查技巧实录5.1 冷启动阶段没有转化数据出价变成瞎猜新直播间或者新商品上线历史转化数据很少价值预估模型给出的预测值往往不靠谱出价要么偏低拿不到流量要么偏高导致成本爆掉。这是直播广告出价最常见的冷启动问题。排查思路是检查预估模型在线上的预测分布。如果预测值普遍比实际成交金额低说明模型有系统性负偏差这时可以短期内给预测值乘一个修正系数比如1.2如果预测值忽高忽低方差特别大说明样本量不足此时不要强依赖预估可以退回到“固定出价人工调整”的兜底策略等积累一定转化量再切换。实操里我还会给冷启动直播间单独设一条“最低出价线”保证曝光量不至于为零。这条线不需要很高只要能让直播间的广告位出现即可有了基础流量才有转化的可能冷启动问题只能靠数据跑起来才能解决。5.2 调价抖动严重模型在“原地发抖”调价抖动是一个很典型的问题。表现是出价序列在短时间内来回波动今天5元明天3元后天6元预算消耗跟着一起起伏ROI却没什么明显提升。这种情况的根源通常不是模型坏了而是控制模块对噪声太敏感。排查优先级先看死区设置如果死区太小误差的微小波动就会触发调价建议先放大死区范围再看PID积分项如果积分系数太大模型会有超调也就是已经纠正过来了但还在继续向同一方向调整导致过了头把积分系数调小一半试试最后看单次修正上限如果上限太大一次修正就能改出价20%以上当然会抖把上限压到10%以内往往更稳。我还遇到过一种情况不是算法参数的问题而是输入数据本身抖动。比如用了分钟级实时ROI作为误差信号但分钟级ROI噪声非常大根本不适合做控制信号。后来改成滑动窗口ROI用过去半小时的累计数据计算误差抖动立刻缓解。5.3 预算花不出去流量高峰眼睁睁错过预算花不出去和成本高是两种相反的故障但同样让人头疼。花不出去时先别急着调高出价先看是不是预算曲线规划得太保守或者目标ROI设置得太高。有的广告主目标ROI设到3出价被压得很低系统认为大多数流量都不值得买自然花不出去。排查时我会按这个顺序走第一确认预算曲线的目标消耗比例是否合理如果不是“前松后紧”要调整曲线第二确认目标ROI是否高于历史能达到的水平如果高出太多需要和运营对齐预期第三检查出价下限有些广告平台出的底价太高模型算出1元的出价根本拿不到量就要适当提高下限或者放弃一部分低质流量把预算集中到高峰期。注意预算花不出去不能一直靠提示预算曲线解决还要观察有没有“流量质量开关”。有的系统会把低质量流量直接过滤掉导致量少。如果发现过滤比例太高可以把过滤阈值放低一些让出价算法自己去判断值不值得买而不是由前置规则一刀切。5.4 延迟转化导致ROI误判调价方向反了延迟转化会直接影响成本反馈。用户今天在直播间看到商品三天后才下单付款但曝光日志里显示的成本ROI是按当天的成交算的这样很容易让系统误以为出价太高或太低。比如某天大量用户是“看到了但没买”当天ROI很低系统会认为出价太激进而压价。但实际上这批用户可能三天后集中转化那时候系统已经错过流量机会。延迟转化越长的品类比如高客单价、决策周期长的商品这个问题越严重。解决思路不是消除延迟转化而是让控制信号对延迟更鲁棒。第一种办法是把成本误差的计算窗口拉长比如用过去24小时甚至一周的成交额来计算实际ROI这样就平滑掉了延迟影响。第二种办法是引入“延迟成交归因预测”按历史上各小时的成交延迟分布把当前成交额折算成“最终预计成交额”再反馈给控制模块。这里不需要复杂模型一个简单的延迟分布表就能起到很大作用。5.5 多目标权重打架粉丝涨了但GMV崩了多目标出价最容易出现的问题是商家把粉丝和互动权重设得过高结果直播间互动数据很好看但成交额一落千丈。这个问题不是算法Bug而是目标设定本身不合理。排查时建议分两步。第一步先看主目标的成交金额在出价公式里的实际占比如果辅助目标折算价值占了总价值的50%以上那其实就是主次不分了。第二步看辅助目标的转化逻辑比如粉丝增长是否真的能带来后续复购如果新增粉丝大多是羊毛党那这个辅助目标的价值就要大打折扣。实际操作中我会建议广告主用“短期成交长期资产”双视角来设定权重。成交金额永远占大头粉丝和互动只是锦上添花权重不要超过20%。如果商家特别重视粉丝增长可以单独设置粉丝投放计划而不是让一个直播间的出价算法同时扛两个互相冲突的KPI。5.6 问题排查速查表现象可能原因诊断方法处理建议冷启动无流量预估偏差大、无历史数据看预测分布与实际成交对比加最低出价线、短期修正系数调价抖动死区太小、积分超调、数据噪声画出价时间序列看瞬时波动放大死区、调小积分系数、用滑动窗口预算花不出去预算曲线太慢、ROI目标过高、过滤太狠看预算曲线实际消耗和预期差异调整曲线、放宽ROI目标、降低过滤阈值成本长期超标出价过高、竞争变强、预估偏高看实际ROI和目标ROI的差值趋势压出价上限、调整PID参数、重训预估模型延迟转化误判归因窗口不匹配、控制信号滞后看分时间延滞的ROI分布拉长反馈窗口、引入延迟折算6. 一些在实际投放里的体会这个轻量出价算法最打动我的是它在“重量级问题”面前选择了“轻量级解法”。做广告算法的人很容易陷入一个惯性问题复杂就要用更复杂的模型去解。但真实场景里模型再强如果跟不上直播间的分钟级变化如果算力成本高到只能在实验室里跑那就没有意义。轻量算法的思路更像是一个有经验的操盘手不追求每一步都预测百分之百准确而是靠快速反馈、小步调整、守住边界来达到整体最优。我自己在实际操作中最大的感受是直播广告出价算法不是一个模型问题而是一个系统问题。模型、控制、预算、监控缺一不可。很多时候调参调了很久没有效果回头发现是数据口径或者监控指标出了问题。所以不管用了多聪明的算法先搭好稳定的数据底座和监控体系永远比追求单点模型提升更值钱。最后再分享一个小技巧在线调参的时候建议把每一次参数修改和线上指标变化都记录成一张简单的实验日报。不要只在灰度上线时记录日常微调也要记。很多效果波动不是上线那一刻才开始的而是前期某次不起眼的参数修改埋下的雷。有了实验日报至少能回溯到是哪个版本、哪个参数、哪一天开始变坏的排查效率能提升一倍以上。这个习惯我从做搜索广告时就开始养一直用到现在。
返回列表