🏠 总目录📚 本教程 15b · 广告:从推荐到竞价
📑 本页目录(点开跳转)

15b · 广告:从推荐到竞价

51 分钟 | ⭐ 推荐岗和广告岗的分水岭


🎯 一句话

推荐系统按「用户会不会喜欢」排序,广告系统按「这次曝光值多少钱」排序。

技术栈几乎完全一样 —— 召回、粗排、精排、重排一个不少,前面 15 章你学的全都用得上。 但广告多了一个出钱的人,于是多出一整套推荐系统根本不需要的东西:怎么定价、怎么防止广告主骗你、怎么把钱均匀花完。


🧭 一、哪些是一样的,哪些不一样

先把心理预期摆正:你不需要重学一遍推荐。

推荐 广告
召回 / 粗排 / 精排 完全一样
向量检索、双塔、序列建模 完全一样
CTR 预估模型 完全一样(DIN/MMoE 那一套照搬)
排序依据 预估的用户满意度 预估收入(eCPM)
有没有拍卖层 有,而且是核心
谁付钱 没人直接付 广告主
优化目标 用户长期留存 三方之间分配利益
评估 AB 实验 ⚠️ AB 实验基本假设会被破坏(见第六节)
同一条链路,广告在末端多插了一层 推荐 召回 粗排 精排 按满意度排序 展示 广告 召回 粗排 精排 拍卖与计价 这一章讲的全部 展示 广告主出价 前三步的模型、特征、工程,两边可以是同一套代码 差别全在那个深色方块里:它决定谁被展示、以及谁付多少钱
推荐是双边(用户、平台),广告是三边 —— 多出来的第三方是出钱的那个,拍卖层就是为他存在的

一句话记住推荐优化的是「用户喜欢什么」,广告优化的是「在不把用户赶跑的前提下,这次曝光最多能卖多少钱」。 前者是单目标,后者是三方之间的分配问题 —— 这就是为什么广告需要机制设计,而推荐不需要。


💰 二、eCPM:广告排序的那把统一尺子

先看一个具体问题。三个广告主来抢同一个位置:

谁该排前面? 三个人报的价单位都不一样,没法直接比。

于是需要一把统一的尺子 —— eCPM(effective Cost Per Mille,千次曝光的期望收入)

💡 eCPM = 这条广告如果被展示一千次,平台期望能收到多少钱。 千次是行业惯例(因为单次曝光的收入太小,写出来一堆零)。

换算规则:

计费方式 广告主承诺 eCPM 怎么算 谁承担预估风险
CPM 每千次曝光付 X eCPM = X 广告主(曝光了就付钱)
CPC 每次点击付 X eCPM = X × pCTR × 1000 平台(预估点击率不准就亏)
CPA / oCPC 每个转化付 X eCPM = X × pCTR × pCVR × 1000 ⭐⭐ 平台(两个预估都可能错)

把上面三家代进去(假设 pCTR = 2%,pCVR = 5%):

广告主 出价 eCPM 排名
A(CPC 2 元) 2 2 × 0.02 × 1000 = 40 🥇
C(CPA 50 元) 50 50 × 0.02 × 0.05 × 1000 = 50 ⭐ 其实是 C 第一
B(CPM 30 元) 30 30 🥉

重算一下:C(50)> A(40)> B(30)

⭐⭐ 这张表里藏着广告和推荐最本质的差别: 从上往下,平台承担的预估风险越来越大。 CPM 下平台稳赚;CPC 下如果 pCTR 估高了,实际点击少,平台就收不到钱; CPA 下还要再赌一次转化。

换句话说:CTR 预估的误差,在推荐里是「用户体验损失」,在广告里直接是钱。

⚠️ 一个极易被忽略的前提:eCPM 公式里的 pCTR 必须是校准过的概率,不能只是一个「排得对就行」的分数。 推荐里模型输出 0.9 还是 0.09 无所谓,只要相对顺序对; 但广告里这个数要乘进钱里,估高 10% 就意味着排序和计费都偏了 10%。

🔗 第 12 章 · 评估与 AB 实验只在指标表里把 LogLoss 标成「需要概率校准时(如广告计费)」, ⚠️ 而且把 AUC / GAUC / LogLoss 一起归进了「衡量预测点击概率准不准」——这个归类反而容易让人以为 AUC 也管概率为什么不管、以及不校准会怎样,本章第七节补上:第七节那个事故就是这么来的。


⚖️ 三、拍卖:为什么不能「谁出价高谁付谁的价」

排好序了,接下来是这一章真正的主题:赢家该付多少钱?

最直觉的答案是「他出多少付多少」。这叫一价拍卖(GFP,Generalized First Price), 而它在真实世界里崩过一次

一价拍卖为什么崩

假设你出 10 元赢了,事后发现第二名只出了 3 元。你会怎么想?

   你:早知道我出 3.1 就够了,白花 6.9 元
   → 明天改出 3.1

   第二名:他降到 3.1 了,我出 3.2 就能赢
   → 改出 3.2

   你:那我出 3.3……
   → 两个人一路加到 10 元附近,然后有人受不了,"啪"地降回 3 元
   → 循环重新开始

结果是出价剧烈震荡、永不收敛,广告主必须雇人(或写机器人)盯着盘面天天调价。 这不是理论推演 —— 早期的 Overture(GoTo.com)用的就是一价, 广告主的出价在锯齿状波动里反复横跳。Google 在 2002 年换掉了它。

GSP:广义第二价格

换成的方案是 GSP(Generalized Second Price)

赢家不付自己的出价,付「刚好还能赢过下一名」所需的最低价格。

公式(CPC 计费下):

   第 i 名实际每次点击付费
   = (第 i+1 名的 eCPM) / (第 i 名的 pCTR) / 1000  +  0.01
                            ↑
              除以自己的 pCTR,把 eCPM 换回「每次点击」

举个能算的例子。三个广告主竞争一个位置:

排名 广告主 出价(CPC) pCTR eCPM ⭐ 实际付费
1 10 元 2% 200 120 / 0.02 / 1000 = 6.006.01 元
2 4 元 3% 120 100 / 0.03 / 1000 = 3.333.34 元
3 10 元 1% 100

读三遍这张表,有两件事值得注意:

  1. 甲出价 10 元,实际只付 6.01 元。 他不需要去试探 —— 系统已经保证他不会多付。 于是出价震荡消失了,广告主可以安心报一个真实的心理价位。
  2. 丙和甲出价一样是 10 元,却排在最后。 因为他的 pCTR 只有甲的一半。 这就是「质量」进入定价的地方 —— 出价高但没人点的广告,平台不欢迎,用户也不欢迎。

💡 为什么 GSP 让广告主愿意说真话(大致上): 你多报一点不会让你多付(付的是下一名的价),少报一点可能让你输掉位置。 所以「报你心里真实的价值」是接近最优的策略 —— 系统因此稳定下来。

⚠️ 但 GSP 严格来说不是激励相容的

这一点面试很爱问,而且很多人答错

所以准确的说法是:GSP 是「二价思想」在多位置上的推广,但推广的过程中丢掉了激励相容性。

VCG:理论上的正解

真正在多位置下保持激励相容的方案叫 VCG(Vickrey–Clarke–Groves)

你付的钱 = 因为你的存在,其他所有参与者少赚了多少。

也就是「你给别人造成的外部性」。这个定价规则可以证明:说真话是每个人的最优策略,无论别人怎么出价。

那为什么工业界大多数还在用 GSP?

原因 说明
广告主看不懂 GSP 的账单能一句话解释清楚(「你付了刚好赢过下一名的价」);VCG 的账单是一个需要模拟「你不存在时会怎样」的反事实计算,销售没法向客户解释
切换期收入下降 从 GSP 换到 VCG,理论上广告主应该上调出价到真实价值。但他们不会立刻这么做 —— 于是平台在过渡期实打实地少赚钱
历史惯性 广告主的投放系统、代理商的优化策略都是围绕 GSP 建的

一句话总结这一节GSP 赢在可解释,VCG 赢在理论。工业界选了可解释。 Google 搜索广告长期用 GSP;Facebook 用 VCG;很多信息流平台用的是「带各种修正项的 GSP 变体」。


🎯 四、oCPC:把优化目标交给平台

广告主真正想要的从来不是点击,是转化 —— 下载、注册、下单。

但这里有个信息不对称:只有平台有足够的数据估准 pCVR(转化率)。 广告主自己只能看到「我花了多少钱、拿到多少转化」,看不到每一次曝光背后的概率。

oCPC(optimized CPC) 就是为这个设计的:

   广告主说:  一个转化我愿意付 50 元
        ↓
   平台每次竞价时自己算:
        这次曝光的 pCTR = 2%,pCVR = 5%
        → 期望转化数 = 0.02 × 0.05 = 0.001
        → 这次曝光值 50 × 0.001 = 0.05 元
        → 换算成 CPC 出价 = 0.05 / 0.02 = 2.5 元,拿去参竞

广告主只需要报一个「转化出价」,具体每一次该出多少,平台替他决定

通常分两阶段

阶段 在干什么 广告主的体感
第一阶段(冷启动) 转化数据太少,pCVR 估不准,先按 CPC 正常跑,积累样本 成本波动大,需要耐心
第二阶段(智能出价) 转化样本够了(常见门槛是累计 20~50 个转化),切换到自动出价 成本逐渐贴近目标价

赔付机制:很多平台会承诺「实际转化成本不超过目标价的 (1 + x%),超出部分平台赔」。 这是让广告主敢把方向盘交出去的关键 —— 否则没人愿意让平台替自己出价。

⚠️ oCPC 最大的争议平台既是运动员又是裁判。 pCVR 是平台估的,计费也是平台算的,广告主无法独立验证。 这是广告生态里长期的信任问题,也是为什么大广告主会自建归因、和平台的数据对账。


🚰 五、预算平滑:为什么不能早上把钱花光

广告主设了日预算 1 万元。如果系统「有钱就花」,会发生什么?

   09:00  早高峰流量涌入,你的广告每次都参竞、每次都赢
   11:30  1 万元花完,广告下线
   11:30 之后  你的广告整天都不再出现

两边都受伤

所以需要预算平滑(Pacing):让预算在一天里均匀地花出去。

两类主流做法:

做法 怎么做 特点
概率节流 以概率 p 决定「这次要不要参与竞价」,花快了就调小 p 简单,不扭曲出价,但会随机丢掉一些好机会
出价调节 参竞时把出价乘一个系数 α,花快了调小 α 保留了「好机会多出点钱」的能力,主流做法

控制逻辑本质上是一个反馈控制器(常用 PID):

   目标:  已花预算 / 总预算   ≈   已过时间 / 总时间

   花太快 → 调低 α(或 p)→ 少赢一些 → 慢下来
   花太慢 → 调高 α(或 p)→ 多赢一些 → 追上去

⚠️ 别和推荐的「打散 / 多样性」搞混 —— 面试里这两个经常被混为一谈。 第 11 章 · 重排与多样性的打散是为了用户体验(别让同一类内容刷屏); 预算平滑是为了预算分配(别让钱在一个时段花光)。 一个服务用户,一个服务广告主,控制的对象和目标函数都不一样。


🛑 读到这里可以停 —— 机制那半章讲完了(约 23 分钟)。 你现在能回答广告系统的四个核心机制问题:怎么排序(eCPM)、赢家付多少(GSP / VCG)、 出价交给谁(oCPC)、钱怎么均匀花完(预算平滑)。 后半章换个话题(约 28 分钟):广告的 AB 实验为什么会骗你(网络干扰)· 一个 AUC 涨了 0.31pp 却让日收入 -8% 的事故。 回来的时候不用重读,直接从下一节接着看就行。


📊 六、评估:广告的 AB 实验有个推荐没有的坑

指标不再是一个方向

推荐的 AB 实验,指标基本同向:点击率涨、时长涨、留存涨,都是好事。

广告不是:

指标 方向
收入 / eCPM / 填充率 平台想要它涨
⚠️ 广告负载(ad load) 涨了钱多,但用户体验降、长期留存降
广告主 ROI 广告主想要它涨,它和平台短期收入是矛盾的

所以广告的实验结论几乎从来不是「涨了就上」,而是一组 trade-off。

⭐⭐ 真正的坑:网络干扰(interference)

这是广告实验和推荐实验最本质的区别,也是最容易翻车的地方。

   推荐的 AB:
     实验组换个模型 → 给实验组用户推的东西变了
     → 对照组完全不受影响 ✅ 两组独立

   广告的 AB:
     实验组的广告主更容易赢得曝光
     → 他们花的预算变多 / 库存被他们拿走
     → ⚠️ 对照组的广告主能赢的就变少了
     → 两组【不独立】,AB 实验的基本假设被破坏 💀

典型症状:实验组指标涨得很漂亮,全量上线后涨幅消失,甚至变负 —— 因为实验期间那部分「涨幅」是从对照组身上抢来的,全量之后没有对照组可抢了。

几种缓解手段:

手段 思路 代价
预算分流 把广告主的预算也按比例切开,两组各自独立结算 实现复杂,小预算广告主切不动
双边实验 同时在用户侧和广告主侧分流 样本量需求大幅上升
时间片轮转 全量交替跑 A 和 B,比较时间段 受时段效应影响,需要更长周期

🔗 广告负载对留存的影响是慢变量,几天的 AB 根本看不出来。 这正是《模型上线之后》15 · 长期效应与代理指标讲的那类问题 —— 那一章给了「短期指标涨、长期指标跌」该怎么办的系统方法。


💀 七、一个事故:AUC 涨了 0.3 个点,日收入掉了 8%

发生了什么

某信息流广告的 CTR 模型换版上线。离线评估:AUC 从 0.7312 涨到 0.7343(+0.31pp), 所有排序指标都变好,灰度 3 天线上 CTR 也小幅上涨,于是全量。

一周后,几个大客户几乎同时投诉:「我的 CPC 变贵了,ROI 从 2.1 掉到 1.6」,随后集中撤量。 日收入 -8%

为什么会这样

新模型的排序确实更好,但它的输出整体系统性偏高了约 12% —— 预估点击率 2% 的位置,真实只有 1.8%。

恰恰相反 —— 因为下一名的 eCPM 里也含着偏高的 pCTR,分子分母一起涨; 而真正的问题在于:广告主为「预估 2% 」的流量付了钱,实际只拿到 1.8% 的点击。 单位点击的真实成本上升了约 11%

为什么没被发现

代价:日收入 -8%,四个大客户流失,恢复投放花了六周(信任比数字难修)。

该补什么

  1. 把校准指标加进上线门禁 —— ECE(期望校准误差)、或者最朴素的 预估CTR均值 / 实际CTR均值 必须落在 [0.97, 1.03]
  2. 分档看校准,不只看整体(高分段偏高、低分段偏低,整体均值可能正好抵消)
  3. 灰度期加一条广告主侧的监控:实际 CPC vs 预期 CPC

⭐⭐ 这个事故要记住的一句话推荐系统可以只关心排序,广告系统必须关心概率本身。 AUC 是推荐的常用指标,但在广告里,它对最致命的那类故障是瞎的


🔗 这一章连到哪里

去哪 为什么
12 · 评估与 AB 实验 12 章给了 AUC / GAUC / LogLoss 的定义和量级感(⭐ 推荐里 AUC 涨 0.001 就算改进),也点了 LogLoss 用在「需要概率校准时(如广告计费)」。⚠️ 但「AUC 只管排序、不管概率绝对值」这层区别是本章第七节才讲透的——带着这一章的结论回去重读它那张指标表
08 · 深度学习推荐模型 广告的 CTR 模型就是那一章的模型,一行代码都不用改。变的只是它的输出要拿去乘出价
11 · 重排与多样性 对照着看能防止一个高频混淆:打散是为用户体验,预算平滑是为预算分配,两者控制的东西完全不同
17 · 面试与求职 那一章的岗位地图里写了「广告算法工程师需要计费/出价机制」—— 这一章就是那句话的兑现
《模型上线之后》15 · 长期效应与代理指标 广告负载对留存的伤害是慢变量,几天的 AB 看不出来。那一章讲这类「短期涨、长期跌」该怎么系统地防
《模型上线之后》09 · 特征重要性的三种谎言 广告里模型解释不只是技术问题 —— 广告主会来问「为什么我的广告不展示」,你得答得出来

✅ 检查点

  1. 推荐和广告,链路上哪些部分是完全一样的?真正的差别插在哪一层?
  2. 三个广告主分别按 CPM / CPC / CPA 出价,怎么把他们放到同一把尺子上比?
  3. 为什么说「CTR 预估的误差在广告里直接是钱」?在推荐里它是什么?
  4. 一价拍卖为什么会崩?描述那个循环。
  5. GSP 里排名第 1 的广告主实际付多少钱?写出公式,并说明为什么出价一样的两个人可能排名不同。
  6. GSP 是激励相容的吗?分单位置和多位置两种情况回答。
  7. VCG 理论上更优,为什么工业界大多不用?给两个理由。
  8. oCPC 解决了什么信息不对称?它最大的争议是什么?
  9. 预算不做平滑会怎样?对广告主和对平台分别有什么损失?
  10. 广告的 AB 实验有个推荐没有的坑,是什么?典型症状是什么?
  11. 第七节那个事故里,AUC 涨了为什么反而出事?该补什么监控?
👀 答案
  1. 召回、粗排、精排、CTR 模型、特征工程、向量检索全都一样,可以是同一套代码。差别插在精排之后:广告多了一层拍卖与计价,它决定谁被展示、以及谁付多少钱。根本原因是推荐是双边(用户、平台),广告是三边 —— 多出来的第三方是出钱的广告主。
  2. 换算成 eCPM(千次曝光期望收入)CPM: eCPM = 出价CPC: eCPM = 出价 × pCTR × 1000CPA: eCPM = 出价 × pCTR × pCVR × 1000。正文例子里(pCTR=2%、pCVR=5%):C(CPA 50 元)= 50 > A(CPC 2 元)= 40 > B(CPM 30 元)= 30
  3. 因为平台承担了预估风险:CPC/CPA 计费下,pCTR 估高了平台就收不到预期的钱,估低了就少赚。在推荐里,预估不准的后果只是推得不够准、用户体验差一点,不直接换算成收入。
  4. 你出 10 元赢了,发现第二名只出 3 元 → 明天改出 3.1 → 第二名改出 3.2 → 一路加价到 10 元附近 → 有人受不了降回 3 元 → 循环重来。结果是出价剧烈震荡、永不收敛,广告主必须雇人天天盯盘。Overture 用的就是一价,Google 2002 年换掉了它
  5. 付费 = (下一名的 eCPM) / (自己的 pCTR) / 1000 + 0.01。正文例子:甲出价 10 元但实际只付 6.01 元。⭐ 出价一样排名不同是因为 eCPM 里含 pCTR —— 丙和甲同样出 10 元,但丙的 pCTR 只有 1%(甲是 2%),eCPM 只有甲的一半,所以排最后。这就是「质量」进入定价的地方。
  6. 单个位置时是(Vickrey 拍卖,说真话是严格最优,有数学证明);多个位置时不是 —— 存在故意少报一点、输掉第 1 名拿第 2 名反而更划算的情况,因为第 1 名要付的价格更高、性价比可能更低。准确说法:GSP 是二价思想在多位置上的推广,推广过程中丢掉了激励相容性。
  7. ①⭐广告主看不懂账单 —— GSP 一句话能解释清楚,VCG 要算「你不存在时别人会怎样」的反事实,销售没法向客户解释;②⭐切换期实打实少赚钱 —— 理论上广告主该上调出价到真实价值,但他们不会立刻这么做。(③历史惯性:投放系统和代理商策略都是围绕 GSP 建的。)
  8. 只有平台有足够数据估准 pCVR,广告主自己看不到每次曝光背后的概率。oCPC 让广告主只报一个「转化出价」,平台替他决定每次该出多少。⚠️ 最大争议:平台既是运动员又是裁判 —— pCVR 平台估、计费平台算,广告主无法独立验证。(通常分冷启动/智能出价两阶段,切换门槛常见是累计 20~50 个转化;靠赔付机制让广告主敢交出方向盘。)
  9. 早高峰把钱花光后广告整天下线。广告主:只触达了早高峰那批人,目标客户可能一个没碰到。⭐ 平台:下午晚上的流量少了一个竞争者 → 竞争变弱 → 成交价下降 → 整体收入减少。做法有概率节流和⭐出价调节两类,本质是个反馈控制器(PID),目标是让 已花预算/总预算 ≈ 已过时间/总时间
  10. ⭐⭐ 网络干扰(interference):实验组的广告主更容易赢曝光 → 抢走了库存和预算 → 对照组能赢的变少 → 两组不独立,AB 的基本假设被破坏典型症状:实验组指标涨得漂亮,全量上线后涨幅消失甚至变负 —— 那部分涨幅是从对照组抢来的。缓解:预算分流 / 双边实验 / 时间片轮转。
  11. 新模型排序确实更好,但输出整体系统性偏高约 12%AUC 是排序指标,对单调变换完全不敏感,整体偏高它一点看不出来;灰度看的 CTR 和收入短期都在涨。而真实后果是广告主为「预估 2%」的流量付钱、实际只拿到 1.8% 的点击,单位点击真实成本上升约 11% → ROI 崩 → 集中撤量,日收入 -8%。该补:⭐把校准加进上线门禁(ECE,或最朴素的 预估CTR均值/实际CTR均值 必须落在 [0.97, 1.03])、分档看校准(高低分段偏差可能互相抵消)、灰度期加广告主侧的实际 CPC vs 预期 CPC 监控。

🛑 可以停在这里

走神救援

推荐按「用户喜不喜欢」排序,广告按「这次曝光值多少钱」排序 —— 召回、粗排、精排、CTR 模型全都一样,前面 15 章白学不了,差别全在精排之后多出来的那一层:拍卖与计价。根本原因是推荐双边、广告三边,多出来的第三方是出钱的广告主。统一尺子是 eCPM(千次曝光期望收入):CPM 直接就是出价,CPC 是 出价 × pCTR × 1000,CPA 是 出价 × pCTR × pCVR × 1000 —— ⭐从上到下平台承担的预估风险越来越大,所以「CTR 误差在推荐里是体验损失,在广告里直接是钱」。定价上,一价拍卖会崩(赢了发现第二名只出 3 元 → 降价 → 别人加价 → 震荡永不收敛,Overture 就这样,Google 2002 换掉),所以用 GSP:付「刚好赢过下一名」的价,公式 下一名eCPM / 自己pCTR / 1000 + 0.01,例子里甲出 10 元只付 6.01 元;⭐出价一样排名可以不同,因为 eCPM 含 pCTR —— 这是质量进入定价的地方。⚠️ 高频考点:单位置的二价是激励相容的,多位置的 GSP 不是(少报一点拿第 2 名可能更划算)。VCG(付「你给别人造成的外部性」)理论上激励相容,但工业界大多不用,因为⭐广告主看不懂账单、⭐切换期实打实少赚钱oCPC 解决「只有平台估得准 pCVR」这个信息不对称,广告主报转化价、平台替他每次出价,分冷启动/智能出价两阶段(门槛常见 20~50 个转化)、靠赔付机制建立信任,⚠️ 争议是平台既当运动员又当裁判预算平滑防止早高峰把钱花光:广告主只触达一批人,平台下午少个竞争者、成交价下降;做法是概率节流或⭐出价调节,本质是 PID,让 已花/总预算 ≈ 已过/总时间;⚠️别和重排的打散混淆,一个服务用户一个服务广告主。评估上,指标不再同向(收入 vs 广告负载 vs 广告主 ROI),⭐⭐ 最大的坑是网络干扰:实验组抢走库存和预算 → 对照组变差 → 两组不独立,AB 基本假设破裂,症状是实验组涨得漂亮、全量后涨幅消失甚至变负。💀 事故:CTR 模型 AUC +0.31pp 却让日收入 -8% —— 输出整体偏高 12%,AUC 是排序指标对单调变换完全不敏感,广告主为「预估 2%」付钱实际只拿到 1.8%,单位点击真实成本 +11%,大客户 ROI 从 2.1 掉到 1.6 后集中撤量。⭐⭐ 一句话:推荐可以只关心排序,广告必须关心概率本身。

下一节 👉 16-实战项目.md

打卡记录保存在你的浏览器里,首页能看到总进度