Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LongRetriever:超长序列用户兴趣建模与多路召回

Python 3.8+ PyTorch

推荐系统超长序列用户兴趣建模与多路召回框架,在 Amazon Books(308,949 物品全量检索)上完整验证了核心机制。


背景与动机

推荐系统中用户行为序列越来越长(终身历史可达数千条),传统方法(如 SASRec)通常截断序列或做粗粒度聚合,丢失细粒度兴趣信号。本项目针对超长序列召回场景,设计并验证了以下三个核心机制:

In-Context Training (ICT):训练时按兴趣类目过滤用户历史,让模型在单一兴趣上下文中学习用户表示。配合 ICTBatchSampler 保证 batch 内负样本来自同一类目,消除跨类目数据泄露(见实验发现 2)。

Pre-LN Transformer + CLS token:用 Pre-LN 让梯度通过残差路径直接回传,训练更稳定;用 CLS token 作为专用全局聚合器,无位置偏见。相比 Post-LN + 最后位置聚合,Recall@100 提升超 1000%(见架构对比)。

Multi-Context Retrieval (MCR):推理时为每个兴趣类目独立编码用户向量并分别检索,多路结果取最高分合并为最终 Top-K,相比单向量检索 Recall@500 提升 2.8%。


核心结果

Amazon Books · 308,949 物品全量检索 · Leave-one-out 评估 架构:Pre-LN Transformer + CLS token | 数据:用户≥10,商品≥3,序列均值=32

与 SASRec 外部基线对比

Amazon Books · 308,949 物品全量检索 · 同一数据集 · 同等超参(embedding_dim=128, 2层, 4头)

方法 序列处理 R@10 R@100 R@500 NDCG@10
SASRec(外部基线) 截断至 200,因果注意力,无 MCR 0.0009 0.0068 0.0290 0.0004
LongRetriever(本项目) 全历史 500,双向注意力 + Category MCR 0.0066 0.0352 0.0910 0.0030
  • R@10:0.0009 → 0.0066,提升 +633%
  • R@100:0.0068 → 0.0352,提升 +418%
  • R@500:0.0290 → 0.0910,提升 +214%

SASRec 训练 100ep 完全收敛(Val Loss 1.10→0.70),LongRetriever 30ep 即收敛(Val Loss 0.46),优势稳固。

消融实验(LongRetriever 内部)

实验 ICT BatchSampler MCR Recall@100 Recall@500 NDCG@50 NDCG@100
Full Model 0.0351 0.0878 0.0065 0.0085
w/o MCR 0.0349 0.0854 0.0064 0.0084
w/o BatchSampler 0.0345 0.0900 0.0065 0.0084
w/o ICT 0.0352 0.0910 0.0065 0.0085
Baseline 0.0345 0.0887 0.0064 0.0083

w/o ICT 的 R@100/500 略高于 Full Model,原因是 Amazon Books 仅 34 个粗粒度类目,类目过滤精度不足,ICT 净增益有限;预期在细粒度类目数据集(如 Electronics,100+ 类目)上效果更显著。

  • MCR:Full vs w/o MCR,R@500 +2.8%,NDCG@100 +1.2%
  • BatchSampler:去掉后 Val Loss 反而最低(0.4596)但指标最差,是数据泄露的直接证据(详见下文)

架构演进对比

架构 Recall@100 Recall@500 提升
SASRec(截断 200) 0.0068 0.0290 外部基线
Post-LN + 最后位置聚合 0.0031 0.0124 旧架构基线
Pre-LN + CLS token + MCR 0.0352 0.0910 vs SASRec: +5.2x / +3.1x

最终最优:Recall@100 = 3.52%,Recall@500 = 9.1%(新架构 + MCR,超过 SASRec 基线 5.2x)


系统架构

flowchart LR
    subgraph TRAIN ["(a) 训练"]
        direction TB
        t1["终身序列"] -->|"类目 c 过滤"| t2["子序列 s₁…sM"]
        t2 --> t3(["User Transformer\nPre-LN + CLS"])
        t3 --> t4(["用户向量 eᵤ"])
        tdb[("数据集")] --> t5["物品 v₁…vN\n强制同类目 c"]
        t5 --> t6(["Item Encoder"])
        t6 --> t7(["物品向量 ev"])
        t4 & t7 --> t8[["Contrastive Loss"]]
    end

    t1 ~~~ s1

    subgraph SERVE ["(b) 推理"]
        direction TB
        s1["用户请求"] --> s2["Interest Selection\nTop-k 类目 c₁…cₖ"]
        s2 -->|"各类目过滤"| s3["k 条子序列"]
        s3 --> s4(["User Encoder × k\n共享权重"])
        s4 --> s5(["k 个用户向量"])
        sdb[("物品库")] --> s6["按类目分库建索引"]
        s6 --> s7["k 路 ANN 检索"]
        s5 --> s7
        s7 --> s8[["合并 → Top-K"]]
    end

    classDef default fill:#f8fafc,stroke:#94a3b8,color:#334155
    classDef enc fill:#dbeafe,stroke:#60a5fa,color:#1e3a8a
    classDef vec fill:#e0f2fe,stroke:#38bdf8,color:#0c4a6e
    classDef out fill:#dcfce7,stroke:#4ade80,color:#14532d
    classDef db fill:#fef9c3,stroke:#fbbf24,color:#78350f
    class t3,t6,s4 enc
    class t4,t7,s5 vec
    class t8,s8 out
    class tdb,sdb db
Loading

快速开始

# 1. 安装依赖
pip install -r requirements.txt

# 2. 下载数据
python scripts/download_data.py --dataset amazon --category Books

# 3. 预处理
python src/data_loader.py --config configs/exp03/baseline.yaml

# 4. 训练
python src/train.py --config configs/exp03/baseline.yaml

# 5. 评估(开启 MCR)
python src/eval.py \
  --config configs/exp03/baseline.yaml \
  --checkpoint checkpoints/exp03_baseline/best_model.pt \
  --output results/exp03/my_result.json

关键实验发现

1. Pre-LN + CLS token 是决定性因素

改动 Recall@100 Recall@500 提升
Post-LN + 最后位置 0.0031 0.0124 基线
Pre-LN + CLS token 0.0345 0.0887 +1013% / +615%

原因:Pre-LN 让梯度通过残差路径直接回传,训练更稳定;CLS token 作为专用全局聚合器,无位置偏见。

2. ICT 数据泄露实验证明

无 ICTBatchSampler 时,batch 内负样本来自不同类目,模型靠类目偷懒:

配置 Val Loss Recall@10 结论
ict_filter_only(有泄露) 0.4596(最低) 0.0062(最差) Loss 虚低,学了假特征
ict_full(无泄露) 0.4748(最高) 0.0065 任务最难,学得最扎实
baseline 0.4624 0.0066(最好) 无泄露问题

"Val Loss 最低,Recall 最差" ← 数据泄露的教科书级证据

3. MCR 多路召回持续有效

开启 MCR 后三个模型均有提升,在召回层场景(R@500)尤为明显:

不开 MCR 开 MCR 提升
Recall@10 0.0065 0.0066 +1.5%
Recall@500 0.0887 0.0910 +2.6%

项目结构

longretriever/
├── src/
│   ├── model.py          # Pre-LN Transformer + CLS token 用户编码器
│   ├── train.py          # 训练脚本(含 ICTBatchSampler)
│   ├── eval.py           # 评估脚本(含 Category-based MCR)
│   ├── data_loader.py    # 数据预处理(含类目信息提取)
│   ├── sasrec.py         # SASRec 外部基线模型
│   ├── train_sasrec.py   # SASRec 训练脚本
│   └── eval_sasrec.py    # SASRec 评估脚本
├── configs/
│   ├── exp03/            # 当前最优实验配置
│   │   ├── baseline.yaml
│   │   ├── ict_filter_only.yaml
│   │   └── ict_full.yaml
│   └── sasrec.yaml       # SASRec 基线配置
├── scripts/
│   ├── download_data.py  # 数据下载脚本
│   ├── run.sh            # LongRetriever 运行脚本
│   └── run_sasrec.sh     # SASRec 基线运行脚本
├── results/              # 评估结果(JSON)
│   ├── exp01/            # 首次实验
│   ├── exp02b/           # MCR 修正后
│   ├── exp03/            # 当前最优(含 R@100/500)
│   └── sasrec/           # SASRec 基线结果
├── RESULTS.md            # 完整实验结果汇总
└── EXPERIMENTS.md        # 详细实验记录

依赖环境

Python >= 3.8 | PyTorch >= 2.0 | CUDA 12+
numpy · pandas · scikit-learn · tqdm · pyyaml · tensorboard · faiss-cpu
pip install -r requirements.txt

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages