🧑🏼🍳广告算法AUC/PCOC扫盲
type
status
date
slug
summary
tags
category
icon
password
Status
从召回到竞价:解构现代广告算法管线、关键指标与模型校准
第 1 部分:现代广告系统的“链路”架构
要深入理解任何一个算法指标,我们必须首先将其“放回”它所服务的完整工业系统。现代计算广告系统(Computational Advertising)面临一个核心挑战:在极低的延迟(通常低于 100 毫秒)内,从数十亿甚至上万亿的“用户-广告”组合中,为单个用户挑选出 1 到 5 个最合适的广告。
没有任何一个单一模型能够在这种规模和延迟要求下完成任务。因此,整个系统被设计为一个多阶段的“漏斗”架构。这个架构的本质是一个经济学和工程学的权衡:系统通过逐层递减候选集数量,来换取使用更复杂、更精确(也更昂贵)模型的计算时间。
我们可以使用图表来可视化这个架构。
1.1 图 1:外部生态系统架构(实时竞价 RTB)
在深入我们的模型链路之前,我们先看它在真实商业环境中的位置。下图展示了一次实时竞价(Real-Time Bidding, RTB)的外部流程:

1.2 图 2:内部模型链路(我们解构的“链路”)
当一个 DSP(如 C)收到竞价请求(Bid Request)时,它内部会启动一个由多个模型组成的“链路”或“管线”(Pipeline),如下图所示:

这个四阶段漏斗的每一步都有其专门优化的目标和对应的评估指标:
- 召回 (Recall):从百万级的广告库中,快速、廉价地检索出几千个可能相关的广告(例如,基于用户标签、广告类别)。
- 粗排 (Coarse Ranking):使用一个轻量级模型(例如,简化的逻辑回归)将这几千个候选者排序,筛选出几百个。它在速度和准确性之间取一个平衡。
- 精排 (Fine Ranking):这是系统的核心。它使用一个计算昂贵且复杂的模型(例如,像 Wide & Deep 这样的深度神经网络)来高精度地预测这几百个候选广告的 pCTR(预估点击率)。
- 竞价与调控 (Bidding & Pacing):获取精排模型给出的最高 pCTR 分数,并将其转化为一个真实的货币出价(Bid)。
这个多阶段架构并非仅仅是技术选择,它更是一种经济上的必然。DSP 平台每天要处理数千亿次的竞价请求,在 100 毫秒内,为每次请求都用大型深度学习模型 去评估数百万个广告在计算上是不可行且成本高昂的。因此,系统必须使用“廉价”的召回和粗排模型来过滤掉 99.9% 的选项,以便让昂贵的精排模型可以“专注”于评估那 0.1% 最有希望的候选者。
第 2 部分:第 1 & 2 环:召回(Recall)与粗排(Coarse Ranking)
在精排模型开始工作前,我们必须确保“好”广告已经在这个候选池里了。
2.1 召回环:衡量“广度”
- 目标:确保那些用户真正会点击的广告,被包含在召回环返回的 K 个(例如 10,000 个)候选集中。
- 关键指标:Recall@K (或 Hit Rate@K)
- 定义:“在我们的测试集中,所有观测到的正样本(例如,真实发生的点击)中,有多少百分比被我们的召回模型成功‘捕获’并放入了 Top-K 的候选集中?”。
- 商业影响:一个低的 Recall@K 意味着,即便你拥有一个 AUC=1.0 的完美精排模型,它也毫无价值。因为那个“正确答案”的广告,在第一步召回时就已经被系统“错误地”丢弃了。
2.2 粗排环:衡量“效率”
- 目标:快速地将 K=10,000 的候选集缩减到 N=100 左右,交给精排模型。这个模型必须非常快,同时排序能力也要足够好。
- 问题:在此处使用标准的 AUC 指标具有严重的误导性。标准 AUC 会把所有用户的样本“混在一起”进行比较。
- 举例:
- 用户 A(高点击率用户)点击了 pCTR 为 0.6 和 0.7 的广告。
- 用户 B(低点击率用户)没有点击 pCTR 为 0.1 和 0.2 的广告。
- 一个好的模型预测:用户 A (点击): 0.15;用户 B (未点击): 0.20。
- 在这个例子中,模型对 A 和 B 各自的排序都是完美的。但标准 AUC 会认为这是一个排序错误,因为它错误地将 A 的正样本 (0.15) 排在了 B 的负样本 (0.20) 之后。
- 标准 AUC 惩罚了模型,因为它没有把高点击率用户的正样本排在低点击率用户的负样本之前,而这在个性化推荐中是毫无意义的。
- 关键指标:GAUC (Group AUC)
- 定义:GAUC 通过先为每个用户单独计算 AUC,然后再进行加权平均(通常按展示量或点击量加权),完美地解决了这个问题。
- 公式:

- GAUC 衡量的是模型在用户内的个性化排序能力,这比标准 AUC 更能反映粗排模型的真实性能。
召回和粗排的目标是相互冲突的。为了实现极高的 Recall@K(广度),召回系统必须非常“宽松”,这会带入大量低质量的“噪音”候选。这反过来给粗排模型施加了巨大压力,它必须在“干草堆”(噪音)中高效地找到“针”(好广告)。
第 3 部分:第 3 环:精排(Fine Ranking)与核心指标
这是广告系统的“引擎室”,也是目前(用户)问题分析的核心。我们从目前已有的分析开始,并进行深化。
3.1 指标一:AUC (Area Under the Curve)——模型的“排序能力”
- 全称:Area Under the Receiver Operating Characteristic Curve (ROC 曲线下面积)。
- 它代表什么能力:排序能力 (Ranking Ability)。
- 回答的问题:“从所有‘会点击的广告’(正样本)和‘不会点击的广告’(负样本)中,我随便各抽一个,我的模型有多大把握能把‘会点击的’那个排在‘不会点击的’前面?”。
- 如何解读:
- AUC = 1.0:完美模型。它给所有正样本的分数都高于所有负样本。
- AUC = 0.5:模型无效(等于瞎猜)。
- AUC > 0.5:模型有效。数值越高,排序能力越强。
- AUC < 0.5:模型反了(通常是标签搞反了)。
- 在广告中的应用:在广告精排(Ranking)阶段,系统的核心任务就是排序。因此,AUC 是评估 Ranking 模型最重要的离线指标。
- 关键点:AUC 只关心排序,不关心 pCTR 预估的绝对值。
- 模型 A 预估点击 (0.8) vs 不点击 (0.4)
- 模型 B 预估点击 (0.008) vs 不点击 (0.004)
- 只要能排对,这两个模型的 AUC 是一样的。
专家补充:AUC 对“单调变换”免疫
目前观察到的关键点是理解 AUC 和 PCOC 分离的钥匙。技术上,AUC 对于任何“单调递增变换”(monotonically increasing function)都是不变的。
这意味着,如果模型 A 的输出是 p,而模型 B 的输出是 0.5 \times p(即目前提到的“打分平均较低”),甚至是 \log(p),只要能保持排序不变,它们的 AUC 将完全相同。
这证明了:AUC 是一个*序数(ordinal)*指标,它只关心“谁大谁小”,而完全不关心“大多少”或“绝对值是多少”。
3.2 指标二:PCOC (Predicted Clicks / Observed Clicks)——模型的“校准能力”
- 全称:Predicted Clicks Over Observed Clicks (预估点击 / 真实观测点击)。
- 它代表什么能力:校准能力 (Calibration Ability)。
- 回答的问题:“在一段时间内,我的模型预估的‘总点击率’(或总点击量),和线上真实发生的‘总点击率’(或总点击量)偏差有多大?”
- 如何计算:
它最简单的形式就是:

- 如何解读:
- PCOC = 1.0:完美校准。
- PCOC > 1.0:模型整体高估(Over-confident)。
- PCOC < 1.0:模型整体低估(Under-confident / Conservative)。这就是目前遇到的“新模型打分平均较低”的情况。
- 在广告中的应用:PCOC 对竞价 (Bidding) 和预算控制 (Pacing) 至关重要。
专家补充:PCOC 的局限性
PCOC 是一个全局(Global)校准指标。它只保证平均值是准确的,但这可能掩盖了局部的严重错误。
例如,一个模型可能在低 pCTR 区间系统性低估 50%(预测 0.05% vs 真实 0.1%),但在高 pCTR 区间系统性高估 50%(预测 3% vs 真实 2%)。这两处的错误可能在全局平均值上相互抵消,得到一个 PCOC=1.0 的“假象”。
因此,专业的评估不能只看 PCOC,还必须查看“校准曲线”(Calibration Plot 或 Reliability Diagram),它将预测概率按区间(bucket)划分,绘制“区间内的平均预测值” vs “区间内的真实发生率”。
3.3 总结对比:AUC vs PCOC
指标 | 衡量的能力 | 回答的问题 | 在广告中的应用 |
AUC | 排序能力 (Ranking) | “好”的是否排在“坏”的前面? | 精排 (Ranking) 模型的离线评估。 |
PCOC | 校准能力 (Calibration) | 预估的“概率”和“真实”的概率一致吗? | 竞价 (Bidding)、预算控制、线上预估偏差的监控。 |
发现:高 AUC 与 低 PCOC
目前发现“新模型 AUC 变高,但 PCOC 变低(打分平均较低)”这一现象,不是一个 bug,而是一个典型的、可预期的结果。
- 这说明新模型是一个排序能力更强(高 AUC),但校准更差(低 PCOC)的模型。
- 这在现代深度学习模型中非常常见。研究表明,深度神经网络(DNNs)虽然具有极高的分类准确率和 AUC,但其内部机制(如 ReLU、Batch Norm)往往导致它们输出的“概率”是未经校准的,即它们对自己的预测过于自信(或不自信)。
- AUC 和 PCOC 衡量的是两个*正交(orthogonal)*的、相互独立的能力。任务不是“二选一”,而是先用 AUC 选出最强排序模型,然后通过“模型校准”来修复它的 PCOC。
第 4 部分:第 4 环:竞价(Bidding)——为什么校准(PCOC)至关重要?
如果新模型的 AUC(排序)更高,为什么我们要关心 PCOC(校准)呢?为什么不能直接上线这个“打分较低”的模型?
答案是:因为 PCOC 直接决定了你的出价,而出价决定了你的生死。
4.1 广告竞价的“圣三一”:pCTR, CPC, eCPM
在广告平台(如 Google, Meta)广泛使用的广义第二价格(Generalized Second-Price, GSP)拍卖中,广告的排序和计费,不只看 pCTR,而是看一个叫 eCPM (effective Cost Per Mille,有效千次展示成本) 的值。
eCPM 的计算公式是平台盈利和广告主 ROI 的核心:

- pCTR:由我们的精排模型预估。
- Bid(cpc):由广告主设定,表示他们愿意为一次点击支付的最高价格。
平台使用 eCPM 来对广告进行排序。eCPM 越高,赢得竞价的机会越大。
4.2 场景分析:PCOC 偏差的商业代价
现在,我们来分析“低 PCOC”模型和“高 PCOC”模型在真实竞价中会发生什么。
场景 1:PCOC < 1.0 (模型低估/“保守”) —— 现状
- 情况:新模型很“保守”。一个广告的真实点击率(Real CTR)是 1.0%,但模型预估 pCTR=0.8%。
- 竞价:广告主愿意出价 Bid(cpc) = 1.00。
- 该广告的真实价值 eCPM = 1.0% *1.00 = 10.00。
- 出价 eCPM = 0.8% * 1.00 = 8.00。
- 商业后果:
- 拿不到量 (Loss of Volume)。
- 系统出价 8.00。如果竞争对手(一个模型校准良好的 DSP)出价 8.50,你将输掉这次竞价。
- 你失去了一次本可以盈利(价值 10.00,成本低于 10.00)的展示机会。
- 广告主的预算花不出去,拿不到点击,他们会认为你的平台“没有流量”而离开。
场景 2:PCOC > 1.0 (模型高估/“激进”)
- 情况:模型很“激进”。真实 CTR 是 1.0%,但模型预估 pCTR=1.2\%。
- 竞价:广告主出价 Bid(cpc) = 1.00。
- 该广告的真实价值 eCPM = 1.0% *1.00 = 10.00。
- 出价 eCPM = 1.2% *1.00 = 12.00。
- 商业后果:
- 成本超支 (Over-spending)。
- 你系统性地出价过高。你会赢得大量竞价,但你是在用 12.00 的出价去竞争一个只值 10.00 的流量。
- 在 GSP 拍卖中,这会导致你的计费(支付给第二名的价格)也系统性偏高。
- 广告主的 eCPC(effective Cost Per Click,实际每次点击成本)会飙升,超出他们的预期,导致 ROI 为负。
- 广告主会迅速“烧完”预算,发现亏损严重,然后暂停在目前平台上的所有广告。
结论
广告平台同时服务于两个客户:用户和广告主。
- AUC 优化的是用户体验:它确保用户看到最相关的广告(排序)。
- PCOC 优化的是广告主 ROI:它确保平台为广告主的点击支付了“正确”的价格(校准)。
Google 的研究 强调,pCTR 预估必须为下游的广告拍卖进行校准。这是一个商业上的硬性要求。高 AUC 和 PCOC=1.0,两者缺一不可。
第 5 部分:诊断——为什么我的模型会“高 AUC,低 PCOC”?
这个现象非常普遍。其根源并非模型“训坏了”,而是现代深度学习和数据处理技术的一种“副作用”。
5.1 原因一:DNNs 不是逻辑回归
- 一个简单的逻辑回归(Logistic Regression)模型,如果使用对数损失(Log-loss)进行训练,其输出在数学上天然就是校准良好的概率。
- 但现代的精排模型(如 DNNs)远比这复杂。它们使用 Log-loss (即交叉熵) 作为损失函数,但它们的目标是最大化地区分正负样本(即优化 AUC),而不是精确估计概率。
- DNNs 的巨大容量、ReLU 激活函数、Batch Normalization 等技术,使得模型为了最小化 Log-loss,会倾向于将输出分数(logits)推向极端,导致模型变得“过度自信”(分数接近 0 或 1),从而破坏了校准性。
5.2 原因二:“吸烟的枪”——类别不平衡处理
这是导致目前“PCOC < 1.0”问题的最可能的直接原因。
- 问题:广告 pCTR 数据是极度不平衡的。真实点击率可能只有 1%,甚至 0.1%(正负样本比例 1:100 或 1:1000)。
- 常规解法:为了让模型“看到”稀有的正样本,算法工程师通常会采用两种手段之一:
- 负样本降采样 (Down-sampling):丢弃 90% 的负样本(未点击),将数据从 1:1000 变为 1:100。
- 正样本加权 (Re-weighting):在损失函数中,给正样本(点击)一个非常高的权重(例如 pos\_weight=100)。
- 后果:这些操作在设计上就“故意”破坏了模型的校准性。
- 多项研究证实,用于处理类别不平衡的采样和加权方法,会对模型的概率输出分布产生剧烈扭曲,导致校准失效。
- Google 的一篇博客 明确指出,基于类别的重加权“改变了预测概率的分布,导致了未校准的预测”。
- 逻辑链条(为什么 PCOC < 1.0):
- 假设真实世界的 CTR 是 1%(比例 1:100)。
- 目前为了训练,对负样本进行了 10:1 的降采样。训练集现在的 CTR 是“假的” 10%(比例 1:10)。
- 模型(高 AUC)非常出色地学习了这个假数据的分布。它被训练得认为“平均点击率在 10% 左右”。
- 当目前将这个模型部署到线上,面对真实世界的数据(平均 1% CTR)时,模型会输出一个基于“假分布”的概率,这个概率的平均值(例如 8%)会远远低于它在训练时学到的 10% 均值,但又远远高于真实世界的 1% 均值。
- 这就导致了 AVG(pCTR) > AVG(Real CTR),即 PCOC > 1.0(高估)。
- 反之,如果目前使用的方法(例如特定的加权或损失函数)导致模型在真实世界的预测值系统性偏低,就会出现情况:PCOC < 1.0。
- 无论哪种情况,模型的高 AUC 都被保留了,因为它在扭曲的数据集上学会了如何排序,而排序能力(序数)通常在采样和加权后得以保持。
第 6 部分:处方——pCTR 模型校准实用指南
任务很明确:目前已经有了一个“排序很好”(高 AUC)的模型。现在,目前需要添加一个“校准层”,将其“打分较低”(低 PCOC)的输出“拉回”到真实水平,使其 PCOC=1.0,同时不损害它已经很高的 AUC。
这个过程称为事后校准 (Post-Hoc Calibration)。
- 流程:
- 训练目前最好的精排模型(在训练集上优化 AUC/GAUC)。
- 冻结 (Freeze) 该模型的所有参数。
- 保留一个独立的、未采样的、分布真实的“校准集”(Calibration Set)。
- 在校准集上,训练一个简单的“校准模型”。这个模型学习一个函数 f,输入是精排模型的原始输出 p_{model},输出是校准后的概率 p_{calibrated}。
- 关键:f 必须是单调递增的。这样它才能在“拉伸”或“压缩”概率尺度的同时,保证不改变原有的排序,从而保持 AUC 不变。

以下是三种最常用的校准方法:
6.1 方法一:Platt Scaling (参数化方法)
- 原理:也称为 Sigmoid 缩放。它假设模型的未校准输出(logits)和真实概率之间的关系可以用一个简单的 Sigmoid 函数来拟合。
- 公式:它只需要在校准集上学习 A 和 B 两个参数。

- 优点:
- 非常简单、快速,需要的数据量很少。
- 在校准数据有限时,它很稳健(Robust),不易过拟合。
- 缺点:
- 假设太强。它强行认为失真一定是 Sigmoid 形状的。
- 如果模型失真很复杂(例如,由 DNN 和重加权共同导致),Platt Scaling 的拟合能力将远远不足,校准效果很差。
6.2 方法二:Isotonic Regression (非参数化方法)
- 原理:一种更强大、非参数化的方法。它不假设任何函数形式,而是拟合一个“分段常数”的“阶梯”函数,同时保证该函数是单调递增的。
- 优点:
- 非常灵活。理论上,它可以拟合任何形状的单调失真,无论多复杂。
- 在 的案例中,Platt Scaling 失败了,但 Isotonic Regression 成功地拟合了复杂的校准曲线。
- 缺点:
- 极易过拟合。因为它太灵活了,如果校准集不够海量,它会为数据中的每一个“抖动”都拟合一个“阶梯”,导致过拟合。
- 在 pCTR 预测中,高 pCTR 区间的数据非常稀疏,Isotonic 几乎肯定会在这些区域过拟合。
6.3 方法三:I-Splines (样条校准,现代方法)
- 原理:这是 Platt 和 Isotonic 之间的一种现代折衷方案。它使用“样条函数”(Splines)来拟合一个平滑的、分段多项式的单调函数。
- 优点:
- 两全其美。它像 Isotonic 一样灵活(可以拟合复杂形状),又像 Platt 一样平滑和稳健(不易过拟合)。
- Google 在其论文中特别提到了 I-Splines (Integral Splines) 作为一种高性能、灵活的校准函数。
- 研究 表明,I-Spline 平滑方法在校准效果上显著优于 Platt 和 Isotonic(提升 1.4 倍到 1.6 倍)。
- 缺点:
- 实现比 Platt 稍复杂,且仍需要中等到大量的数据来获得稳定拟合。
6.4 校准方法对比与选择
方法 | Platt Scaling (Sigmoid) | Isotonic Regression | I-Splines (样条校准) |
原理 | 参数化 (拟合 Sigmoid) | 非参数化 (分段常数/阶梯) | 非参数化 (分段多项式/平滑) |
假设 | 强 (失真是 Sigmoid 形状) | 弱 (失真是单调的) | 弱 (失真是平滑且单调的) |
灵活性 | 低 | 非常高 | 高 |
数据需求 | 低 (在小数据集上很稳健) | 非常高 (需要海量数据) | 中等到高 |
过拟合风险 | 低 | 非常高 | 中 (可通过平滑度控制) |
推荐场景 | 校准数据非常少;或已知失真很简单。 | 校准数据非常海量,且失真复杂。 | 推荐:DNN 模型,失真复杂,需要平衡灵活性和稳健性。 |
对于目前(高 AUC 的 DNN + 可能的重加权)的情况,失真曲线大概率是复杂的、非 Sigmoid 的。因此,Platt Scaling 可能效果不佳。应该优先尝试 I-Splines 或 Isotonic Regression,前提是必须准备一个足够大且分布真实的校准数据集。
第 7 部分:进阶:警惕“样本选择偏差 (SSB)”的反馈闭环
最后,我们讨论一个广告系统中更深层次的“幽灵”:样本选择偏差(Sample Selection Bias, SSB)。
7.1 什么是广告系统中的 SSB?
SSB 指的是,我们用来训练模型的数据,并不是来自“真实世界”的随机样本,而是被我们自己(或历史系统)“选择”过的。 中提到的“幸存者偏差”就是 SSB 的一种。
7.2 致命的反馈闭环
在广告系统中,SSB 形成了一个有毒的反馈闭环(Feedback Loop):
- V1 模型:你训练了 V1 模型,它(可能由于巧合)认为“蓝色广告”的 pCTR 高于“红色广告”。
- V1 上线:你将 V1 部署到线上。在竞价中,它不断地为“蓝色广告”出高价,赢得展示机会。它很少选择“红色广告”。
- 数据收集:你收集了接下来一周的数据来训练 V2 模型。这些数据几乎完全由“蓝色广告”的展示和点击日志组成。你几乎没有“红色广告”的新数据。
- V2 模型:V2 模型在这些新数据上训练。它学到了:“蓝色广告”确实能带来点击(因为只有它们被展示了),而“红色广告”没有任何数据,所以它们的 pCTR 肯定很低。
- 循环:V2 模型强化了 V1 的偏见。系统将永远不会发现,也许“红色广告”在这一周里突然变得非常受欢迎。模型被自己的历史决策“困住”了。
一篇针对 pCTR 拍卖系统的研究 直接指出,拍卖机制(只展示 Top-1 广告)本身就引入了严重的 SSB 问题。
7.3 SSB 的后果与解决方案
- 后果:SSB 不仅让模型“视野狭隘”,它也是导致模型校准出错的根源之一。模型在“有偏”的数据集上训练,它对“蓝色广告”的 pCTR 估计会变得越来越过度自信(Over-confident),因为它从未见过反例。
- 解决方案:
- 探索 (Exploration):强制系统将一小部分流量(例如 5%)分配给“非最优”或“随机”的广告,以确保能持续收集关于“红色广告”的数据。
- 数据纠偏 (Reweighting):使用“逆倾向得分”(Inverse Propensity Scoring, IPS)等技术。如果我们知道“蓝色广告”被 V1 模型选中的概率是 90%,而“红色广告”是 5%。那么在训练 V2 时:
- “蓝色广告”样本权重 = 1 / 0.90
- “红色广告”样本权重 = 1 / 0.05
- 通过这种方式,我们“放大”了那些“罕见且令人惊讶”的事件,从而在数学上修正了 SSB。
SSB 导致的数据扭曲,与第 5 部分中“类别不平衡”导致的数据扭曲,在本质上是相同的。它们都会破坏 PCOC。一个完整的解决方案,既要通过 IPS 等手段在上游(数据)解决 SSB,也需要通过校准(如 I-Splines)在下游(模型)修正其对 pCTR 绝对值的扭曲。
第 8 部分:结论——连接完整的链路
我们从一个完整的广告链路出发,深入探讨了目前遇到的“高 AUC,低 PCOC”问题:
- 链路认知:广告系统是一个多阶段漏斗(召回→粗排→精排→竞价)。
- 指标拆解:我们必须为不同阶段选择正确的指标。Recall@K 保证“广度”;GAUC 保证“个性化排序”;AUC 保证“精排排序”;PCOC 保证“出价准确”。
- 问题定性:高 AUC + 低 PCOC 不是失败,而是完成了一半的胜利。目前已经成功构建了一个强大的排序引擎(高 AUC)。
- 商业分析:PCOC 的失准(无论高低)都会直接导致经济损失:PCOC < 1.0 导致“拿不到量”;PCOC > 1.0 导致“成本超支”。
- 原因诊断:此问题是 DNN 复杂性和(更重要的)类别不平衡处理(如降采样、加权)的直接“副作用”。
- 解决之道:在不改变高 AUC 模型的前提下,使用事后校准(推荐 I-Splines 或 Isotonic Regression)在“真实的”校准集上重新“拉伸”概率输出,使 PCOC \rightarrow 1.0。
在计算广告中,AUC 是相关性,PCOC 是盈利性。一个同时服务于用户(需要相关性)和广告主(需要盈利性)的平台,两者都必须精确。模型在能够正确排序(高 AUC)之后,还必须能准确知道自己预测的真实价值(PCOC=1.0),这时,它才是一个真正“完成”的广告模型。
