MiniOneRec 论文解读:生成式推荐框架与代码分析
概述
MiniOneRec 是一个开源的生成式推荐框架,支持从 0.5B 到 7B 的模型扩展。核心流程包括 SID 构建(RQVAE)、SFT(0.5b~7b)以及 RL(受限解码 + 混合奖励)。实验表明模型规模越大效果越好,且将 SID 与文本对齐至关重要。
代码结构
主要入口文件位于 MiniOneRec/sft.py 和 MiniOneRec/rl.py。
SFT 原理
数据集
- SidSFTDataset: 输入用户最近交互 item 列表,预测下一个交互 item。
- SidItemFeatDataset: 执行 sid2title 或 title2sid 任务。
- FusionSeqRecDataset: 带意图识别的商品推荐。
训练细节
- 传入主干 LLM 即 base_model。
- SID token 被映射到普通 tokens 中,而非 special tokens。
- 可选择冻结 LLM 自带参数,仅训练新传入的 SID token embedding。
- 处理上述三种类型数据集并进行训练。
SID 索引扩展
SID 索引示例存储在 JSON 文件中,格式为 {index: [token_list]}。函数 get_new_tokens 返回 SID 的子 token 集合。注意代码逻辑可能读取所有实体的 SID token 集合,而非码本的实际利用集合,部分未见过的实体可能被分配至未使用的 SID 索引 token。
新 Token Embedding 训练策略
通过冻结所有参数并设置 embedding 层权重梯度,配合 hook 控制保留特定 token 的梯度。
print("Freezing LLM parameters, only training new token embeddings")
for param in model.parameters():
param.requires_grad = False
if sid_index_path and os.path.exists(sid_index_path) and new_tokens:
embedding_layer = model.get_input_embeddings()
if embedding_layer.weight.shape[0] > original_vocab_size:
embedding_layer.weight.requires_grad = True
def mask_grad(grad):
grad[:original_vocab_size].zero_()
return grad
embedding_layer.weight.register_hook(mask_grad)
print(f"Unfrozen {len(new_tokens)} new token embeddings (indices {original_vocab_size} to {len(tokenizer)-1})")
注意不能直接对张量切片设置 requires_grad 属性。
RL 优化
数据集
- SidDataset: 输入历史交互 item SID 序列,预测下一个 item SID。
- RLTitle2SidDataset: title2sid 和 description2sid 任务,返回 prompt-completion pairs。
- RLSeqTitle2SidDataset: 输入用户交互序列(带 title)预测下一个 item SID。
奖励模型
使用 SASRec 作为奖励模型基础。
建模框架
- Tokenizer: 使用 RQVAE。
- LLM-text 对齐: 利用 LLM 的世界知识。
- SFT next token prediction: 序列推荐任务。
- RL (GRPO): 强化学习优化。
任务定义
序列推荐任务。先分词:用户 u 的历史交互商品序列 Hu 通过 RQVAE 编码为 3 层 SID。后训练 LLM πθ,读取历史序列预测下一个商品。推理时使用 k beams search。
Item Tokenization
标准 RQVAE。为避免码本坍缩,使用第一个训练 batch 的 k-means 中心作为 codebook 初始化。代码中包含 Sinkhorn-Knopp algorithm 以缓解码本坍缩。
LLM 对齐
对齐 LLM 世界知识和 SID 信号。
- 任务一:序列推荐任务。
- 任务二:对齐 SID 和文本描述任务。 后续更新包含 GPR-inspired SFT with Value-Aware Fine-Tuning (VAFT),基于模拟物品价值加权损失,但尚未有实验结果验证效果。
可验证奖励强化学习 (RLVR)
- 混合动态采样: SID 空间小,容易采样重复 SID。最终采用 beam search 方法。
- 稀疏排序信号: 使用 NDCG 作为奖励,如果是正确商品分数再加 1。
训练配置
- 商品描述: Qwen3-Embedding-4B 编码。
- 分词器: RQVAE,单卡训练,batchsize=20480,lr=1e-3,epochs=10000。
- SFT: AdamW,Qwen2.5-Instruct。8 卡训练,单卡 batchsize=128, 10 epochs+early stop(patience=1),lr=3e-4,cosine decay。
- RL: GRPO,2epoch,KL 权重β不变=0.1,lr=1e-5,batchsize=512。
- 推理: beam search width=16。
评估指标
亚马逊数据集 Office+Industrial,使用 hitrate+NDCG 作为指标。
- Scaling: 训练 + 评估损失随模型增大而减小。
- Baseline 对比: LLM 系列和非 LLM 系列对比证明世界知识重要性;Ours 和 LLM 系列对比证明 RL 的重要性。
迁移性
SID pattern discovery 实验:在 Industrial 上训练在 Office 上评估。证明 RL 的有效性。未做 SFT 是因为 SFT 容易领域过拟合影响迁移。
消融实验
- Language-SID 重要性:
- 不做 Language-SID 对齐。
- 做 Language-SID 对齐,但不 SFT 推荐任务,只在 RL 上做推荐任务。
- SFT 只做推荐任务,RL 做 Language-SID 对齐。
- 采样策略:
- 直接 topk。
- 采 1.5 倍 budget+ 筛选。
- Beamsearch(效果最好)。
- 奖励设计:
- 01 奖励。
- SASRec 模型 logits(效果差,存在 reward hacking)。
- NDCG。
- 预训练: 预训练效果更好。
