TIGER: Recommender Systems with Generative Retrieval

基本信息

字段 内容
标题 Recommender Systems with Generative Retrieval
作者 Shashank Rajput, Nikhil Mehta, Anima Singh, Raghunandan H. Keshavan, Trung Vu, Lukasz Heldt, Lichan Hong, Yi Tay, Vinh Q. Tran, Jonah Samost, Maciej Kula, Ed H. Chi, Maheswaran Sathiamoorthy
机构 Google
年份 2023 (NeurIPS’23)
方向 Generative Retrieval, Semantic ID, RQ-VAE, Seq2Seq Recommendation
场景 序列推荐的召回阶段: 用生成式解码取代基于 ANN 的双塔检索
arXiv https://arxiv.org/abs/2305.05065

TL;DR:传统召回是"学一张 item embedding 表 + ANN 近邻搜索"。TIGER,即 Transformer Index for GEnerative Recommenders,采用另一条路线:先用 RQ-VAE 将每个 item 的内容向量量化为一串有层级语义的离散码字,即 Semantic ID,形如 (12, 24, 52),语义相近的 item 共享前缀;再训练一个 T5 式 encoder-decoder,将用户历史展平为 token 序列,自回归地生成下一个 item 的 Semantic ID,beam search 直接输出 Top-K。它是第一个"基于 Semantic ID 的生成式推荐模型"。它将 NLP 的 DSI 可微检索索引范式迁移到推荐;实验规模为 1 万多 item 的 Amazon 子集与 13M 的小模型,面向工业级十亿物料、低延迟召回时,beam search 的算力、覆盖率、物料更新仍是待解决的问题,也是后续 OneRec 一类工作的研究方向。


一、动机:召回为什么要"生成"

现代推荐是经典的两阶段:召回 从百万/十亿物料中粗筛出几百至上千个候选,精排 再做细粒度排序。召回这一环节,主流做法是基于 embedding 的检索,即 EBR:

  1. 双塔模型将 user / item 各编码为一个稠密向量;
  2. 离线将所有 item embedding 写入一个 ANN 索引,如 ScaNN、FAISS、HNSW;
  3. 线上用 user 向量做最大内积搜索 MIPS,取 Top-K。

这套范式较为成熟,但作者指出了几个根本性问题:

  • item embedding 表随物料数线性膨胀:每个 item 一行 embedding,十亿物料就是十亿行,存储与更新开销大;长尾 item 交互稀疏,embedding 难以学好。
  • 召回质量受限于 ANN 的近似:MIPS 是近似搜索,且 user/item 表示一旦固定,召回就只能在这张固定的 embedding 表内进行。
  • 冷启动割裂:新 item 没有交互就缺乏可靠的 embedding,需依赖额外的冷启动机制补充。

作者的主张是:能否不要那张 embedding 表、也不要 ANN,直接让模型生成"下一个 item 是谁"? 这就是源自 NLP 的 生成式检索。它的前身是 Google 提出的 DSI,即 Differentiable Search Index:将整个文档库编码进 Transformer 参数,输入 query 直接解码出 doc id。

创新点,论文自述:

  1. 提出 Semantic ID: 用 RQ-VAE 将 item 内容向量量化为一串具有"从粗到细"层级的离散码字,作为 item 的新标识符;
  2. 训练一个 seq2seq Transformer 做 端到端生成式检索,自回归生成目标 item 的 Semantic ID,在多个数据集上超过当时 SOTA;
  3. 带来两个贡献:冷启动推荐可控的推荐多样性

其中最关键的一点是将"语义相似"编码为"ID 前缀相同"。一旦相似 item 在标识符空间里的表示也相近,模型在 token 级别上即获得了利于泛化的归纳偏置,这是随机 ID、哈希 ID 所不具备的。


二、问题形式化

给定用户的按时间排序的交互序列 (item1,item2,,itemn)(\text{item}_1, \text{item}_2, \dots, \text{item}_n),序列推荐要预测下一个 item itemn+1\text{item}_{n+1}

TIGER 将其拆为两步:

  1. Tokenization 语义量化:学一个函数将每个 item ii 映射为长度 mm 的离散码字元组,即 Semantic ID

itemi    (ci,0,ci,1,,ci,m1),ci,d{0,1,,K1}\text{item}_i \;\longmapsto\; (c_{i,0},\, c_{i,1},\, \dots,\, c_{i,m-1}), \qquad c_{i,d} \in \{0,1,\dots,K-1\}

其中 ci,dc_{i,d} 为第 ii 个 item 的第 dd 位码字,第一个下标 ii 为 item 编号,第二个下标 dd 为码字在元组中的位置,取值 0,1,,m10,1,\dots,m-1mm 为 Semantic ID 长度即码字级数;KK 为每一级码本所含码字个数,故每一位码字取自 {0,1,,K1}\{0,1,\dots,K-1\}

  1. Generative retrieval 自回归生成:将用户历史中每个 item 替换为它的 Semantic ID 并展平为一长串 token,训练模型最大化下一个 item 的 Semantic ID 的条件似然

P(cn+1,0,cn+1,1,,cn+1,m1c1,0,,c1,m1,  ,  cn,0,,cn,m1展平后的历史 token 序列)P\big(c_{n+1,0}, c_{n+1,1}, \dots, c_{n+1,m-1} \,\big|\, \underbrace{c_{1,0},\dots,c_{1,m-1},\;\dots,\;c_{n,0},\dots,c_{n,m-1}}_{\text{展平后的历史 token 序列}}\big)

其中 nn 为用户历史交互序列长度,cn+1,0,,cn+1,m1c_{n+1,0},\dots,c_{n+1,m-1} 为待预测的第 n+1n+1 个 item 的 mm 位码字,竖线右侧为前 nn 个 item 各自的码字按顺序展平拼接而成的条件 token 序列。按链式法则自回归分解。推理时对这个分布做 beam search,生成的码字元组再映射回 item,即为召回结果。

这里的关键是:item 不再是 embedding 表里的"一行",而是 一个固定小词表上 token 的组合K=256K=256m=4m=4 时,理论上 25644.3×109256^4 \approx 4.3 \times 10^9 个组合即可编码大量 item,而词表只有 256×4=1024256 \times 4 = 1024 个 token,参数不再随 item 数线性增长。


三、方法

整个 pipeline 分两阶段,先量化、后生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
内容特征(title / brand / price / category)
│ Sentence-T5 (768-d)

x ∈ R^768
│ RQ-VAE Encoder (512→256→128→32)

z ∈ R^32 ──────► 残差量化 m=3 层, 每层 codebook K=256, 码字维度 32


Semantic ID (c1, c2, c3) + 去重位 c4

─────────────── 阶段二 ───────────────

用户历史 item 序列 → 各自换成 (c1,c2,c3,c4) → 摊平
[user_tok, c1c2c3c4, c1c2c3c4, ... ]
│ T5 encoder-decoder (~13M params)

自回归生成下一个 item 的 (c1, c2, c3, c4)
│ beam search

Top-K 推荐 item

3.1 Semantic ID 是什么

Semantic ID 是一串有序的离散码字,核心性质是 语义相近的 item 共享前缀:第一个码字 c1c_1 决定粗类目,c2c_2c1c_1 之内细分,c3c_3 再细分,依此类推,可类比为一个学习得到的、从粗到细的层级"类目",前缀对应大区、后缀对应细分地址。例如论文中 Beauty 数据集上 c1=3c_1=3 几乎都是护发 Hair 类,c1=1c_1=1 多为彩妆、护肤 Makeup / Skin 类。

要得到这种层级码字,需先获得 item 的语义向量,再做残差量化

内容向量:作者用预训练的 Sentence-T5 把 item 的内容特征编码为 768 维 向量 xx,内容特征由标题、价格、品牌、类目拼接成一段文本。这一步保证了"内容相似 → 向量相近",是后续语义层级的来源。

这条技术路线的共识是 item 的"身份"应来自内容,而非一个随机分配的 ID 整数

3.2 RQ-VAE

image-20260621180658278

RQ-VAE 即 Residual-Quantized VAE,思想是 用多级码本做逐层逼近:先用一个码字粗略近似向量,再用下一级码本对"未被近似掉的残差"继续近似,逐级降低误差。其过程类似逐次逼近:第一级给出粗略近似,第二级补偿其残差,第三级再继续补偿。

具体流程如下,编码器记为 E\mathcal{E}、解码器记为 D\mathcal{D}m=3m=3 级,每级码本 Cd={ek(d)}k=0K1C_d=\{e_k^{(d)}\}_{k=0}^{K-1}K=256K=256,码字维度 32:

  1. 编码:z=E(x)z = \mathcal{E}(x),其中 E\mathcal{E}512 ⁣ ⁣256 ⁣ ⁣128512\!\to\!256\!\to\!128 接 ReLU、输出 32 维的 MLP;
  2. 初始残差 r0=zr_0 = z
  3. 对每一级 d=0,1,,m1d = 0,1,\dots,m-1:找最近码字、记下标、更新残差

cd=argmink  rdek(d)2,rd+1=rdecd(d)c_d = \arg\min_{k}\; \lVert r_d - e_k^{(d)} \rVert^2, \qquad r_{d+1} = r_d - e_{c_d}^{(d)}

其中 rdr_d 为进入第 dd 级时待量化的残差向量,ek(d)e_k^{(d)} 为第 dd 级码本中第 kk 个码字,上标 (d)(d) 表示码本所属级数,下标 kk 为该级码本内的码字编号;argmink\arg\min_k 在第 dd 级码本上取与残差最近的码字,所得下标 cdc_d 即该级选中的码字编号、也是 Semantic ID 的第 dd 位,ecd(d)e_{c_d}^{(d)} 为按该下标选出的码字;rd+1r_{d+1} 为减去本级码字后留给下一级的新残差。

  1. 量化后的表示是各级码字之和,再解码重建

z^=d=0m1ecd(d),x^=D(z^)\hat{z} = \sum_{d=0}^{m-1} e_{c_d}^{(d)}, \qquad \hat{x} = \mathcal{D}(\hat{z})

这串下标 (c0,c1,c2)(c_0, c_1, c_2) 就是这个 item 的 Semantic ID。

损失函数 采用 VQ 系列的标准形式,由重建项与量化项构成,量化项用 stop-gradient 让码本和编码器交替更新:

L(x)=Lrecon+Lrqvae\mathcal{L}(x) = \mathcal{L}_{\text{recon}} + \mathcal{L}_{\text{rqvae}}

Lrecon=xx^2,Lrqvae=d=0m1(sg[rd]ecd2+βrdsg[ecd]2)\mathcal{L}_{\text{recon}} = \lVert x - \hat{x} \rVert^2, \qquad \mathcal{L}_{\text{rqvae}} = \sum_{d=0}^{m-1} \Big( \big\lVert \operatorname{sg}[r_d] - e_{c_d} \big\rVert^2 + \beta \big\lVert r_d - \operatorname{sg}[e_{c_d}] \big\rVert^2 \Big)

其中 sg[]\operatorname{sg}[\cdot] 是 stop-gradient,β=0.25\beta=0.25。第一项把码本 ecde_{c_d} 拉向残差以更新码本,第二项是 commitment loss,把编码器输出拉向码本以更新编码器,argmin\arg\min 不可导的部分靠 straight-through 估计回传。

之所以采用"残差"量化,而非单级量化 VQ,是因为残差量化天然给出层级结构:第一级码字承载最多能量,对应粗类,后续各级为修正项,对应细分。这正是 Semantic ID "前缀=粗类、后缀=细分"性质的来源。若将其换成 LSH 这类无层级的哈希,实验中指标会明显下降,见后文。

3.3 RQ-VAE 的训练稳定性与设计选择

VQ 系列量化器有一个常见失效模式——码本坍缩(codebook collapse):训练中绝大多数输入只被映射到少数几个码字,其余码字始终不被选中(dead codeword),码本的有效容量远小于名义大小 KK,量化与重建精度随之劣化。TIGER 针对量化器训练做了几点处理:

  1. 用 k-means 初始化码本,以防止码本坍缩。 论文不对码本做随机初始化,而是在第一个训练 batch 上运行 k-means,将聚类中心作为各级码本的初始码字,使码字初始即落在数据的真实分布上,避免训练初期就退化到少数码字。这是论文明确给出的、针对码本坍缩的主要手段。
  2. 每级使用独立码本,而非共享单个 mKmK 大小的码本。 论文为 m=3m=3 级各配置一个大小为 KK 的独立码本。理由是残差范数随级数增加而减小:靠后的级处理的残差更小、更精细,需要与靠前的级不同的码字粒度,独立码本才能让每一级各自适配自身的数值尺度。
  3. 以码本使用率作为收敛判据。 量化器用 Adagrad 优化器,学习率 0.4、batch size 1024,训练约 20k 个 epoch,直至码本使用率达到 80%\geq 80\%,即至少八成码字被实际选用,以此作为"码本未坍缩、容量被充分利用"的标志。

两点补充:其一,重建损失对 argmin\arg\min 选码操作不可导,按 VQ-VAE 惯例用 straight-through estimator 将梯度从量化结果 z^\hat{z} 直接复制回编码器输出 zz;其二,论文未给出"有/无 k-means 初始化"的消融,故 k-means 对最终指标的具体增益只是定性结论。

3.4 去重位:SID 第四个 Token

RQ-VAE 只有 3 级码字,难免发生碰撞:两个不同 item 量化出同一个 (c1,c2,c3)(c_1,c_2,c_3)。TIGER 的处理较为直接:在末尾追加一位用于去重。例如两个 item 都落在 (12,24,52),则分别记为 (12,24,52,0)(12,24,52,1)

因此最终 Semantic ID 长度为 4:前 3 位来自 RQ-VAE,含语义;第 4 位是纯计数器,无语义。词表大小 256×4=1024256 \times 4 = 1024,每一位用各自独立的 256 段 token,使模型能区分"这是第几位"。

3.5 生成式检索:T5 将语料编码进参数

有了 Semantic ID,第二阶段即为一个纯序列到序列任务。模型用 T5X 框架的 encoder-decoder:

  • 输入序列 = 一个 user token + 用户历史中每个 item 展平后的 Semantic ID token。user token 用 哈希方法 将原始 user ID 映射到 2000 个 user token 之一,既控制词表规模,又引入有限的个性化信息(实际作用很小,见 §5.3 消融);
  • decoder 自回归生成下一个 item 的 4 个码字 (cn+1,0,,cn+1,3)(c_{n+1,0},\dots,c_{n+1,3})

架构超参:encoder、decoder 各 4 层,每层 6 个 attention head,head 维度 64,FFN 维度 1024,模型与输入维度 128,dropout 0.1,ReLU 激活,整模型约 13M 参数。词表 = 1024 个 item token + 2000 个 user token。

训练:Amazon Review Dataset Beauty、Sports 训 200k step,更小的 Toys 训 100k step;batch 256;学习率前 10k step 固定 0.01,之后 inverse-square-root 衰减;训练时每个用户的历史最多截取最近 20 个 item。

推理:对 decoder 做 beam search,生成的码字元组映射回 item 即 Top-K 召回。由于是在 256256-叉、深度 4 的码字树上搜索,beam search 直接给出排好序的候选,不需要 ANN 索引,也不需要 item embedding 表


四、为什么有效

综合来看,TIGER 的收益来自三个层面:

  1. 归纳偏置:语义相似 → 前缀相同。 随机、哈希 ID 下,item 标识符之间没有任何关系,模型只能依赖记忆;Semantic ID 让相似 item 在 token 空间中共享前缀,参数在相似 item 间被共享,长尾和稀疏 item 因此能借助同前缀热门 item 学到的模式。消融实验中将 RQ-VAE 换成 LSH 或随机 ID 后指标大幅下降,说明收益来自"语义层级"而非"生成"这一动作本身

  2. 参数不再随 item 数线性膨胀。 item 由固定 1024 词表的 4-token 组合表示,理论容量 256443256^4 \approx 43 亿,而需要学习的 token embedding 仅约一千个。相比"一个 item 一行 embedding",存储与更新负担得以解耦。

  3. 冷启动可自然支持。 新 item 不需要任何交互,仅凭内容经过 Sentence-T5 与 RQ-VAE 即可得到 Semantic ID;只要它与已知 item 共享 (c1,c2,c3)(c_1,c_2,c_3) 前缀,模型在生成该前缀时就有机会召回它,召回与冷启动被统一进同一套机制。

反过来看,这套范式的不足也正源于这三点:收益高度依赖 Sentence-T5 内容向量的质量,内容质量低则语义层级差;十亿物料下 beam search 的延迟与覆盖率未在本文验证;去重位与"生成不存在的 ID"说明 ID 空间和真实物料并非一一对齐。


五、实验

5.1 设置

  • 数据集:Amazon Product Reviews 三个子类目,过滤掉交互少于 5 的用户,按时间排序。
数据集 #用户 #item 平均序列长度
Beauty 22,363 12,101 8.87
Sports and Outdoors 35,598 18,357 8.32
Toys and Games 19,412 11,924 8.63
  • 协议:leave-one-out,每条序列最后一个 item 测试、倒数第二个验证、其余训练。
  • 指标:Recall@5、Recall@10、NDCG@5、NDCG@10。
  • Baseline:GRU4Rec、Caser、HGN、SASRec、BERT4Rec、FDSA、S³-Rec、P5。

5.2 主结果

TIGER 在三个数据集、四个指标上均取得最优,下表中加粗为最优。表中 Improv. 为相对当时最强 baseline 的提升,最强 baseline 多为 SASRec 或 S³-Rec:

Beauty

Method Recall@5 NDCG@5 Recall@10 NDCG@10
P5 0.0163 0.0107 0.0254 0.0136
Caser 0.0205 0.0131 0.0347 0.0176
HGN 0.0325 0.0206 0.0512 0.0266
GRU4Rec 0.0164 0.0099 0.0283 0.0137
BERT4Rec 0.0203 0.0124 0.0347 0.0170
FDSA 0.0267 0.0163 0.0407 0.0208
SASRec 0.0387 0.0249 0.0605 0.0318
S³-Rec 0.0387 0.0244 0.0647 0.0327
TIGER 0.0454 0.0321 0.0648 0.0384
Improv. +17.31% +29.04% +0.15% +17.43%

Sports and Outdoors

Method Recall@5 NDCG@5 Recall@10 NDCG@10
SASRec 0.0233 0.0154 0.0350 0.0192
S³-Rec 0.0251 0.0161 0.0385 0.0204
TIGER 0.0264 0.0181 0.0400 0.0225
Improv. +5.22% +12.55% +3.90% +10.29%

Toys and Games

Method Recall@5 NDCG@5 Recall@10 NDCG@10
SASRec 0.0463 0.0306 0.0675 0.0374
S³-Rec 0.0443 0.0294 0.0700 0.0376
TIGER 0.0521 0.0371 0.0712 0.0432
Improv. +12.53% +21.24% +1.71% +14.97%

实验发现:

  • 优势在于头部排序质量,而非召回数量。 提升集中在 Recall@5 与 NDCG,如 Beauty NDCG@5 +29%、Toys NDCG@5 +21%,而 Recall@10 的提升通常较小,Beauty 仅 +0.15%。这与生成式模型的特性一致:beam search 在头部给出数量少但置信度高的候选,靠前位置的排序质量高;放宽到 @10 时与强 baseline 的差距缩小。
  • 数据集语义可分性越强,收益越大。 Beauty 上语义层级清晰,分为护发、彩妆、护肤,TIGER 领先幅度最大;Sports 类目更混杂,提升相对较小。

5.3 消融:Semantic ID 的"语义"是关键

将 item 标识符的生成方式替换,其余不变,数据集为 Beauty、指标为 Recall@5:

Item ID 方案 Recall@5 相对 RQ-VAE
RQ-VAE Semantic ID 0.0454
LSH 局部敏感哈希 SID 0.0379 −16.6%
Random ID 随机分配 0.0296 −34.8%

随机 ID 下降约三成、无层级的 LSH 也下降一成多,收益主要来自 RQ-VAE 给出的语义层级,而非"使用生成模型"本身

user ID 的作用: ** 另一组消融对比是否加入 hash 后的 user token:去掉时 Beauty Recall@5 为 0.04458,加入后为 0.0454,几乎持平。这说明模型效果几乎全部来自内容语义与行为序列**,user ID 的贡献可忽略——也与它通过哈希把所有 user 压到仅 2000 个 token、只保留很粗的身份信息相符。

5.4 两个额外获得的新能力

冷启动推荐。 将测试集中 5% 的 item 从训练中完全移除,作为"新 item",RQ-VAE 量化器和 seq2seq 均未见过这些 item。做法是只用生成的前 3 位语义前缀 (c1,c2,c3)(c_1,c_2,c_3) 去匹配——把所有共享该前缀的 item(含未见过的新 item)一并纳入候选,再用一个超参数 ε\varepsilon 限制候选中未见 item 的最大占比。论文取 ε=0.1\varepsilon=0.1(且 ε0.1\varepsilon \geq 0.1 时结论均成立),TIGER 在各档 Recall@K 上稳定超过 Semantic_KNN(在语义向量空间中做最近邻的基线),说明召回与冷启动被统一进同一套机制。

可控多样性。 调高 decoder 的采样温度 TT,可直接增大推荐结果的类目多样性,下表用 Entropy@K 衡量(即对 top-K 预测 item 的真实类目分布求熵),越高越分散:

温度 TT Entropy@10 Entropy@20 Entropy@50
1.0 0.76 1.14 1.70
1.5 1.14 1.52 2.06
2.0 1.38 1.76 2.28

多样性调控在生成式框架中即为"调节采样温度",几乎零成本;在双塔加 ANN 中要做到这点往往需额外加入重排或打散策略。

5.5 生成式检索的固有代价:invalid ID

自回归生成可能产生一个语料中不存在的码字组合,即 invalid ID。论文实测:top-10 预测中 invalid 占比约 0.1%–1.6%,top-20 约 0.3%–6%。比例不算高,但确实是这条范式相比"在固定候选集中选取"的固有代价,值得强调的是,TIGER 本身并未做受限解码,而是直接自由解码、仅观测到 invalid 占比可忽略;若工程上要彻底杜绝,可改用受限解码,即仅在由合法 Semantic ID 构成的前缀树上做 beam search。


六、总结

TIGER 的核心贡献,不是"用大模型做推荐",而是给出了一套自洽的生成式召回范式:用 RQ-VAE 将 item 内容编码为具有从粗到细层级的 Semantic ID,再训练 seq2seq Transformer 自回归地生成下一个 item 的 ID。它将"召回质量、参数随物料膨胀、冷启动、多样性"四个问题纳入同一套框架,并在 Amazon 三个数据集上验证了语义层级而非生成动作本身是收益来源。

它的局限同样清晰:实验规模小,仅万级 item、13M 模型,去重位无语义、invalid ID,以及十亿物料下 beam search 的延迟与覆盖率未被回答。但作为"生成式推荐"这一方向的开创性工作,它带动了后续一批研究,如语义 ID 的更优量化、工业级生成式召回 OneRec,这是它的重要价值所在。

此外,作者自己明确列出的局限与未来方向也值得一并记住:

  • 依赖内容特征:框架假设每个 item 都有内容特征、且有可用的预训练内容编码器,纯 ID、无内容的场景不适用;
  • 物料更新代价高:新增 item 需要重训 RQ-VAE 并重新生成所有 item 的 Semantic ID,不像 ANN 那样增量加一行即可;
  • 推理成本:作者明确承认 beam search 自回归解码比 ANN / MIPS 更昂贵,并说明"优化推理效率不是本文目标";
  • 前缀匹配召回:把冷启动中用到的"前缀匹配"推广到常规召回有望进一步提升 recall/NDCG,作者将其列为 future work。

相关论文清单

论文 时间 链接 一句话核心
VQ-VAE 2017 https://arxiv.org/abs/1711.00937 离散码本量化的鼻祖,Semantic ID 的远祖
Sentence-T5 2021 https://arxiv.org/abs/2108.08877 TIGER 用来抽 item 内容向量的文本编码器
DSI 2022 https://arxiv.org/abs/2202.06991 生成式检索范式:把语料背进参数、直接生成 doc id
RQ-VAE (Image) 2022 https://arxiv.org/abs/2203.01941 残差量化的 VAE,TIGER 的量化器原型
P5 2022 https://arxiv.org/abs/2203.13366 把推荐统一成 text-to-text 语言任务
VQ-Rec 2022 https://arxiv.org/abs/2210.12316 推荐中用乘积量化 PQ 做 item 离散码的前作,可与 TIGER 的 RQ-VAE 对照