Skip to content
Charles Shao
Go back

Pacing 目标曲线:时段消耗权重怎么设计

Updated:
–views

本文是 买侧竞价链路 系列的第 9 篇(目标曲线)。 全系列 9 篇:

  1. Bidder 竞价服务架构
  2. OpenRTB 协议精讲
  3. Bidder 解析层
  4. Bidder 定向过滤
  5. RTA 竞价前过滤
  6. Bidder 频次控制:五维配置与身份降级
  7. Bidder 频次控制工程篇
  8. Bidder 预算 Pacing
  9. Pacing 目标曲线

一句话定位:Pacing 的目标消耗曲线 r(t) 并非凭空设定,而是通过将时段消耗权重 w(τ) 对齐流量可得性与转化价值,并经过离线批处理管线的平滑与归一化所生成,它与实时的 PID 控制器共同构成了预测与纠偏的完整闭环。

在程序化广告的日常投放中,我们常常会遇到一个反直觉的现象:许多预算 Pacing 策略跑不稳、消耗大起大落,其根本原因往往并不在于 PID 控制器本身存在缺陷,而是作为基准设定的目标曲线从一开始就画错了。PID 控制器的算法再精妙,也仅仅是在执行毫秒级的实时纠偏,它的工作前提是默认你给定的目标曲线是完全合理的。试想一下,如果 r(t) 要求竞价系统在一个根本没有多少流量池支撑的凌晨时段去强行追赶一个不切实际的高昂消耗目标,那么控制器只会徒劳地将出价系数 α 持续拉满;由于客观上抢不到足够的广告曝光,系统必然会陷入积分饱和,最终在早高峰流量大盘突然涌入时引发极其剧烈的预算过冲。

正因如此,如何科学地设定时段消耗权重,构成了整个 Pacing 体系链路的上半场。这本质上是一个宏观的预测问题:我们需要提前预估「在今天每个不同的时段里,到底值得花掉多少预算」,随后将这些离散的权重累积并归一化,最终形成平滑的目标曲线。本篇文章就将紧紧围绕这个核心参数 w(τ) 展开深入探讨。

TL;DR

Table of contents

Open Table of contents

一、先厘清:目标曲线和权重是什么关系

在深入探讨业务逻辑之前,我们需要明确 Pacing 的目标曲线 r(t) 在系统中的角色:它明确定义了「截至时刻 t,累计的广告消耗应当达到全天总预算的百分之几」,这正是 PID 控制器赖以运作的基准设定值(setpoint)。需要强调的是,这条 r(t) 曲线绝不是靠拍脑袋画出来的,它是通过将每个切分时段的消耗权重 w(τ) 逐一累积,并进行严格的归一化处理后推导而来的:

         Σ(τ ≤ t) w(τ)              w(τ) = 分配给 τ 时段的消耗权重(相对量)
r(t) = ──────────────────  ∈ [0,1]   分母 = 全天权重之和 → 保证 r(T) = 1(收盘恰好花完)
         Σ(all τ)  w(τ)

由此可见,不同的策略实际上只是在这种权重分布上演化出的分支:

综上所述,设计 Pacing 目标曲线的本质核心工作,就等同于设计如何为 w(τ) 赋权。接下来摆在我们面前的问题就只剩下一个:w(τ) 到底应该正比于什么业务指标?

二、权重对齐什么:量、可得量、还是价值量

在评估「哪个时段更值得分配预算」时,业界普遍存在三种截然不同的衡量口径,它们直接决定了预算曲线最终会向全天的哪一端发生大幅倾斜:

三种加权口径下的时段权重形状对比图:横轴为投放时段 0~24 小时,纵轴为该时段权重占日预算的百分比;蓝线『量(请求数)』呈上午与晚间双峰、触达相对均匀,绿线『可得(请求 × 赢率)』形状类似但晚间被放大(夜间竞争小、赢率高),紫线『价值(请求 × 赢率 × 转化价值 ÷ 价格)』明显向晚间高转化时段倾斜、上午被压低;三条曲线下的面积都等于 100%,即花完同一笔日预算,差别只在时段分配 三种口径下的 w(τ) 形状:面积都等于 100%(花完同一笔预算),差别在「往哪个时段倾斜」。纯量触达均匀但高峰更贵;价值向晚间高 ROI 倾斜但更集中。

口径w(τ) ∝曲线特征适合场景潜在风险
量(流量)该时段可竞价请求数触达均匀、节奏平稳品牌与覆盖类;默认起点易拉高单位采买成本
可得量请求数 × 预估赢率贴合真实可买量竞争激烈、赢率差异大强依赖赢率预估模型
价值量请求数 × 赢率 × 转化价值 ÷ 成交价向高 ROI 时段倾斜效果与深度转化类易塌缩成 ASAP 丢覆盖

2.1 为什么纯流量加权不是最优解

从第一直觉上来看,「顺着流量大盘的自然分布来花钱」似乎是一项顺理成章的无脑策略:既然某个时段涌现出的广告请求量大,理所应当就该多分配一些预算去竞价。然而,真实业务交易场景中的痛点在于,流量最为丰沛的时段(例如早通勤与晚间高峰)往往也是各家 DSP 争夺最激烈、底层流量竞胜价格被推至最高峰的拥挤窗口。如果纯粹依据请求大盘量来进行加权分配,就等同于主动将最核心的预算倾注进了最昂贵的红海市场里,这不可避免地会导致需求方在采买的整体单位成本上吃大亏。

2.2 为什么纯价值加权同样充满隐患

既然纯流量加权会推高成本,那我们干脆按照「每一块钱能买回来多少转化价值」来进行绝对的加权分配行不行?单纯从单次曝光优化的极值解来审视,这毫无疑问是极其完美的——预算本就应该向边际 ROI 最高的黄金时间窗口去无限堆砌。但这种极限操作一旦落地到工业界,会立刻暴露出两个致命的系统性隐患:

2.3 工业界实践:价值打底 + 向均匀回拉

为了化解上述在效率与稳健之间的尖锐矛盾,当前一线生产环境中几乎清一色地采用了折中的混合方案:首先以可得量或价值量作为底层骨架,明确表述出系统期望「向高价值时段倾斜」的业务诉求;随后,强制引入一个混合系数 λ,将陡峭的曲线生硬但极其必要地向「均匀分布」进行回拉。这一步看似牺牲了部分极致的转化效率,但换来的却是对全天候覆盖广度的坚实保障,以及预估模型对多时段探索样本的持续有效积累。将其写成一步公式便是:

w(τ) = λ · w_value(τ)  +  (1 − λ) · uniform          # λ ∈ [0,1]
       └ 效率核心:积极向高价值时段倾斜 ┘   └ 稳健兜底:死守曝光覆盖与探索样本 ┘

在这套逻辑体系下,系数 λ 设得越小,系统的整体表现就越安全、越接近均匀的平稳跑量消耗;设得越大,则策略打法越激进、越趋向于在高 ROI 高地进行集中变现。通常而言,从一个相对保守的值起步跑通冷启动,随着投放效果的逐渐趋稳再逐步放大 λ,是业务团队能够从容掌控的一条稳妥上线路径。

三、离线构造管线:从历史日志到目标曲线 r(t)

将上述精妙的权重分配理念转化为具体的工程落地实现,便是一条严密运转的离线批处理管线。通常系统会每天(或颗粒度更细地)在凌晨定时触发一次数据跑批,依托海量的历史打点日志,为全平台所有的投放计划精准输出次日生效的目标曲线基座:

时段权重离线构造管线流程图:从左到右六个步骤依次相连——① 聚合历史(近 N 天、按时段 slot 统计请求数/赢率/价值)→ ② 原始加权(w_raw = 请求 × 赢率的 a 次方 × 价值的 b 次方)→ ③ 跨天平滑(EMA、剔除大促/故障/爬虫等异常日)→ ④ 混合回拉(λ 乘 w_raw 加 1 减 λ 乘 uniform)→ ⑤ 地板/天花板(把每格占比 clamp 到 floor 与 cap 之间)→ ⑥ 归一化(除以权重之和得到 r(t),保证 r(T)=1);下方两条旁注说明 a、b、λ、floor、cap 各是什么旋钮,以及这是天级慢更新、冷启动降级为 uniform 权重构造管线:聚合 → 加权 → 平滑 → 回拉 → 限幅 → 归一化。a,b,λ,floor,cap 是把「效率 vs 稳健」拧到合适位置的旋钮。

我们将这条骨干管线逐步拆开,深入探究其底层的流转机制:

  1. 聚合历史(回溯近 N 天):首先按预设的时间分块(slot),对原始请求数、预估赢率、系统成交均价(eCPM)、转化率以及对应的转化价值等核心业务指标进行精准的聚合统计。此处的 slot 粒度常取为 15 分钟或 1 小时;虽然 15 分钟的细粒度能够更加灵敏地贴合底层流量形状的波动,但在单一时间格内极易因为请求样本稀疏而引入剧烈的噪声干扰。正因如此,对于小预算量级的广告计划,工程上往往更适宜采用平滑的小时级粒度。
  2. 原始加权映射:根据公式 w_raw(τ) = req(τ) × winrate(τ)^a × value(τ)^b 计算出各个时段的初始分值。这里的超参数 a 和 b 牢牢把控着系统向「可得量」与「转化价值量」倾斜的激进强度;如果我们直接令 a=b=0,模型便会优雅地退回至最古老的纯流量加权模式。
  3. 跨天平滑降噪:考虑到单日数据的震荡噪声极其庞大,系统必须采用跨天指数移动平均(EMA)或滑动加权平均来进行滤波降噪处理。在这期间,数据管线必须无情地剔除掉那些受到大促活动、系统宕机故障、或是爬虫疯狂刷量影响的异常日历节点,否则一次极端的数据污染就足以彻底摧毁未来十数天内的标准权重模板。
  4. 混合回拉兜底:执行 w = λ·w_raw + (1−λ)·uniform 操作,强制将陡峭的加权曲线向着绝对均线强拉几分,正如前文所剖析的那样,此举是系统为了保底触达范围与模型探索样本而做出的必要妥协。
  5. 设定地板与天花板(限幅):通过强硬的 clamp 裁剪函数,将每一个离散 slot 的最终数值占比严格钳制在预先圈定的 [floor, cap] 极值域内,而后再执行归一化重整。其中,设立 floor 的核心诉求在于防止某个低谷时段的权重被算法直接碾压归零(一旦归零该时段将彻底丧失参竞资格并产生覆盖黑洞);而设立 cap 的核心意图则在于强力遏制曲线因为单时段的超高占比而瞬间重新塌缩回 ASAP。
  6. 归一化处理:最终执行 w(τ) / Σw(τ) 计算,将各个时段的相对分值硬性映射为绝对的百分比分布,随后通过简单的前缀累加即可顺利导出 r(t),这一天然数学机制也完美确保了 r(T)=1(即保障在收盘时刻恰好安全花光预设的那笔预算)。

至此,这条严丝合缝的离线管线便成功地将「哪个时段更值得花」的模糊业务诉求,具象化成了一条受到严密约束、且具备高度工程复现能力的目标执行曲线。我们在其中巧妙地运用参数 a 和 b 来淋漓尽致地表达业务部门的倾斜偏好,用参数 λ、floor 与 cap 死死兜住了系统的可用底线生命线,并在终局通过数学维度的归一化确保了财务消耗动作的丝毫不差。

四、按日型与时区分别建模

在推进整套架构落地的实战过程中,开发团队极易犯下一个致命却又不易察觉的经验主义错误:试图用一条放之四海皆准的平滑曲线模板,去强行覆盖全生命周期里的所有投放日子。然而,真实世界里大盘一天的流量形态到底长什么样,极其强烈地依赖于「今天到底是星期几」这个最基础的客观事实:

工作日与周末时段权重形状对比图:横轴为投放时段 0~24 小时、纵轴为该时段权重占日预算百分比;红线『工作日』呈早晚通勤双峰、起床早(约 8 点早高峰、19 点晚高峰);绿线『周末』起得晚、没有早高峰,白天缓慢抬升成一个从中午到傍晚的宽单峰;图注强调用工作日模板去投周末会把早高峰的预算砸进一个没有早高峰的日子 工作日与周末的流量形状截然不同:工作日早晚通勤双峰,周末起得晚、白天单个宽峰。权重必须按「日型」分别建。

如果有足够的算力余力,技术团队自然可以进一步深化演进,实现「每一天星期几」乃至精确到「周五晚间模式」的逐日精细建模,但这带来的收益往往伴随着极其陡峭的边际递减效应。在现实的商业工程实践中,先把「工作日与周末的双主线 + 节假日高优覆盖」的地基给打牢,往往能实现最高的研发投入产出比。

归根结底,大盘在某一天的宏观形状轮廓,只取决于它落在礼拜几的日历坐标上,以及它的核心受众正在经历着怎样的时区作息变迁。唯有死死坚持按「日型 + 时区」的双轴正交分别建模,我们才能从源头上把那些因为结构性错配导致的庞大预测误差,硬生生压缩至同日型内部微乎其微的细小抖动之中。

五、预测与控制的明确分工:残差归 PID,系统性偏差归权重

必须承认,无论离线跑出的预估 w(τ) 有多么逼近完美,它终究只是对未知未来的一种预测,而残酷的真实流量环境永远会在某种程度上偏离预测结果。面对这种避无可避的偏差,系统架构必须坚守一条死底线原则:绝对不能让在线的 PID 控制器去替离线预测系统犯下的方向性错误擦屁股。 预测模型和控制链路本就属于两条处于截然不同时间尺度下的独立反馈回路,它们必须各司其职、互不僭越:

预测与控制两条回路分工示意图:上方一条主链从左到右为——预测权重 w(τ)(离线、天级)→ 目标曲线 r(t)(归一化累积)→ PID 执行纠偏(出价系数 α、秒级)→ 实际消耗 y(t);从 y(t) 引出两条虚线反馈回路,一条蓝色快回路标注『小残差:秒级实时纠偏』直接回到 PID,一条粉色慢回路标注『系统性偏差』先到下方的『离线重估 w(τ):校正系统性偏差』节点、再『天级回灌重估』回到预测权重 w(τ);底部旁注说明预测负责把曲线画准、控制负责跟住曲线,系统性偏差回灌重估、随机残差交给 PID 两条回路:秒级快回路(残差 → PID 实时纠偏)与天级慢回路(系统性偏差 → 离线重估 w(τ))。分工清楚,pacing 才稳。

评估维度随机残差系统性偏差
核心特征无规律的细微抖动、方向时正时负每天在同一时段内爆出稳定且同号的偏离值
典型场景某分钟赢率骤变一下、今晚高峰比往常略微减弱连续数天在晚 8 点都无法达成阶段性消耗目标
责任归属PID 控制器(秒级快回路核心)重估离线权重 w(τ)(天级慢回路干预)
系统动作毫秒级实时微调 α 以平稳吸收落差将结构性偏差数据回灌至离线管线以修正底层权重

六、伪代码:设计思路落地

为了将上述这套复杂庞杂的设计理念拆解到工程可读的维度,我们可以尝试通过精炼的伪代码进行沙盘演示。这里的核心目的是展示控制链路的宏观推演思路,而非执拗于底层的代码编写细节。有一个最本质的工程事实必须从头贯穿到底:由于权重构造本质上是一个极其庞大且耗时的离线批处理作业(每天定时跑批一次,批量产出次日各个日型的目标设定曲线),所以在高度敏捷的在线出价路径(Bid Path)上,它只能作为只读的静态配置被快速检索,绝不能将这套繁重的重算逻辑塞进高并发实时链路中! 我们不妨分三个模块来推演:离线管线怎么生成 w(τ)、在线服务怎么极速查询 r(t),以及天级的慢回路该如何准确判断何时必须进行重估干预。

6.1 离线构造器:撑起整条管线的骨架

这部分核心逻辑完美映射了我们在第三节探讨过的管线流转图,我们在每一步都清晰地标明了其背后的业务防范与设计意图:

# 离线批处理:为全平台所有广告计划的「每个日型」分别产出一条严密归一化后的基准权重曲线 w(τ)(确保 Σ=1)
# 架构设计意图:把脏活累活和繁重计算统统封印在离线大数据集群中,通过巧妙地扭动 a/b/λ/floor/cap 这几个核心超参旋钮,把「激进效率 ↔ 稳健保守」的业务天平拧到绝佳位置。

FUNCTION build_weights(history, cfg) -> { day_type: w[n_slots] }:
    uniform ← 构建一个每格分配完全相等的均匀权重分布     # 留作后续冷启动兜底方案以及混合回拉的绝对稳定基准线

    FOR EACH day_type IN { 工作日, 周末, 节假日 }:       # 关键铁律:务必按日型分别独立构建,决不允许出现一条基准曲线粗暴通吃所有日期的草率情况
        rows ← 从历史数据集 history 中抽取出所有归属于该 day_type 的全量打点记录

        IF 历史累积有效天数 < 预设的安全校验阈值:        # 冷启动防线防御机制:宁可忍痛保守降级,也决不拿稀疏且充满震荡噪声的脏数据去硬算
            w[day_type] ← 直接拉取同类目的成熟大盘模板 或 果断回退至 uniform 方案
            CONTINUE

        # ── 核心管线六步走 ──
        raw ← FOR EACH slot: req × 赢率^a × ROI^b      # ①② 执行深度聚合与加权操作:用超参 a、b 死死定住往高价值高地倾斜的猛烈基调
                                                       #    业务解析:req 锚定大盘量基座 · 乘上赢率映射为可得量 · 乘上 ROI 映射为变现核心价值(内含 ÷ 成交价格机制)
        raw ← EMA_跨天(raw) 且 强力剔除所有异常作废日    # ③ 执行平滑降噪:像大促、系统宕机故障、爬虫疯狂刷量这类脏数据节点,绝对不许污染后续多日的标准预测模板
        w   ← λ·normalize(raw) + (1−λ)·uniform         # ④ 执行混合向均匀回拉:系数 λ 设得越小底盘越稳健护航,设得越大打法越趋向激进收割
        w   ← clamp 将每格的预估占比强行卡在 [floor, cap]×均匀线 之间  # ⑤ 执行硬限幅:设 floor 是为了防止出现整点全军覆没的盲区空洞、设 cap 则是为了防止单点暴增瞬间塌缩成 ASAP
        w[day_type] ← normalize(w)                     # ⑥ 最终执行全局归一化收尾:确保全天所有 slot 之和严格且不差毫厘地等于 1,保证收盘时精准花完那笔预算

    RETURN w

通过这一层层严密的筛查与过滤,架构设计者在策略层面的取舍权衡,全部具象化落在了这几个可见的旋钮参数上:由 a,b 宏观决断策略往「可得量 /转化价值量」偏离多少,由 λ 拍板最终必须向安全均线回退几分让步,再由 floor/cap 用近乎蛮力的强硬逻辑钳制住覆盖率与预算集中度的最后一道防线。至于如何精准在海量日志中剥离异常数据日,以及如何运用跨天 EMA 模型这类具体的下钻实现细节,从系统设计的宏大思路上来讲,只要始终牢记「历史数据源头一定要做到绝对抗噪且抗突发干扰」这一底线即可。

6.2 在线查询体系:将 w(τ) 无缝转化为此刻运转的 r(t)

相较于离线管线的极度繁重,在线的竞价主链路处理逻辑应该纯粹且极致高效——仅仅负责极速查出「从当天起点截止到当前毫秒,系统累计究竟该花掉总预算的百分之几」,然后将其以极其轻盈的姿态递交给后端的 PID 控制器作为它的神圣目标设定值(setpoint)。在 slot 边界内部的微观跨度上,系统只需顺手做一下极其便宜的线性插值运算,就能轻易避免目标消耗曲线在跨越时间格时出现生硬的断层台阶:

# 架构设计意图:将庞杂的统计聚合与平滑重整复杂度永远留在离线批处理集群中,给极高并发压力的在线主链路只保留一次极其廉价的 O(1) 查表与内存级插值运算。

服务预热阶段(通常在 Bidder 服务进程拉起时同步执行):
    FOR EACH day_type: cum[day_type] ← 基于查出的 w[day_type] 执行前缀和预处理    # 将离散权重无缝升维为累计消耗曲线 r(t),并确保最后一点的 cum[末]=1.0 完美闭合

FUNCTION target_ratio(now) -> r(t) ∈ [0,1]:
    w, cum ← 根据请求中的 now 检索出完全对应的日型配置表         # 时区校准的核心防线就在这里,必须将 now 严格且精准地对齐至这批广告受众所属的真实当地时间
    (k, frac) ← 极速算出当前时间 now 稳稳落在第 k 个时间格 slot 内的 frac 小数偏移处
    RETURN cum[k] + frac × w[k]                                # 在狭小的时间格内进行一次平滑的线性插值运算,直接返回给底层 PID 系统当作不可侵犯的参照设定值

6.3 天级慢回路重估:精准捕获并狙击系统性偏差

我们在第五节所深究的预测与控制的职能分工边界,在这段代码逻辑中迎来了彻底的闭环落地:一切细微的、偶发性质的微小抖动,都被大方地丢给了秒级运作的 PID 去实时消化抹平;唯有那些在连续多天内、长久盘踞在同一个固定时段、且方向呈现高度单边一致性的严重偏离,才配被系统界定为结构性的重大系统性偏差,进而才有资格真正去触发底层权重的昂贵重估流程。

# 架构设计意图:构建起一道坚不可摧的数据防火墙,彻底将「无规律的随机残差」与「结构性的系统性偏差」在物理层面隔离开来——一旦在这里发生误判,系统要么草木皆兵导致过度反应、要么就在错误的方向上积重难返长期跑偏。

FUNCTION need_reestimate(近 N 天累积日志: 目标增量[day][slot], 实际增量[day][slot]) -> [标记需要重算的坏 slot 集合]:
    FOR EACH slot:
        resid ← 该 slot 的实际消耗打点量 − 系统既定目标消耗量                # 精准算出该特定时段在最近连续各天里的具体偏离残差值
        IF |mean(resid)| > 触发容忍高压阈值 AND 且残差同号的天数占比 > 70%:  # 既呈现出庞大偏离度(又大)且长期处于单边发力状态(又稳) → 铁证如山的系统性结构偏差
            立即高亮标记该 slot
    RETURN 所有被重点标记出来的危险 slot 集合

# 后续流转闭环:对于所有确凿命中了系统性偏差的坏 slot → 在下一轮凌晨触发离线 build 管线时,必须强制修正对应时段的观测预估权重,或者深度排查其流量预测数据源头的潜藏异常,
# 决不能放任在线的实时 PID 控制器天天都在这几个固定时段、靠强行拉扯系数上限去「死撑硬顶」—— 这种硬顶的做法不但治标不治本,还会不可避免地诱发整条竞价控制链路发生灾难性的积分饱和。

其实,统揽全局架构,所有关于调优的核心抓手不外乎就这几个硬核旋钮:用 a,b 给业务倾斜方向定调,用 λ 给安全缓冲空间留底,用 floor/cap 钉死系统运转的上下限安全底线,再用 EMA/剔异常 的严密组合拳把一切干扰杂音过滤殆尽。而整个架构设计的基石灵魂,则牢牢维系于三道绝对不可触碰的红线边界:计算归属上坚持离线海量运算与在线极致只读分离、建模维度上坚持按日型与时区独立剖析、以及职责划分上坚守微观残差归属 PID 和系统性偏差归属权重重估的铁律。

七、生产环境下的极限取舍


调优口诀:曲线定生死;细偏归 PID;长偏重估权;按日型拆解;慎防 ASAP;限幅不可少。

掌握了目标曲线的核心构造逻辑后,你便能从容应对预算消耗的大部分坑点。如果想进一步了解这些参数如何在毫秒级竞价场上被执行,请前往姊妹篇深入探索 预算 Pacing:PID 控制与消耗平滑。

延伸阅读

一手资料与背景:

附录:术语表


–views
Share this post on:

Previous Post
程序化广告投放层级与定向配置:模型、继承与缺省语义
Next Post
Bidder 预算 Pacing:PID 控制与消耗平滑