Snap GRP Unifies Retrieval and Ranking; Replacing Weak Sources Lifts View Time 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's GRP folds retrieval, ranking, and reward into one encoder-decoder; source replacement with early bypass lifts view time 0.82% and shares 2.56%.

What problem this solves

Industrial recommenders are multi-stage funnels: retrieval, early ranking, late ranking, re-ranking, each with its own model, features, and a decade of freshness rules, eligibility filters, calibration, and diversity controls. Generative recommendation wants one sequence model to emit the next item's identifier. TIGER, HSTU, and OneRec showed the idea can work. Snap's overnight cascade swaps went negative online.

A bare generator does not reproduce those granular optimizations. Generative retrieval rarely matches cascade ranking. On a short-video catalog that turns over almost daily, a frozen model's exact-item recall collapses within days. A head-to-head swap therefore measures the missing optimizations more than generator quality. GRP migrates in stages: enter as one retrieval source and benchmark against every incumbent on the same metrics; retire the sources it beats and take their quota; then let a growing fraction of candidates skip early ranking on the model's own scores until rankers stop changing the served slate.

Method

GRP is a T5-style encoder-decoder with retrieval, ranking, and reward on one trunk.

Retrieval decodes Qwen3-VL Semantic IDs: a video quantized into three hierarchy levels of discrete codes. Each history item fuses into one encoder token, so the same encoder length holds 4× more history than SID-level encoding. The decoder attends independently within each candidate's code block and not across blocks, so one forward pass emits a whole slate.

Ranking is an MHP module with heads for complete, favorite, share, skip, and watch time. All three inputs are stop-gradient, so the ranking loss never enters the generation trunk. The candidate query also takes a residual path straight into a DCNv2 cross network. Without that path, the cross-attention query bias dwarfed the projection by three orders of magnitude, the module predicted only whether the user would engage at all, and within-user reward spread sat at 0.005% to 0.16%.

For post-training the encoder, embeddings, and MHP freeze; only the decoder trains. The reward is a weighted mix of heads; the reported online RL run uses the view-time head alone. Vanilla GRPO trades logged-target probability for high-reward samples and recall falls. mGRPO adds a one-sided, reference-anchored margin that fires only when the policy starts swapping a real target for a higher-reward sample. The KL term slows overall drift; the margin protects logged targets.

Dense capacity is decoder-heavy at a 1:2 encoder-to-decoder split, because the long history is the compute center. 25% of the history budget is reserved for scarce explicit actions such as favorites and shares.

Results

Offline numbers are one-factor comparisons. Item-level history fusion versus SID-level: HR@10 0.1734 to 0.1764 (+1.73%), 4× history, throughput essentially flat; 2× Bref does not help and halves throughput. Encoder:decoder 2:1 to 1:2: HR@5 0.1217 to 0.1241 (+1.97%), training throughput +21%. Merging explicit events with a reserved budget: Reward Recall@20 0.0245 to 0.0294 (+20%), Recall@20 +7%. Qwen3-VL SID versus the earlier MM-SID: Recall@20 +11.9%, HR@20 +9.9%.

After the residual path, within-user reward spread rose from under 0.2% to a median over 200%.

HeadMetricBeforeAfter
Watch ≥ 10sAUROC0.66280.7759
CompleteAUROC0.62940.7609
ShareAUPRC0.02130.0457
FavoriteAUPRC0.03010.0592
ReplyAUPRC0.01230.0349

mGRPO on two nodes versus the base model: Reward Recall@10 +3.1%, Recall@10 +0.9%. GRPO alone: reward flat (-0.1%), recall -1.25%.

Serving work (KV cache, CUDA graphs, C++ preprocessing, batched SID lookup) cut end-to-end retrieval-stage p95 latency 69%, model-server p50 67.7%, and raised throughput 208%.

Online on the short-video surface, versus production:

SetupViewsView timeSharesSource rank
Retrieval only, SFT+RL+20× decode+0.22%+0.46%+0.77%4th
Early-ranker bypass + RL+0.22%+0.04%+0.98%9th
Bypass + retire weaker sources+0.47%+0.82%+2.56%10th

SFT as a retrieval source is a wash (view time +0.04%, not significant) and ranks 14th. RL versus SFT adds +0.45% view-time contribution, matching the sole reward. Bypass on SFT trades view time for shares (-0.45% / +2.87%); post-training returns view time to neutral. Versus the all-source average, GRP is +14.6% on completion (2nd) and +34.9% on sends (2nd), but only +4.9% on average watch time (12th). Platform guardrails such as DAU stayed neutral or positive.

Why it matters

This is a migration protocol for industrial recommenders, not a claim that generative retrieval already beats the cascade. Overnight replacement went negative at Snap; the report turns that failure into measurable gaps: ranking, freshness, and a reward that actually ranks candidates. Three pieces travel: grow quota by beating sources one at a time, detach the ranker so it cannot pollute generation, and pin logged targets with a reference-anchored margin.

The v0.1 label is earned. The system is still an extra retrieval source plus a partial early bypass, short of end-to-end. MHP still trails the production ranker, and rare-head AUPRC remains in the low single-digit percents. The teams this helps already run a cascade, can adopt Semantic IDs, and will ship as a source first.

Limitations

Snap lists three. The model does not lead on every axis: boost rate is below average, watch time and skip trail the strongest individual sources, and quota growth is bounded by those quality gaps. Rankers stay in the loop: only a portion of candidates skip early ranking, and every candidate still hits the late ranker; SFT bypass trades view time for sharing, and RL only brings view time back to flat. MHP is the binding constraint; AUPRC on favorite, share, and reply is low in absolute terms, so the reward is least informative on the actions that matter most. The dense trunk is small: histories past Bref are flat to negative, RL gains grow with node count, and encoder-decoder rebalancing improved quality and throughput together, which points to under-provisioned capacity.

Online RL used view time as the sole reward; multi-objective is future work. Source-rate ranks are not comparable across experiments: after source retirement GRP ranks 10th and served share did not grow; the lift comes from reassigned content slots. There is no direct online number of MHP versus the production ranker, only that it trails. Exact-item recall of a frozen generator collapses within days; continuous incremental retraining is the stated fix, without a published cadence.

Terms

Source

What people are saying

Related papers

All paper explainers