← 返回论文列表
论文解读

TIGER:用生成式检索重构推荐系统

Recommender Systems with Generative Retrieval · NeurIPS 2023

作者
Rajput, Mehta et al. · Google DeepMind
年份
2023 · NeurIPS
论文链接
核心命题
生成式检索 + Semantic ID

一句话总结

TIGER 把推荐系统的召回阶段从"向量查找最近邻"改造为"自回归生成下一个 item 的 Semantic ID",核心是用 RQ-VAE 为每个 item 分配一个有语义层级的离散 token 序列,从而让 Transformer 的记忆本身成为检索索引。

发表:NeurIPS 2023

原文:https://arxiv.org/abs/2305.05065

ar5iv 可读版:ar5iv.labs.arxiv.org/html/2305.05065

核心贡献:首次将生成式检索(Generative Retrieval)引入推荐系统,提出 Semantic ID 概念,并证明相比随机 ID 和 LSH,RQ-VAE 生成的语义分层 token 显著提升推荐性能与冷启动能力。

背景与动机

Figure 1: TIGER 框架概览
Figure 1:TIGER 框架概览。每个 item 由内容特征经 RQ-VAE 量化为 Semantic ID 元组(如 $(5,23,55)$)。给定用户历史 Semantic ID 序列,Transformer Encoder-Decoder 自回归生成下一个 item 的 Semantic ID,查表得到推荐结果。

传统推荐系统的召回阶段通常依赖双塔模型(Dual Encoder):用户 tower 和 item tower 各自输出 embedding,再用近似最近邻(ANN)检索候选集。这套范式经历了多年验证,但暗藏几个结构性问题:

  1. item ID 是随机符号:学到的 embedding 无法跨 item 共享知识,相似 item 只靠协同过滤隐式关联。
  2. 需要维护外部索引:每次 item 集合更新,都要重新构建 ANN 索引,工程成本高。
  3. 冷启动问题严重:新 item 没有历史,ANN 无法检索到它。
  4. 多样性控制困难:ANN 本质是找最相似,不容易调节结果的多样性。
TIGER 的直觉:如果 Transformer 已经能通过自回归"记住"大量知识,为什么不把 item 库直接存进 Transformer 的参数里,让它直接生成下一个要推荐的 item?

这和 NLP 中的生成式文档检索(DSI、NCI)思路一致,TIGER 是第一篇把这套范式搬进推荐系统的工作。

关键前提是:如果 item 的 ID 是随机的,生成模型无法利用 item 之间的语义关系。因此必须先构造一套有意义的 Semantic ID,让相似 item 有相近的 token,才能让生成模型真正发挥作用。

方法详解

TIGER 分两个阶段:先为每个 item 生成 Semantic ID,再在 Semantic ID 序列上训练 Seq2Seq 推荐模型。

Figure 2a: Semantic ID 生成流程
Figure 2b: Encoder-Decoder 结构
Figure 2:TIGER 的两个核心模块。左图:item 内容特征经 Sentence-T5 编码后,通过 RQ-VAE 残差量化为 Semantic ID;右图:Encoder-Decoder Transformer 接收用户历史 Semantic ID 序列,逐 token 自回归输出下一个 item 的 Semantic ID。

阶段一:Semantic ID 生成

给定 item 的内容特征(标题、描述、品类等),用预训练文本编码器(如 SentenceT5)生成 $d$ 维语义 embedding $\mathbf{x} \in \mathbb{R}^d$,再用 RQ-VAE 将其量化为长度 $m$ 的 codeword 元组 $(c_0, c_1, \ldots, c_{m-1})$,即该 item 的 Semantic ID。

核心要求:相似内容的 item 应有重叠的 Semantic ID。例如,Semantic ID 为 $(10, 21, 35)$ 的 item 应比 ID 为 $(10, 23, 32)$ 的 item 更接近 $(10, 21, 40)$。

RQ-VAE 量化原理

Figure 3: RQ-VAE 残差量化流程图
Figure 3:RQ-VAE 残差量化过程。DNN Encoder 的输出 $\mathbf{r}_0$ 依次在各层 codebook 中找最近向量,计算残差后传入下一层。三层量化后得到 Semantic ID $(7, 1, 4)$,对应各层 codebook 中被选中向量的索引。层数越低表示语义越粗,越高越细粒度。

Residual-Quantized VAE 用残差迭代量化生成层级 token。它由编码器、残差量化器、解码器三部分组成:

编码器将输入 $\mathbf{x}$ 映射为潜变量 $\mathbf{z} := \mathcal{E}(\mathbf{x})$,然后按以下方式逐层量化:

第 $d=0$ 层:初始残差 $\mathbf{r}_0 := \mathbf{z}$,从 codebook $\mathcal{C}_0 = \{\mathbf{e}_k\}_{k=1}^{K}$ 中找最近向量:

$$ c_0 = \arg\min_{k} \|\mathbf{r}_0 - \mathbf{e}_k\| $$
符号说明
  • $c_0$:第 0 层的 codeword 索引(即 Semantic ID 第一位)
  • $\mathbf{r}_0$:第 0 层的残差,等于编码器输出 $\mathbf{z}$
  • $\mathbf{e}_k$:codebook $\mathcal{C}_0$ 中的第 $k$ 个向量
  • $K$:codebook 大小(本文 $K=256$)
  • $\arg\min$:找使距离最小的索引 $k$

直觉:在第一层 codebook 里找和当前残差最近的向量,记录它的索引作为第一个语义 token。

第 $d=1$ 层:计算残差 $\mathbf{r}_1 := \mathbf{r}_0 - \mathbf{e}_{c_0}$,再重复上述过程找 $c_1$。依此类推,重复 $m$ 次得到 Semantic ID $(c_0, c_1, \ldots, c_{m-1})$。

训练 RQ-VAE 的损失:

$$ \mathcal{L}_{RQVAE}(\mathbf{x}) = \mathcal{L}_{recon} + \mathcal{L}_{rqvae} $$
符号说明
  • $\mathcal{L}_{recon} = \|\mathbf{x} - \hat{\mathbf{x}}\|^2$:重建损失,让解码器输出尽量还原原始 embedding $\mathbf{x}$
  • $\hat{\mathbf{x}}$:解码器以量化表示 $\hat{\mathbf{z}} = \sum_{d=0}^{m-1} \mathbf{e}_{c_d}$ 为输入,还原出的向量
  • $\mathcal{L}_{rqvae} = \sum_{d=0}^{m-1} \bigl(\|\mathrm{sg}[\mathbf{r}_d] - \mathbf{e}_{c_d}\|^2 + \beta\|\mathbf{r}_d - \mathrm{sg}[\mathbf{e}_{c_d}]\|^2\bigr)$:量化损失
  • $\mathrm{sg}[\cdot]$:stop-gradient 操作,阻断梯度流,使 codebook 向量和编码器分别独立收敛
  • $\beta$:平衡两个量化方向的超参数,论文取 $\beta = 0.25$

第一项让 codebook 向量往残差方向移动;第二项(带 $\beta$)让编码器输出往 codebook 向量移动,两者相互靠拢,但各自独立更新。

碰撞处理

当 codebook 大小和序列长度不足以区分所有 item 时,多个 item 可能映射到同一 Semantic ID(碰撞)。处理方式:在相同 $(c_0, c_1, c_2)$ 的 item 后面追加一个区分码,变成 $(c_0, c_1, c_2, 0)$、$(c_0, c_1, c_2, 1)$……保证唯一性。

阶段二:生成式检索

把用户历史 item 序列转换为 Semantic ID 序列,训练一个 Encoder-Decoder Transformer(基于 T5X)做 Seq2Seq:

  • 输入(Encoder):用户 ID token + 历史 item 的 Semantic ID 序列(展开为连续 token)
  • 目标(Decoder):下一个 item 的 Semantic ID

训练目标(标准 next-token prediction):

$$ \mathcal{L}_{TIGER} = -\sum_{j=0}^{m-1} \log P\bigl(c_{n+1,j} \mid c_{n+1,0},\ldots,c_{n+1,j-1},\; \text{context};\;\theta\bigr) $$
符号说明
  • $c_{n+1,j}$:第 $n+1$ 个(即下一个)item 的 Semantic ID 中第 $j$ 位 codeword
  • $c_{n+1,0},\ldots,c_{n+1,j-1}$:已生成的前 $j$ 位(自回归条件)
  • $\text{context}$:Encoder 编码的用户历史信息(用户 ID + 前 $n$ 个 item 的 Semantic ID 序列)
  • $\theta$:Transformer Encoder-Decoder 的参数
  • $m$:Semantic ID 长度(本文 $m=4$,前 3 位来自 RQ-VAE,第 4 位用于去碰撞)

这是标准的自回归语言模型目标,只不过生成的不是文字 token,而是 item 的 Semantic ID。Decoder 一次生成一个 codeword,生成完整 $(c_0, c_1, c_2, c_3)$ 后查表得到对应 item。

为什么能冷启动?RQ-VAE 对新 item 也能生成 Semantic ID(只需有内容特征),而相同前缀 $(c_0, c_1, c_2)$ 的新旧 item 被 TIGER 视为同类,可以"顺路"检索到新 item。

实验结果

主实验:TIGER vs SOTA 基线

在 Amazon 三个数据集(Beauty / Sports and Outdoors / Toys and Games)上与 GRU4Rec、SASRec、BERT4Rec、S3-Rec、P5 等对比:

数据集最强基线TIGER Recall@5TIGER NDCG@5vs 最强基线
BeautyS3-Rec (R@5=0.0387)0.04540.0321+17.3% (Recall), +29% (NDCG)
Sports & OutdoorsS3-Rec (R@5=0.0251)0.02640.0181+5.2% (Recall), +12.6% (NDCG)
Toys & GamesSASRec (R@5=0.0463)0.05210.0371+12.5% (Recall), +21.2% (NDCG)

消融实验:ID 类型对比

ID 类型Beauty Recall@5Beauty NDCG@5
Random ID0.02960.0205
LSH Semantic ID0.03790.0259
RQ-VAE Semantic ID0.04540.0321

Semantic ID 层级质量分析(Figure 4)

在 Amazon Beauty 数据集上,设置 RQ-VAE 为 3 层、codebook 大小为 4/16/256,可视化第一层 codeword $c_1$ 与品类的对应关系:

Figure 4a: Beauty 数据集各 item 按 c1 着色的品类分布
Figure 4b: 固定 c1 后 c2 的细粒度品类分布
Figure 4:Amazon Beauty 数据集上 RQ-VAE Semantic ID 的语义层级可视化。左图:整体 item 品类分布按第一层 codeword $c_1$ 着色,$c_1=3$ 对应 Hair,$c_1=1$ 对应 Makeup/Skin。右图:固定 $c_1$ 后,$c_2$ 进一步细分子品类,验证了"粗→细"的层级结构。

冷启动推荐(Figure 5)

模拟新 item:从训练集移除 5% 的测试 item(unseen items),RQ-VAE 对这些 item 也能生成 Semantic ID(纯靠内容),TIGER 通过前缀共享把新 item 纳入候选集。引入超参数 $\epsilon$(最多 $\epsilon$ 比例的候选为新 item):

Figure 5a: 冷启动 Recall@K vs K
Figure 5b: 冷启动 Recall@10 vs ε
Figure 5:冷启动推荐实验(Amazon Beauty)。左图:$\epsilon=0.1$ 时 TIGER vs Semantic_KNN 的 Recall@K 对比;右图:Recall@10 随 $\epsilon$(新 item 最大占比)变化。TIGER 在 $\epsilon \geq 0.1$ 的所有条件下全面超越 KNN 基线。

推荐多样性

通过调节 Decoder 的温度参数 $T$ 控制多样性。$T=1.0$ 时以精准为主,$T=2.0$ 时跨品类覆盖明显增大:

温度 TEntropy@10Entropy@20Entropy@50
T = 1.00.761.141.70
T = 1.51.141.522.06
T = 2.01.381.762.28

这是 ANN 难以做到的——ANN 只能通过后处理(如 MMR)做多样性,而 TIGER 可以在生成阶段通过温度采样在语义层级上控制多样性(高温时第一层 token 变化范围更大,直接跨品类)。

个人理解

TIGER 的真正创新点在哪里

  1. 把 Transformer 参数本身变成"索引":不需要单独的 embedding 表或 ANN 索引,模型推断时直接 beam search 出 Semantic ID 元组,再查表得 item。这在原理上消除了传统双塔的"离线索引 + 在线 ANN"两步走。
  2. Semantic ID 兼顾语义和层级:RQ-VAE 的残差量化天然产生粗粒度→细粒度的层级结构,既支持知识共享(相似 item 有共同前缀),又能区分个体(末位 codeword 唯一化)。
  3. 冷启动和多样性是自然涌现的能力:不需要专门设计冷启动模块,只是 Semantic ID 的前缀共享机制的副产物。

值得注意的局限

工业规模挑战

论文只在 1-2 万 item 的学术数据集上验证。工业场景 item 数亿,beam search 生成 Semantic ID 的延迟和 invalid ID 率是真实挑战。

只依赖内容特征

Semantic ID 完全来自内容 embedding,协同过滤信号没有进入 token 化过程,在行为驱动明显的场景可能次优。(SemID / TRM 论文正是解决了这个问题。)

碰撞处理有点粗糙

第 4 位只是顺序编号,没有语义含义,导致相似 item 的最后一位 token 完全无关,可能影响模型对末位 token 的学习。

RQ-VAE 需单独训练

两阶段训练(先 RQ-VAE,再 Seq2Seq)导致两个目标可能不完全一致,联合优化是后续工作的研究方向。

核心 takeaway:TIGER 的意义不只在于涨点,而在于提出了一个新的推荐系统范式:把 item 库"编码进" Transformer,用生成方式代替检索。这套思路在 LLM 时代有很强的延展性——SemID 把它用于排序,TRM 进一步引入协同信号和记忆 token。