← 返回论文列表
📄 生成式推荐 · 广告系统 · 工业落地

GR4AD:为大规模广告系统量身设计的生成式推荐器

Generative Recommendation for Large-Scale Advertising · Kuaishou Technology

作者
Peng Jiang, Kun Gai et al.(快手广告团队)
机构
Kuaishou Technology
来源
arXiv:2602.22732v3 · 2026
核心命题
在 Tokenization / Architecture / Learning / Serving 四个维度做 co-design,把生成式推荐真正跑进广告系统

📎 论文arxiv.org/abs/2602.22732

🚀 工业落地:快手广告全量部署,4 亿用户,A/B 收入 +4.2%,QPS 翻倍,<100ms 延迟

🎯 核心创新:UA-SID(多粒度多分辨率 SID)· LazyAR(懒惰自回归解码)· VSL+RSPO(list-wise RL)· DBS(动态 beam serving)

TL;DR

问题:把 LLM 风格的生成式推荐(GR)直接搬到广告系统,会被 多粒度业务字段list-level eCPM 优化实时多候选 <100ms 服务 三件事卡住。

方案(GR4AD = 四件套 co-design)

  • UA-SID:MLLM 端到端微调 + MGMR RQ-Kmeans,码本碰撞率 85% → 18%。
  • LazyAR:前 K 层不依赖 $s_{t-1}$ 可并行 + 跨 beam 共享,QPS 翻倍且基本不掉点。
  • VSL + RSPO:value-aware CE + LambdaLoss 风格的 list-wise RL(被证明是 NDCG 上界)。
  • Dynamic Beam Serving:分层 beam + 流量自适应 + result cache + FP8。

结果:快手广告全量部署,A/B 收入 +4.2%,500+ QPS / L20,<100ms 延迟,中小广告主投放量 +17.5%,转化率 +10.17%。

📖 阅读约定:贯穿全文的一条样本

为了让抽象的模块落到具体数字,本文用一条固定样本串起所有方法模块,请记住它:

  • 用户 U:30 岁男,最近 30 天点击过 12 条运动相关广告,长期广告价值高($w_{user}=1.5$)
  • 广告 $i$:「李宁旗舰店篮球鞋短视频」,价格 ¥399,转化方式=直播间引流,eCPM=12(桶号 v=8/10)
  • 真实标签:U 看完后 购买 了($w_{behavior}=3.0$)
  • 由 MGMR 量化出的 UA-SID = (2, 1, 387)

下文每个模块都会让你看到这条样本被怎么处理、loss 怎么算、为什么 LazyAR 不会让 ta 召不回来、为什么 RSPO 比 DPO 更能把 ta 排到第 1 位。

背景与动机

1.1 GR 的工业潮流

过去一两年,工业界(Meta HSTU、快手 OneRec、Google PLUM、美团 MTGR…)开始把传统 DLRM(Deep Learning Recommendation Model)改造成 生成式推荐器,希望复用 LLM 的两大红利:

  • Scaling Law:模型加参数就能涨点。
  • 统一架构:把召回/粗排/精排/重排压进同一个 next-token-prediction 框架。

代表工作:TIGER(RQ-VAE SID)、OneRec(统一召排)、PLUM(多分辨率码本)、HSTU(千亿参数序列 transducer)等。

1.2 广告场景的三个 Gap

把 GR 直接搬进广告,会立刻撞上三堵墙

Gap 1:Tokenization 不够用

广告短视频混合了 视频画面 + 商品信息 + 商家 B 端属性 + 转化类型 + 账户 ID。纯语义 SID(TIGER 风格)抓不住非语义业务字段——同样视频但不同转化类型,投放轨迹完全不同。

Gap 2:学习范式不对齐

广告优化的是 list-level 收益(eCPM、NDCG),而 LLM 风格的 token-level CE loss 是 point-wise 的,不能直接优化排序;同时广告样本既来自模型自产,又来自其它生产 pipeline,offline DPO/SimPO 不够用。

Gap 3:实时服务约束

广告必须 多候选(数十/上百)+ 高并发 + <100ms。这和 LLM 单次响应可以"慢慢出"完全不同,beam 数指数膨胀直接把 GR 干爆。

GR4AD 的回答:不是拼 LLM,而是在 tokenization / architecture / learning / serving 四个维度都做"recommendation-native"的 co-design。

方法详解

2.1 整体架构

GR4AD 的整体训练-服务架构如 Figure 1 所示,由四块串联:

1
Context Processor(轻量线性):把结构化特征 + 跨域用户序列 + 广告序列编码成 context $X=(x_1,\dots,x_S)$。
2
LazyAR Decoder:前 K 层并行(不依赖 $s_{t-1}$),后 L−K 层自回归,输出 UA-SID 序列 $y=(s_1,\dots,s_T)$。
3
VSL + RSPO 联合训练:VSL 学 user-interest 分布;RSPO 用 list-wise reward 拉到高 eCPM。
4
Realtime Serving:DBS(动态 beam)+ result cache + FP8,把延迟和吞吐压进预算。
Figure 1: GR4AD overall architecture
Figure 1(论文原图):GR4AD 模型架构与学习算法总览。Decoder 由 K 层并行 + (L−K) 层自回归组成;右侧是 VSL + RSPO 的统一训练流。

2.2 UA-SID:统一广告语义 ID

2.2.1 UAE:Unified Advertisement Embedding

广告 item 包含三类异质信息:Video(画面/ASR/OCR/BGM)、Product(标题/价格/卖点)、Advertiser(地域/粉丝/价值)。GR4AD 基于 Qwen3-VL-7B 做端到端微调,主要两件事:

① Instruction Tuning(IT):设计 6 种 prompt 模板覆盖快手不同广告类型,例如:

  • 直播间主播 → 让 MLLM 分析 profile + 地域
  • 外循环商家 → 让 MLLM 聚焦行业 + 品牌
  • 短视频创意 → 让 MLLM 解构心理触发点

② Co-occurrence Learning(CL):用 Swing 算法估计 item 共现强度,在 (Video, Product, Advertiser) 三元组上构造正样本对,配合 InfoNCE:

$$ \mathcal{L}_{NCE}(i) = -\log \frac{\sum_{j \in \mathcal{P}_i} \exp(z_i^\top z_j / \tau)}{\sum_{k \neq i} \exp(z_i^\top z_k / \tau)} $$
符号说明
  • $z_i, z_j, z_k$:item 的 MLLM 最后一层 hidden state(即广告 embedding)
  • $\mathcal{P}_i$:与 item $i$ 高共现的正样本集合(Swing 估计)
  • $\tau$:温度超参,越小正负样本区分越锐
  • 分母:batch 内除自身外的全部样本(in-batch negatives)
💡 举例:跟着一条「李宁篮球鞋」广告走完 UAE 全流程

假设广告 $i$ = 「李宁旗舰店的篮球鞋短视频」,输入到 Qwen3-VL-7B 的内容是:

  • Video:6 帧画面(球场+球员运球)、ASR="夏天打球,必备这双轻量篮球鞋"、OCR="满 199 减 50"、BGM=hiphop
  • Product:标题="李宁䨻轻弹篮球鞋"、价格=¥399、品牌=李宁、行业=运动鞋服
  • Advertiser:账号="李宁官方旗舰店"、地域=福建、粉丝=820w、广告价值=高

Step 1 — IT:选中 Prompt Template 2(聚焦品牌+行业),MLLM 生成结构化理解 → 把 hidden state $z_i \in \mathbb{R}^{4096}$ 输出。

Step 2 — CL(Swing):在历史日志里发现,看过 $i$ 的用户中有 12.3% 在 30 分钟内点击了广告 $j$ = 「安踏跑鞋直播间」 → Swing 分数 0.47,列为正样本对 $(i,j)\in \mathcal{P}_i$。

Step 3 — InfoNCE:同 batch 256 条样本里,把 $z_i^\top z_j$(高)拉大,把 $z_i^\top z_k$($k$=「某手机广告」、「某美妆广告」)压小。温度 $\tau=0.07$。

训完的效果:在 photo-to-photo recall@1 测试(同款商品的两条不同视频能否互相召回),从 Qwen3-VL-7B 的 0.769 提升到 0.896(Table 2)— 这就是 IT+CL 带来的具体收益。

2.2.2 MGMR RQ-Kmeans:多粒度多分辨率量化

传统 RQ-Kmeans 用等大码本(4096-4096-4096),实测 码本利用率仅 0.1‰,碰撞率 85%。GR4AD 提出两个关键改进:

① Multi-Resolution(MR)

浅层用大码本(16384)抓粗粒度主因子(高熵),深层用小码本(1024)建模低熵残差。+ Balanced K-means 提升利用率。

② Multi-Granularity(MG)

最后一层换成 hash,输入是非语义业务字段(账户 ID、转化类型)。语义相同但业务不同的广告由此被精确区分。

每个 item 最终被映射成离散 SID 序列:

$$ y = (s_1, s_2, \dots, s_T),\quad s_t \in \mathcal{V}_t $$
符号说明
  • $T$:UA-SID 总深度(论文中 T=3,前两层语义 + 最后一层 hash)
  • $\mathcal{V}_t$:第 $t$ 层的码本(前层大、后层小)
  • $s_t$:第 $t$ 层离散 token(前两层来自 RQ-Kmeans,最后一层来自非语义字段 hash)
Figure 2: UA-SID structure
Figure 2(论文原图):UA-SID 的两阶段结构 — UAE(语义 embedding)+ MGMR 量化(语义 SID + 业务 hash)。
💡 举例:MGMR 量化一步步把「李宁篮球鞋」打成 SID

承接上例,UAE 给出 embedding $z_i \in \mathbb{R}^{4096}$。MGMR 走三步:

Level 1(语义粗粒度,码本 16384):在 16384 个聚类中心里找最近的,比如落到聚类 #2(簇含义≈「运动+服饰+男性向」)→ $s_1 = 2$,残差 $r_1 = z_i - c_2$。

Level 2(语义中粒度,码本 4096):把 $r_1$ 再在 4096 个中心里找最近,比如 #1(簇含义≈「篮球/球类专项装备」)→ $s_2 = 1$,残差 $r_2 = r_1 - c'_1$。

Level 3(业务字段 hash,槽位 1024):注意 — 这里 再用 K-means。直接 $s_3 = \mathrm{hash}(\text{accountID}=\text{"李宁旗舰店"},\ \text{conversion}=\text{"直播间引流"}) \bmod 1024 = 387$。

最终 UA-SID = (2, 1, 387)

对比看 MG 的价值:同样视觉特征「篮球鞋」,但「安踏官方店 / 商品成交」的另一条广告 → $s_1=2, s_2=1$ 完全一致(因为画面+品类相同),但 hash 后 $s_3 = 819$ → SID 变成 (2, 1, 819)
没有 MG 时这两条会被合成同一个 SID,模型完全无法区分两家品牌的转化轨迹;加了 MG 后碰撞率从 85.4% → 18.3%

效果(Table 2):碰撞率 85.4% → 18.3%,码本利用率 0.10‰ → 0.34‰,压缩比 3.54 → 1.07。

2.3 LazyAR:懒惰自回归解码器

核心观察:在生成 SID 时,第 1 级 SID 的 loss 最大、最难学,但 beam 数 = 1(解码刚开始);后续层 loss 反而小,beam 数却指数膨胀。也就是说,"难的便宜,易的贵" — 这是推荐场景特有的 mismatch。

能否让后期层 少跑几层 AR,把算力省下来?

三种解码方式对比

方式结构优缺点
Vanilla AR每层都喂 $s_{t-1}$,所有 SID 都跑全 $L$ 层简单但慢,beam 越大越爆
DeepSeek-MTP给每个后续 token 单独加浅 decoder引入额外参数,效果反而下降
LazyAR (本文)前 K 层不依赖 $s_{t-1}$(可并行),第 K 层注入,后 L−K 层 AR前 K 层跨 beam 共享,省算力且不掉点
Figure 3: Vanilla AR vs DeepSeek-MTP vs LazyAR
Figure 3(论文原图):Vanilla AR / DeepSeek-MTP / LazyAR 解码结构对比。

LazyAR 数学定义

给定 $1 \le K < L$,对每个 SID 级 $t$,先跑前 $K$ 层而不依赖 $s_{t-1}$:

$$ m_t^{(0)} = p_t,\qquad m_t^{(\ell)} = \mathrm{Dec}^{(\ell)}\!\left(m_t^{(\ell-1)},\, X\right),\ \ \ell = 1,\dots,K $$

然后在第 K 层用 Fuse 算子注入 $s_{t-1}$:

$$ \tilde m_t^{(K)} = \mathrm{Fuse}\!\left(m_t^{(K)},\, s_{t-1}\right) = W_f \big[\, m_t^{(K)} \odot (W_g s_{t-1});\ s_{t-1}\,\big] $$

最后跑后 L−K 层自回归:

$$ h_t^{(\ell)} = \mathrm{Dec}^{(\ell)}\!\left(h_t^{(\ell-1)},\, X\right),\ \ \ell = K+1,\dots,L,\quad h_t^{(K)} \triangleq \tilde m_t^{(K)} $$ $$ p(s_t \mid s_1,\dots,s_{t-1}, X) = \mathrm{Softmax}\!\left(W_t h_t^{(L)}\right) $$
符号说明
  • $X = (x_1,\dots,x_S)$:context(用户序列 + 结构特征经线性 processor 得到)
  • $p_t$:第 $t$ 级 SID 的位置 embedding
  • $s_{t-1}$:上一级 SID 的 embedding($s_0$ = BOS)
  • $\mathrm{Fuse}$:门控融合 — $W_g$ 投影 + 元素积 + 拼接 + $W_f$ 投影
  • $K$:可调超参,$K=1$ 退化为标准 AR;论文取 $K = 2L/3$(实验 $L=9, K=6$)
  • $\odot$:元素积;$[\cdot;\cdot]$:拼接

为什么不掉点

  1. 第 1 级 SID 仍走完整 L 层($s_0=$ BOS,没有 $s_{t-1}$ 可"晚注入")— 最难的没省。
  2. 引入 MTP-style 辅助 loss:训练时把 $h_t^{(K)} \triangleq m_t^{(K)}$ 直接预测目标 token,强迫前 K 层学到足够丰富的 latent 表示。
  3. 前 K 层 跨 beam 共享、并行计算,每个 SID 级只要算一次;只有后 L−K 层需要 beam 内 AR — 实际 beam search 的瓶颈就在后期层。
💡 举例:beam=512、L=9、K=6 时 LazyAR 到底快在哪

承接上例,现在线上来了一个用户请求,要为 ta 召回 ≤512 个广告 SID(每个 SID 是 3 级,如 (2,1,387))。Decoder 共 9 层。

① Vanilla AR 的算账

  • 第 1 级(s₁):beam=1,跑 9 层 → 9 次 decoder-layer 计算
  • 第 2 级(s₂):beam 扩到 512,跑 9 层 → 512 × 9 = 4608
  • 第 3 级(s₃):beam=512,跑 9 层 → 4608
  • 合计 ≈ 9225 次 decoder-layer 计算,且 9 层必须严格串行(每层依赖 $s_{t-1}$)

② LazyAR(K=6)的算账

  • 前 6 层(不依赖 $s_{t-1}$):3 个 SID 级一次性并行算完 → 3 × 6 = 18,且可一次 GPU forward 完成
  • 后 3 层(AR):第 1 级 beam=1 → 3 次;第 2 级 beam=512 → 1536;第 3 级 beam=512 → 1536
  • 合计 ≈ 18 + 3075 ≈ 3093 次约 1/3 算力,且前 6 层完全并行

③ 具体到那条「李宁篮球鞋」

  • 第 1 级用 BOS + context(用户最近看了 5 条运动相关视频)跑完整 9 层 → 输出概率最高 5 个:$s_1\in\{2, 7, 11, 3, 18\}$(top-1=2,对应"运动服饰男向")— 这里 LazyAR 不省,因为最难
  • 第 2 级以 $s_1=2$ 为前缀展开 beam=512,对每条 beam,前 6 层结果其实和 $s_1$ 无关 → 直接复用;只有最后 3 层注入 $s_1$ 的 emb 后 AR 计算
  • 第 3 级同理,前 6 层再次复用,最后 3 层做 hash bucket 预测

→ 实测 QPS +117%,revenue 仅从 +4.32% 跌到 +4.28%(≈无损)。对比 DeepSeek-MTP 同等 QPS 下跌到 +3.98%。

实验:LazyAR 让 QPS +117%,revenue 仅从 +4.32% → +4.28%(几乎无损);而 DeepSeek-MTP 同等 QPS 下 revenue 跌到 +3.98%。

2.4 VSL:价值感知监督学习

在标准 SID next-token-prediction loss

$$ \mathcal{L}_{SID} = -\sum_{t=1}^T \log p(s_t \mid s_1,\dots,s_{t-1}, X) $$

之外,VSL 增加三件事:

① eCPM Token Prediction

把连续 eCPM 离散化成等概率桶,作为 SID 之后的额外预测 step:

$$ \mathcal{L}_{eCPM} = -\log p(v \mid y, X),\qquad \mathcal{L}_{NTP} = \mathcal{L}_{SID} + \lambda_e \mathcal{L}_{eCPM} $$
符号说明
  • $v$:当前样本的离散化 eCPM token(按等概率分桶)
  • $y$:UA-SID 序列;$X$:context
  • $\lambda_e$:eCPM loss 权重超参
  • 推理时 $p(v\mid y, X)$ 可用于对生成的 SID 做 re-rank

② Value-Aware Sample Weighting

每条样本权重 $w = w_{user}\cdot w_{behavior}$:

  • $w_{user}$:用户长期广告价值(高价值用户权重大)
  • $w_{behavior}$:行为深度(购买 > 加购 > 点击)

③ MTP Auxiliary Loss

配合 LazyAR 的设计,强迫前 K 层 trunk 自己就能预测目标 token,形成 $\mathcal{L}_{MTP}$。

$$ \mathcal{L}_{VSL} = \mathbb{E}_{D}\!\left[\, w \left(\mathcal{L}_{NTP} + \lambda_{mtp}\mathcal{L}_{MTP}\right) \right] $$
符号说明
  • $D$:训练样本流(在线日志)
  • $w = w_{user}\cdot w_{behavior}$:sample-level 权重
  • $\lambda_{mtp}$:MTP 辅助 loss 强度

VSL 的本质:把"分布拟合"和"业务价值"两件事缝进同一个 CE 框架里。

💡 举例:VSL 对「李宁篮球鞋」这条样本的 loss 是怎么算的

用户 U 看完一个 30 元蛋白粉广告后,购买了我们的李宁篮球鞋(target SID = (2, 1, 387),eCPM=12,桶号 v=8/10)。同时另一条样本是 U 仅点击了某条手游广告(SID=(18,5,71),eCPM=0.8,v=1/10)。

① $\mathcal{L}_{SID}$(标准 CE,3 步)

  • step 1:$-\log p(s_1=2 \mid X) = -\log 0.18 \approx 1.71$(第 1 级最难,loss 最大)
  • step 2:$-\log p(s_2=1 \mid s_1=2, X) = -\log 0.42 \approx 0.87$
  • step 3:$-\log p(s_3=387 \mid s_{1:2}, X) = -\log 0.71 \approx 0.34$
  • $\mathcal{L}_{SID} = 1.71+0.87+0.34 = 2.92$

② $\mathcal{L}_{eCPM}$(多预测一个 eCPM 桶):$-\log p(v=8 \mid y, X) = -\log 0.25 \approx 1.39$

设 $\lambda_e=0.3$ → $\mathcal{L}_{NTP} = 2.92 + 0.3\times 1.39 = 3.34$

③ Sample weight

  • 李宁鞋样本:$w = w_{user}\cdot w_{behavior} = 1.5\times 3.0 = 4.5$(高价值用户 + 购买行为)
  • 手游点击样本:$w = 0.8\times 1.0 = 0.8$(低活用户 + 浅点击)
  • → 李宁鞋样本贡献的最终 loss ≈ 4.5 × 3.34 = 15.0;手游样本即使 NTP loss 一样大,也只贡献 ≈ 2.7

→ 同一份训练数据下,模型会优先学好「高价值用户深度转化」的分布,而不是被海量"低活用户的浅点击"稀释。这就是 VSL 对纯 CE 的直接超越(+2.80% vs OneRec-V2 +1.68%)。

2.5 RSPO:Ranking-Guided Softmax Preference Optimization

VSL 是 point-wise 拟合 logged 分布,不直接优化 list-level NDCG。RSPO 把 LambdaLoss 思想嫁接到 DPO/SDPO 框架,用一条统一的 list-wise 目标。

$$ \mathcal{L}_{RSPO} = -\mathbb{E}_{(X, y_i, \mathcal{E}_i)\sim D}\!\left[ \log_2 \sigma\!\left( - \log\sum_{y_j \in \mathcal{E}_i}\!\! M_{ij}\exp\!\left( \beta \log\frac{p_\theta(y_j\mid X)}{p_{ref}(y_j\mid X)^{C_{ij}}} - \beta \log\frac{p_\theta(y_i\mid X)}{p_{ref}(y_i\mid X)^{C_{ij}}} \right) \right) \right] $$
符号说明
  • $\mathcal{Y}=\{y_1,\dots,y_n\}$:候选列表,$v_i$ 是 $y_i$ 的 reward(eCPM)
  • $\mathcal{E}_i = \{y_j \mid v_j < v_i\}$:reward 比 $y_i$ 低的候选集
  • $M_{ij}=\big|\,\tfrac{1}{D_{|i-j|-1}}-\tfrac{1}{D_{|i-j|+1}}\big|\cdot|G_i - G_j|$:LambdaRank 系数
  • $G_i=(2^{v_i}-1)/Z$,$D_i=\log_2(1+i)$,$Z$ 是 ideal DCG
  • $\beta$:偏好强度
  • $C_{ij}$:reference 可用性二值 gate(公式 18 阈值 $\delta$ 控制,离 $p_{ref}$ 太远就丢掉 reference)

NDCG 上界(论文附录 A.1)

$$ \mathrm{NDCG}_{cost} = \sum_{i=1}^n G_i - \sum_{i=1}^n \frac{G_i}{D_i} = \sum_{i=1}^n G_i - \mathrm{NDCG} $$

论文证明 $\mathcal{L}_{RSPO}$ 是 $\mathrm{NDCG}_{cost}$ 的上界 → 最小化 RSPO ⇒ 最大化 NDCG,提供 RL 端的排序对齐保证

为什么需要 $C_{ij}$ 这个 gate?

  • 样本来自异构源:GR4AD 自产样本可记录 $p_{ref}$;其它 pipeline 来的样本没有 $p_{ref}$。
  • 即便有 $p_{ref}$,distribution drift 也可能让它失效,此时强行约束反而引入噪声。
  • 实现:当 $\frac{1}{|\mathcal{E}_i \cup\{y_i\}|}\sum |\log p_\theta/p_{ref}| < \delta$ 时启用 reference,否则丢掉。
💡 举例:RSPO vs DPO 在同一条候选列表上的差别

承接上例,用户请求被 GR4AD 召回了 5 条广告(取 beam top-5 简化),ground-truth reward(eCPM)排序:

SID含义eCPM (v)ideal rank模型当前 likelihood rank
(2,1,387)李宁篮球鞋(这条)12.013 ❌
(2,1,819)安踏跑鞋10.521
(7,3,55)男士运动短裤6.232
(11,2,9)蛋白粉3.144
(18,5,71)手游下载0.855

① DPO 的处理

  • 只能构造 chosen/rejected 对,最常见做法是把最高 reward 当 chosen、随机抽个低 reward 当 rejected → 比如 (李宁鞋 vs 手游)。
  • 问题:模型已经把"手游"排到最后了(rank=5,对齐 reward),这对里没"难样本";而真正错的是「李宁鞋 vs 安踏鞋」(rank 1↔3 颠倒),DPO 这一对 loss 几乎为 0,错过了关键梯度

② RSPO 的处理:以李宁鞋(i=1)为 anchor,$\mathcal{E}_1 = \{$安踏、短裤、蛋白粉、手游$\}$(reward 全部更低)。

  • 对每个 $y_j\in \mathcal{E}_1$ 算 LambdaRank 系数 $M_{1j} \propto |G_1 - G_j|\cdot|1/D_{|1-j|-1} - 1/D_{|1-j|+1}|$
  • 关键:模型把李宁鞋(高 reward)排到了第 3,安踏鞋(低 reward)排到了第 1 → $M_{1,2}$(rank 临近 + reward gap 较大)非常大,这条对的 softmax 项主导整个 loss → 梯度优先把这对 swap 回来。
  • 而 (李宁 vs 手游) 这种 rank 已经"对的方向"的对,$M$ 自动很小,几乎不消耗梯度。

DPO 像随机刷题,RSPO 像哪里错重点刷哪里。Table 1 上 RSPO (+3.86%) 显著优于 DPO (+3.16%) 与 GRPO (+3.21%)。

💡 举例:$C_{ij}$ gate 何时丢掉 reference

同一条李宁鞋样本,假设:

  • 场景 A(GR4AD 自产,新鲜):$p_{ref}$ 是 1 小时前的模型快照,$|\log p_\theta/p_{ref}|$ 平均 0.3 < 阈值 $\delta=1.0$ → $C_{ij}=1$,用 reference 做正则。
  • 场景 B(其它 pipeline,无 ref):根本没记录 $p_{ref}$ → $C_{ij}=0$,等价于把分母里 $p_{ref}$ 设成 1,loss 退化为纯 list-wise SimPO 形式。
  • 场景 C(GR4AD 自产,但模型已大改):$p_{ref}$ 是 3 天前的,$|\log p_\theta/p_{ref}|$ 平均 1.8 > $\delta$ → 强行拉回反而拖后腿,$C_{ij}=0$ 直接丢掉。

这种 gate 让 RSPO 能消化异构来源 + 漂移的训练流,是在线学习能跑稳的关键工程细节。

2.6 Unified Learning of VSL & RSPO

工业在线学习无法像 LLM 那样把 SFT / RL 分阶段做,必须 同流训练。GR4AD 借鉴 HPT 思想,引入 sample-level rank discrepancy

$$ A^{(i)} = \frac{|r_p^{(i)} - r_v^{(i)}|}{n - 1},\qquad A^{(i)} \in [0, 1] $$
符号说明
  • $r_p^{(i)}$:候选 $i$ 在模型 likelihood $p_\theta(y_i\mid X)$ 下的 rank
  • $r_v^{(i)}$:候选 $i$ 在 reward $v_i$(eCPM)下的 rank
  • $n$:候选列表长度
  • $A^{(i)}$ 越大,模型偏离 reward 越远

动态分配 VSL / RL 权重:

$$ w_{VSL}^{(i)} = w_0 \cdot \exp\!\left(A^{(i)}\cdot \log(1+v_i)\right) $$ $$ w_{RL}^{(i)} = w_0 \cdot Z_{max}^{1 - A^{(i)}} $$ $$ \mathcal{L} = \mathbb{E}_{i\sim D}\!\left[\, w_{VSL}^{(i)}\mathcal{L}_{VSL}^{(i)} + w_{RL}^{(i)}\mathcal{L}_{RSPO}^{(i)} \right] $$
符号说明
  • $w_0$:基础缩放因子
  • $Z_{max}$:RL 权重上限(避免训练发散)
  • $A$ 大 → VSL 权重大(先把分布对齐到 reward);$A$ 小 → RL 权重大(专注 list 级优化)
💡 举例:同一条样本两阶段,权重如何自动切换

还是这条召回列表(n=5),李宁鞋 reward 排第 1,模型当前 likelihood 排第 3。我们看权重怎么算:

T₀ 时刻(模型刚冷启)

  • $r_p^{(1)}=3, r_v^{(1)}=1$ → $A^{(1)} = |3-1|/(5-1) = 0.5$(偏离较大)
  • $w_{VSL}^{(1)} = w_0 \cdot \exp(0.5\cdot \log(1+12)) = w_0 \cdot 13^{0.5} \approx 3.6\,w_0$ (VSL 权重大
  • $w_{RL}^{(1)} = w_0 \cdot Z_{max}^{1-0.5} = w_0 \cdot \sqrt{Z_{max}}$ (RL 权重适中)
  • 👉 这条样本主要走 VSL:先让模型学到「李宁鞋这种 SID 在这个用户的 context 下概率应该更高」

T₅₀₀ 时刻(在线训练 500 步后)

  • 模型已经把李宁鞋拉到 rank=2,安踏到 rank=1 → $A^{(1)} = |2-1|/4 = 0.25$(基本对齐)
  • $w_{VSL}^{(1)} = w_0\cdot 13^{0.25} \approx 1.9\,w_0$ (VSL 权重下降)
  • $w_{RL}^{(1)} = w_0\cdot Z_{max}^{0.75}$ (RL 权重接近上限
  • 👉 此时样本主要走 RSPO:精修「李宁 vs 安踏」这种相邻位置的 list 级 ranking 错误

→ 等价于"新样本先模仿、老样本再精调",且完全 sample-level 自适应。比固定 $\lambda_{SFT}+\lambda_{RL}$ 的 HPT 更稳,是在线学习能避免训练崩盘的关键。

部署与服务

3.1 闭环系统

GR4AD(0.16B 参数)已在快手广告全量上线,服务 4 亿用户。系统分四块组成闭环:

1
Realtime Serving:处理在线请求,返回排序好的广告列表,同时把 serving context + 用户反馈打 log。
2
Realtime Index:维护 Item ↔ UA-SID 双向索引。新广告到来时,秒级算出 UA-SID 并更新索引(传统 DLRM 是分钟级 embedding 索引重建)。
3
Online Learning:消费请求 + 反馈流,构造 VSL 日志(重正样本)+ RL 日志(送 reward system);mini-batch 持续训练,参数实时同步推理服务。
4
Reward System:用真实曝光数据训练 reward model,离线给候选打分 → 输出 RL log,关闭整个闭环。
Figure 4: GR4AD system overview
Figure 4(论文原图):GR4AD 闭环系统总览 — 实时服务、实时索引、在线学习、奖励系统四块互联。

3.2 Dynamic Beam Serving (DBS)

DBS 把"算力 vs 收益"做成可调度的连续函数:

① Dynamic Beam Width (DBW)

固定 beam(如 512-512-512)在前期层是浪费 — 早期 beam 决定后期算力。DBW 改成 渐进增长:128-256-512,最终候选数不变,中间算力骤降。

② Traffic-Aware Adaptive Beam Search (TABS)

请求流量有强烈的峰谷周期。设 $Q_t$ 为时刻 $t$ 的 QPS,$B_{base}$ 为基础 beam 设定:

$$ B_t = B_{base}\cdot f(Q_t, \mathcal{C}_{avail}) $$
符号说明
  • $Q_t$:实时 QPS
  • $\mathcal{C}_{avail}$:当前可用算力余量
  • $f$:根据流量与算力余量的 beam 调度函数 — 低谷期放大 60% 榨干算力换收入;高峰期保持基线

3.3 其它优化

  • Reco Result Cache:1 分钟内同用户重复请求复用结果(用户意图和广告池在短窗口内基本稳定)。
  • Beam-Shared KV Cache:把 beam 沿序列维组织,多 beam 共享 encoder KV,KV 读复杂度从 $\mathcal{O}(B\cdot L)$ 降到 $\mathcal{O}(L)$。
  • TopK Pre-Cut:每个 beam 先选 $k$ 个候选,再做全局 top-$k$ 聚合,提升 GPU 并行度。
  • FP8 量化:把 FP32 → FP8,显存与算力双省。

实验结果

4.1 主表对比(Table 1)

配置ΔRevenue vs DLRMΔQPS vs GR-Base
DLRM (Base)
OneRec-V2 (GR-Base)+1.68%
+ UA-SID+1.92%0%
+ VSL+2.80%−25%
+ VSL + DPO+3.16%−25%
+ VSL + GRPO+3.21%−25%
+ VSL + RSPO+3.86%−25%
+ Unified VSL & RSPO (UVR)+4.01%−25%
+ UVR + DBS+4.32%+20%
+ UVR + DBS + DeepSeek-MTP+3.98%+117%
GR4AD (+ UVR + DBS + LazyAR)+4.28%+117%

关键看点

  • RSPO > GRPO > DPO(list-wise > group-wise > pair-wise,符合广告 ranking 直觉)
  • LazyAR 把 QPS 翻倍同时只损失 0.04% revenue,显著优于 DeepSeek-MTP(同 QPS 下后者跌 0.34%)
  • 每一层优化都正向叠加,最终 +4.28% revenue + 117% QPS

4.2 Scaling Law

Figure 5: scaling laws
Figure 5(论文原图):模型规模 + beam 宽度的双重 Scaling Law。
  • Model Scaling:0.03B → 0.32B,loss 单调下降(3.36 → 2.91),revenue 单调上升(+2.13% → +4.43%)。
  • Inference Scaling:beam 128 → 1024,revenue +2.33% → +4.21%,但 QPS 跌到 30% — 典型的 inference-time scaling trade-off。

4.3 UA-SID 质量(Table 2)

Embedding 优化(R@1↑)

  • QARM:0.541
  • Qwen3-VL-7B:0.769
  • + IT + CL (UAE):0.896

量化优化(Col↓)

  • RQ-Kmeans (4096³):85.4%
  • + MR (16384/4096/1024):59.7%
  • + MG + MR:18.3%

4.4 业务指标

  • 中小广告主投放量 +17.5%(受益于冷启覆盖与 SID 索引秒级更新)
  • 广告转化率 +10.17%(更精准的兴趣建模)
  • 低活用户转化率 +7.28%(content-based SID 的泛化能力)
  • 系统级:500+ QPS / L20,<100ms 延迟,平台、广告主、用户三方共赢

💭我的理解

5.1 亮点

  1. 真·全栈 co-design:从 tokenization 到 serving 每一环都为广告业务量身改造,而不是仅靠"上更大模型"涨点。
  2. MGMR 思路非常工程化:"语义层 + 业务 hash 层"在 SID 设计里把"看着像但本质不同"的广告解开,对碰撞率影响极大(85.4% → 18.3%)。
  3. LazyAR 是最有借鉴意义的架构创新:抓住了"早期 token 难学但成本低,后期 token 易学但成本高"这个推荐特有的 mismatch。L=9, K=6 让 QPS 翻倍且几乎不掉点,工业界其它 GR 系统可以直接套用。
  4. RSPO 的数学严谨性:被证明是 NDCG 上界,比 DPO/SimPO/GRPO 在 ranking 任务上有可证明的优势。
  5. Unified VSL & RSPO 的动态权重:用 rank discrepancy $A^{(i)}$ 自适应切换 SFT/RL 权重,比 HPT 的固定权重更灵活,是在线学习场景下少数能落地的设计

5.2 不足 / 可探讨

  • RSPO 公式复杂:$M_{ij}$、$C_{ij}$、$p_{ref}$、$\delta$ 都是细节,复现门槛高。
  • LazyAR 的 K 选择仅经验($K=2L/3$),缺乏理论分析。
  • Reward Model 训练细节几乎没讲,但 RSPO 效果严重依赖 reward 质量。
  • $A^{(i)}$ 计算需要 reward 全部已知,对完全冷启样本如何处理没明说。
  • 0.16B 略小:Scaling 上看 0.32B 还在涨(+4.43%),上线版本估计是被 serving 预算压回 0.16B。

5.3 启发

  1. 推荐 GR 不必照搬 LLM RLHF — list-wise + ranking-aware 才是推荐的本分。
  2. "解码成本随 beam 指数增长"是所有 GR 绕不开的问题,LazyAR / MTP 类的"早期共享 + 后期 AR"思路值得普及。
  3. 业务字段不要硬塞进语义 embedding,直接在 SID 末位 hash 反而干净,且对碰撞率有立竿见影的效果。
  4. 在线学习场景下 SFT/RL 必须同流,且需要自适应权重,否则两个目标会互相打架。
  5. SID 索引秒级更新 vs embedding 索引分钟级更新,对冷启与中小广告主是巨大利好(+17.5%)。
一句话总结:GR4AD 把"生成式推荐"从 LLM 移植回广告系统的工程闭环 — UA-SID 解决 token 化、LazyAR 解决服务、VSL+RSPO 解决目标对齐,是当前生产级 GR 的最完整范本之一。