Snap GRP单模型统一检索排序,弱源替换后观看时长升0.82%

GRP v0.1 Technical Report

Wenfeng Zhuo, Vincent Xue, Charles Wei, Cong Ni, Ruiming Lu, Jiwen Ren, Mo Li, Peng Yang, Xufei Wang, Dongheng Li, Jiacong He, Yi Song, Yufei Fan, Mikhail Obukhov, Yiwen Chen, Yvette Liu, Yin Ye, Chengjie Wu, Mingtao Zhang, Jinchao Ye, Lili Zhang, Chunhui Zhu

cs.IR

2026-09-29

Snap的GRP把检索、排序和奖励建模收进一个encoder-decoder,用mGRPO对齐观看时长。线上作为检索源并替换弱源后,观看时长升0.82%、分享升2.56%。

这篇在解决什么

工业推荐是一条多级漏斗:检索、粗排、精排、重排,每一级有自己的模型、特征和十年攒下来的新鲜度规则、准入过滤、校准与多样性控制。生成式推荐想用一个序列模型直接吐出下一条内容的 identifier。TIGER、HSTU、OneRec 已经证明能走通,但 Snap 自己做 overnight 整条替换,线上是负向的。

裸生成器复现不了那些颗粒度优化。生成检索的排序能力对不上级联。短视频目录几乎日更,冻结模型的精确 item 召回几天内塌掉。对打一场,量到的是「缺了十年优化」。GRP 因此走渐进路径:先当一条检索源,用同一套业务指标跟每条 incumbent source 比;打赢的源退役、配额转给它;再让越来越大比例的候选凭自己的分数绕过早期排序,直到排序器不再改 served slate。

方法

GRP 是一个 T5 风格 encoder-decoder,检索、排序、奖励同一套主干。

检索侧解码 Qwen3-VL Semantic ID,把视频量化成三层离散码。历史按 item 融合成一个 encoder token,同样长度能塞 4 倍历史。解码器按 item 分块、块间互不看,一次 forward 吐一整页独立候选。

排序侧是 MHP 模块,对完播、点赞、分享、跳过、观看时长各打一个头。三条输入全部 stop-gradient,排序 loss 进不了生成主干。候选 query 还走一条残差直连进 DCNv2 交叉网络。没有这条路时,cross-attention 的 query bias 比投影大三个数量级,模块只预测「这个用户会不会互动」,GRPO 组内奖励离散度只有 0.005% 到 0.16%。

奖励侧冻结 encoder、embedding 和 MHP,只训 decoder。奖励是各头加权混合;报告里的线上 RL 只用观看时长头。朴素 GRPO 会把 logged target 的概率让给高奖励样本,召回往下掉。mGRPO 加了一项单边、锚定在 reference policy 上的 margin:策略开始拿真实 target 去换更高奖励样本时才罚。KL 管整体漂移,这条管别把真点过的东西挤出去。

容量上 encoder 与 decoder 层数做成 1:2。长历史是算力中心,层挪到短目标的 decoder 上,命中率和吞吐一起涨。历史总预算里 25% 留给点赞、分享这类稀缺显式行为。

结果

离线都是单因素对照。item 级融合相对 SID 级:HR@10 从 0.1734 到 0.1764(+1.73%),历史量 4 倍,训练吞吐几乎不变;再加到 2 倍 Bref 不再涨、吞吐腰斩。encoder:decoder 从 2:1 改到 1:2,HR@5 从 0.1217 到 0.1241(+1.97%),训练吞吐 +21%。显式行为独立保额后,Reward Recall@20 从 0.0245 到 0.0294(+20%),Recall@20 +7%。Qwen3-VL SID 相对更早的 MM-SID:Recall@20 +11.9%,HR@20 +9.9%。

MHP 补上残差路径后,用户内奖励离散度从不到 0.2% 拉到中位数超过 200%。稠密头 AUROC 和稀疏头 AUPRC 如下。

头指标改前改后
Watch ≥ 10sAUROC0.66280.7759
CompleteAUROC0.62940.7609
ShareAUPRC0.02130.0457
FavoriteAUPRC0.03010.0592
ReplyAUPRC0.01230.0349

mGRPO 两节点相对基座:Reward Recall@10 +3.1%,Recall@10 +0.9%。光跑 GRPO:奖励几乎不动(-0.1%),召回 -1.25%。

推理侧 KV cache、CUDA graph、C++ 预处理和批量 SID 反查,端到端检索阶段 p95 延迟 -69%,model-server p50 -67.7%,吞吐 +208%。

线上短视频面,相对生产:

配置播放观看时长分享源排名
仅检索,SFT+RL+20× decode+0.22%+0.46%+0.77%第 4
早期排序旁路 + RL+0.22%+0.04%+0.98%第 9
旁路 + 退役弱源+0.47%+0.82%+2.56%第 10

纯 SFT 当检索源几乎打平(观看时长 +0.04%,不显著),排第 14。RL 相对 SFT 把观看时长贡献再抬 +0.45%。旁路在 SFT 上是用观看时长换分享(观看时长 -0.45%,分享 +2.87%),post-training 把观看时长拉回中性。相对全源平均,GRP 完播 +14.6%(第 2)、发送 +34.9%(第 2),平均观看时长只高 4.9%(第 12)。平台 DAU 等护栏中性或正向。

为什么重要

给工业推荐一个可落地的迁移协议,不是又一篇「生成式检索已经打赢 cascade」的宣称。Overnight 替换在 Snap 是负的,这篇把失败拆成可测缺口:排序、新鲜度、奖励可区分性。能直接抄的是三件事:检索源配额渐进替换、排序模块 detach 以免污染生成、用 reference-anchored margin 护住 logged target。

v0.1 这个版本号是诚实的。现在还是「多一条检索源加部分早期旁路」,离端到端还早。MHP 绝对水平仍落后生产排序器,稀有头 AUPRC 仍是个位数百分点。适合跟进的是已经有级联、愿意上 Semantic ID、并且接受先当检索源、不搞一次切完的团队。

局限与存疑

Snap 自己列了三条。没在每个轴上领先:boost rate 低于平均,观看时长和 skip 落后最强的单源,配额增长被质量缺口卡住。排序器还在环里:只有一部分候选旁路早期排序,全部仍过精排;SFT 旁路用观看换分享,RL 只拉回中性。MHP 是硬约束,稀有头 favorite、share、reply 的 AUPRC 绝对值低,奖励对最值钱的动作最不灵。模型偏小:历史超过 Bref 持平到变差,RL 收益随节点规模涨,encoder-decoder 重分配同时改善质量和吞吐,说明稠密容量欠配。

线上 RL 只用观看时长一个头,多目标还是下一步。源排名跨实验不可比:旁路加退役弱源后 GRP 排第 10,served share 没涨,增益来自内容槽位重分配。没有给出 MHP 对生产排序器的直接线上对照数字,只说 trailing。冻结生成器几天内精确召回塌掉,靠持续增量重训补,报告没给重训频率。

术语

原文与代码

社区讨论

相关论文

全部论文解读