OneRec: Session-wise generative recommendation with preference alignment¶
Fidelity: 完整核心链路复现。当前代码实际训练 RQ Semantic IDs、session-wise encoder-decoder、稀疏 MoE、个性化 reward model 和 self-hard DPO;仅缩小模型、session 长度和公开数据规模。
论文信息¶
| 项目 | 内容 |
|---|---|
| 论文链接 | arXiv 2502.18965 |
| 公司/机构 | Kuaishou |
| 首次公开日期 | 2025-02-26(arXiv v1) |
| 原文开源代码 | 否:论文未提供官方/作者代码(核查日期:2026-08-09) |
| Adapter | onerec |
| 本地复现代码 | src/auto_research/reproductions/onerec/ |
原始论文总结¶
背景与主要改动¶
传统 retrieve→rank 多阶段系统目标割裂;已有生成式召回又多为 point-wise next-item generation,难以保证一个推荐 session 内的连贯性与多样性。OneRec 用三层 RQ Semantic ID 表示物品,以 MoE 模型一次生成 5 个目标物品的完整 session,并训练个性化 reward model 预测 watch/interaction 指标。Iterative Preference Alignment(IPA)从当前模型 beam-search 的 128 个 session 中选 self-hard winner/loser,仅用 1% 样本做迭代 DPO。
flowchart LR
A["256-item user history"] --> B["RQ Semantic IDs"]
B --> C["MoE session generator"]
C --> D["128 beam sessions"]
D --> E["personalized multi-task reward model"]
E --> F["self-hard winner / loser pairs"]
F --> G["1% iterative DPO"]
G --> C
C --> H["single-stage online recommendation"]
原论文关键图¶
原论文 Figure 2(关键图):展示原论文提出的核心架构、主要模块及其连接关系。图片来自原论文,版权归原作者所有;点击图片可查看来源。
核心公式¶
OneRec 把 \(m\) 个目标 item 的 L 层 SID 串成 session,自回归目标为
Reward model 对生成 session 预测 SWT、VTR、WTR、LTR。IPA 的 DPO 更新为
论文离线与线上效果¶
OneRec-1B 的 max SWT/LTR 为 0.1529/0.0660,高于 TIGER-1B 的 0.1368/0.0579;加入 IPA 后进一步达到 0.1933/0.1203。相对 OneRec-1B,IPA 的 max SWT、max LTR 提升 4.04% 和 5.43%;1% DPO 样本达到更高采样率约 95% 的最佳效果。
Kuaishou 主场景使用 1% 流量严格 A/B:
| Model | Total watch time | Average view duration |
|---|---|---|
| OneRec-0.1B | +0.57% | +4.26% |
| OneRec-1B | +1.21% | +5.01% |
| OneRec-1B + IPA | +1.68% | +6.56% |
本地复现¶
本地对照口径:基线是 Session Generator SFT;实验组是 reward model+self-hard DPO 后的 OneRec;NDCG@10 从 0.01565 降至 0(-100%)。这是 preference alignment 阶段消融,不是 OneRec 相对 DIN 的结果。
MovieLens-1M 上训练三层 RQ-VAE SID [256,128,64];96d、2-layer encoder-decoder 使用 4 个 top-1 sparse experts,一次生成 3 个 item session。先做 240-step session SFT,再训练 120-step personalized reward model,从生成器 12-beam session 中选 96 组 self-hard winner/loser,执行 80-step DPO。测试时只允许生成 catalog 中存在的 SID prefix。
| Stage | Hit@10 | NDCG@10 | Head share@10 | Valid session |
|---|---|---|---|---|
| Session generator SFT | 0.0200 | 0.0157 | 0.4372 | 1.0000 |
| + iterative preference alignment | 0.0000 | 0.0000 | 0.1047 | 1.0000 |
SID 唯一率为 90.80%;SFT final loss 5.1333,reward loss 只从 0.6939 降到 0.6804,DPO loss 却从 0.1358 快速降到 0.00054。DPO 将 head share 从 43.72% 降到 10.47%,但同时把 SFT 的 NDCG@10 0.0157 降到 0。这个组合说明小型 reward model 区分能力不足,策略对它发生了明显的 reward over-optimization;本地结果否定了当前 DPO 设置,而不是验证 IPA 收益。旧 heuristic NDCG +28.78% 已撤回。
结构化指标见 metrics/movielens-1m-seed42.json。完整运行:
pip install -e '.[neural-recs]'
AUTO_RESEARCH_ONEREC_CHECKPOINTS=runs/onerec-checkpoints/seed-42 \
auto-research reproduce --paper onerec --dataset-dir data --seed 42
数据、RQ-VAE、generator/reward checkpoint 和原始运行结果只保存在被 Git 忽略的 data/、runs/;MR 只提交代码、文档和脱敏指标。
