← 返回论文列表
📄 论文解读 · 生成式推荐 · 2025

COBRA

Unified Generative Recommendations with Cascaded Sparse-Dense Representations

机构
Baidu Inc.
来源
arXiv 2503.02453
年份
2025
核心命题
级联稀疏-稠密双表示生成式召回
💡
一句话总结

COBRA 在 TIGER 的基础上解决了生成式推荐「量化信息损失」的核心痛点,通过将 Sparse ID(RQ-VAE)和 Dense Vector(端到端可训练 Encoder)级联拼接作为输入,Decoder 先自回归生成 Sparse ID 再以其为条件生成 Dense Vector(粗到细两阶段),最终用 BeamFusion 融合 Beam Score 和 ANN 相似度,在百度广告 2 亿日活 A/B 测试中实现转化率 +3.60%、ARPU +4.15%。

📄 原文:https://arxiv.org/abs/2503.02453

🔗 前驱工作:TIGER(NeurIPS 2023)、LIGER(arXiv 2411.18814)

三句话核心贡献:
① 级联稀疏-稠密双表示:Sparse ID embedding 与 Dense Vector 拼接,一个序列同时携带粗粒度语义骨架和细粒度特征;
② 端到端 Dense Encoder:与 TIGER/LIGER 固定 embedding 不同,dense vector 通过推荐 loss 持续更新,融合协同过滤信号;
③ BeamFusion:跨 beam 候选用 Softmax 归一化 beam score 和 ANN 余弦相似度加权融合,兼顾精准率与多样性。
🌐
1. 背景与动机

推荐系统正在经历从「判别式召回」向「生成式召回」的范式转移。传统双塔模型为每个 item 计算独立 embedding,通过 ANN 检索;而生成式方法(以 TIGER 为代表)将 item 编码为离散 token 序列,用自回归生成直接预测下一个 item 的 token。

核心矛盾:现有生成式方法依赖 Residual Quantization 将 item 压缩为 Sparse Semantic ID(SID),但量化过程会不可避免地丢失细粒度语义信息。另一方面,纯 Dense 方法(如 RecFormer)虽然精度高,却无法利用 SID 的树状结构优势和语义共享能力。

现有方法的局限

生成式方法(TIGER 等)

  • 用 RQ-VAE 量化为 Sparse ID,语义信息被压缩
  • 仅靠 Sparse ID 无法区分同一 ID 下细粒度相似 item
  • 固定量化结果 = 静态嵌入,无法动态优化

Dense 方法(SASRec 等)

  • 每个 item 独立 embedding,无语义共享
  • 需要大规模 ANN 索引,效率低
  • 无法利用 item 文本语义结构

COBRA(Cascaded Organized Bi-Represented generAtive retrieval)将两种表示统一到一个生成式框架中:先生成 Sparse ID 提供粗粒度语义骨架,再以 Sparse ID 为条件生成 Dense Vector 提供细粒度精度,两者形成级联关系。

与 LIGER 的关键区别:LIGER 同时并行生成 SID 和 dense vector(同粒度),二者相互独立;COBRA 是级联生成(先 SID 后 dense),SID 的生成结果直接作为 dense vector 生成的条件,且 dense encoder 是端到端可训练的(LIGER 中 dense 表示是预训练固定的)。
⚙️
2. 方法详解

COBRA 的整体框架如下图所示。输入是用户历史交互序列中每个 item 的级联表示(Sparse ID embedding + Dense Vector 拼接),送入 Transformer Decoder 后,先预测下一个 item 的 Sparse ID,再以该 ID 为条件预测 Dense Vector。

COBRA整体架构图
Figure 2(论文原图):COBRA 的完整架构。底部是 RQ-VAE(稀疏 ID 生成)和 Transformer Encoder(稠密向量生成),输入序列由每个 item 的 (e_t, v_t) 级联表示组成,Decoder 先输出 SparseHead 预测 ID,再接收生成的 ID embedding 输出 Dense Vector。

2.1 稀疏表示(Sparse Representation via RQ-VAE)

稀疏语义 ID 由 Residual Quantized VAE(RQ-VAE)生成。具体步骤:

  1. 1
    提取 item 的文本描述(标题、价格、类目等),用 T5/BERT 编码为初始 dense embedding $\mathbf{e}_0$
  2. 2
    第一层 codebook:找距离最近的码字 $c_1$,记录 index $\text{ID}^{(1)}$,计算残差 $\mathbf{r}_1 = \mathbf{e}_0 - c_1$
  3. 3
    第二层 codebook:对残差 $\mathbf{r}_1$ 再次量化,得到 $\text{ID}^{(2)}$ 和 $\mathbf{r}_2$
  4. 4
    重复 $L$ 层,item 的最终 Sparse ID 为 $[\text{ID}^{(1)}, \text{ID}^{(2)}, \ldots, \text{ID}^{(L)}]$,每层 codebook 大小 32

论文默认使用 3 层($L=3$),codebook 大小 32,每个 item 得到形如 $[3, 7, 12]$ 的 3 token SID。共享前缀的 item 在语义上相近,Decoder 可通过 Beam Search 树状搜索高效枚举。

💡 举例:RQ-VAE 量化流程

假设商品 A 是"Nike 运动鞋(蓝色,男款)",商品 B 是"Nike 运动鞋(红色,男款)",商品 C 是"厨房刀具"。

经过 3 层 RQ-VAE:A 的 SID = [5, 2, 11],B 的 SID = [5, 2, 19],C 的 SID = [12, 7, 3]。

A 和 B 共享前缀 [5, 2],说明它们在前两层语义上非常相似(都是 Nike 男款鞋)。C 完全不同,属于另一个类目。Decoder 在 Beam Search 时,搜索到 [5, 2] 这个节点就能有效覆盖 A 和 B 这类相似 item,而不需要单独搜索每个 item。

2.2 稠密表示(Dense Representation via 端到端 Encoder)

与 TIGER 中固定的 item embedding 不同,COBRA 设计了一个端到端可训练的 Transformer Encoder,在整个推荐训练过程中持续优化 dense vector。

具体实现:item 的文本属性(标题、品牌、描述等)被展开为文本序列,前缀加 [CLS] token,送入 Transformer Encoder。Dense Vector $\mathbf{v}_t$ 取 [CLS] token 对应的输出向量,维度通常为 64 或 128。

此外,为了支持级联表示,模型还加入了位置 embedding(position embedding)和类型 embedding(type embedding),区分当前 token 在序列中的位置以及它是 ID token 还是 Dense token。

💡 举例:静态 vs 动态 Dense Vector

传统方法(如 TIGER / LIGER):item 的 dense embedding 在推荐训练开始前就已由单独的预训练模型固化。训练过程中这些 embedding 不会更新,无法感知用户行为分布。

COBRA:item 的 dense vector 通过端到端训练持续被推荐 loss 反向传播优化。随着训练进行,向量不仅能捕捉文本语义,还能融合协同过滤信号(哪些 item 经常一起被点击)。相当于给每个 item 配了一个"会随训练数据更新的语义指纹"。

2.3 级联表示(Cascaded Representation)

对每个 item $t$,将 Sparse ID embedding $\mathbf{e}_t = \text{Embed}(\text{ID}_t)$ 与 Dense Vector $\mathbf{v}_t$ 拼接,形成级联表示:

$$\mathbf{h}_t = [\mathbf{e}_t; \mathbf{v}_t]$$
符号说明
  • $\mathbf{e}_t$:第 $t$ 个 item 的 Sparse ID embedding,通过 Embedding Layer 查表得到
  • $\mathbf{v}_t$:第 $t$ 个 item 的 Dense Vector,由可训练 Encoder 生成
  • $[\cdot; \cdot]$:向量拼接操作
  • $\mathbf{h}_t$:item $t$ 的最终级联表示,维度 = $d_{id} + d_{dense}$

用户历史交互序列 $S_{1:t}$ 中的每个 item 都用 $\mathbf{h}_i$ 表示,整个序列展开为:$[\mathbf{e}_1, \mathbf{v}_1, \mathbf{e}_2, \mathbf{v}_2, \ldots, \mathbf{e}_t, \mathbf{v}_t]$,这是 Transformer Decoder 的输入。

关键设计直觉:Sparse ID 提供粗粒度的语义类别约束("这是什么类型的 item"),Dense Vector 提供细粒度的连续特征("这个 item 的具体特征是什么")。级联拼接让 Decoder 在每一步都能同时看到两种粒度的信息。

2.4 序列建模(Sequential Modeling)

COBRA 采用仅解码器(Decoder-only)的 Transformer 架构进行自回归序列建模(不同于 TIGER 使用的 encoder-decoder T5)。

Sparse ID 预测

给定历史序列 $\mathbf{S}_{1:t}$,Transformer Decoder 输出上下文向量:

$$\mathbf{y}_t = \text{TransformerDecoder}(\mathbf{S}_{1:t})$$ $$\mathbf{z}_{t+1} = \text{SparseHead}(\mathbf{y}_t)$$
符号说明
  • $\mathbf{S}_{1:t} = [\mathbf{e}_1, \mathbf{v}_1, \ldots, \mathbf{e}_t, \mathbf{v}_t]$:长度为 $2t$ 的级联序列
  • $\mathbf{y}_t$:Decoder 处理序列后输出的最后一个位置的隐向量
  • $\text{SparseHead}$:线性层,将 $\mathbf{y}_t$ 映射为所有 Sparse ID 上的 logits
  • $\mathbf{z}_{t+1}$:对下一个 item 的 Sparse ID 的预测 logits

Dense Vector 预测

预测完 Sparse ID 后,将其 embedding 追加到序列末尾,再次调用 Decoder 预测 Dense Vector:

$$\bar{\mathbf{S}}_{1:t} = [\mathbf{S}_{1:t}, \mathbf{e}_{t+1}]$$ $$\hat{\mathbf{v}}_{t+1} = \text{TransformerDecoder}(\bar{\mathbf{S}}_{1:t})$$
符号说明
  • $\mathbf{e}_{t+1}$:预测出的 $\text{ID}_{t+1}$ 对应的 embedding
  • $\bar{\mathbf{S}}_{1:t}$:追加了 $\mathbf{e}_{t+1}$ 后的扩展序列
  • $\hat{\mathbf{v}}_{t+1}$:预测出的 Dense Vector(与 ground truth $\mathbf{v}_{t+1}$ 对比计算 loss)
💡 举例:序列建模流程

假设用户历史:运动鞋(SID=[5,2,11], dense=[0.8,-0.3,...])→ 运动袜(SID=[5,3,7], dense=[0.6,0.1,...])→ 运动裤(SID=[5,3,9], dense=[0.7,-0.1,...])

第一步(Sparse ID 预测):Decoder 读入 6 个 token(3 个 item,每个 [e_id, v_dense]),输出 logits,最高概率的 SID 预测为 [5, 3, 12](运动上衣类)。

第二步(Dense Vector 预测):将 embed([5,3,12]) 追加到序列末尾,Decoder 再读入 7 个 token,输出细粒度 dense vector = [0.75, -0.15, ...],表示"偏向Nike品牌、蓝色系"的细粒度特征。

两步生成构成级联关系:Sparse ID 先给出"大方向",Dense Vector 再补充"细节"。

2.5 端到端训练(End-to-End Training)

COBRA 使用两个损失函数联合训练:

Sparse ID 预测损失(交叉熵)

$$\mathcal{L}_{\text{sparse}} = -\sum_{t=1}^{T-1}\log\left(\frac{\exp(z_{t+1}^{ID_{t+1}})}{\sum_{j=1}^{C}\exp(z_{t+1}^{j})}\right)$$
符号说明
  • $T$:历史序列长度
  • $\text{ID}_{t+1}$:第 $t+1$ 个 item 的真实 Sparse ID
  • $z_{t+1}^{\text{ID}_{t+1}}$:真实 ID 对应的 logit
  • $C$:所有 Sparse ID 的总数量(codebook 大小乘以层数展开)

Dense Vector 预测损失(In-Batch 对比学习)

$$\mathcal{L}_{\text{dense}} = -\sum_{t=1}^{T-1}\log\frac{\exp(\text{cos}(\hat{\mathbf{v}}_{t+1} \cdot \mathbf{v}_{t+1}))}{\sum_{item_j \in \text{Batch}}\exp(\text{cos}(\hat{\mathbf{v}}_{t+1}, \mathbf{v}_{item_j}))}$$
符号说明
  • $\hat{\mathbf{v}}_{t+1}$:Decoder 预测的 Dense Vector
  • $\mathbf{v}_{t+1}$:目标 item 的真实 Dense Vector(由 Encoder 生成)
  • $\mathbf{v}_{item_j}$:batch 内其他 item 的 Dense Vector,作为负样本
  • $\text{cos}(\cdot)$:余弦相似度

总损失:

$$\mathcal{L} = \mathcal{L}_{\text{sparse}} + \mathcal{L}_{\text{dense}}$$
为什么这样设计:$\mathcal{L}_{\text{sparse}}$ 让模型学会粗粒度的类别预测(哪个 SID 组);$\mathcal{L}_{\text{dense}}$ 通过对比学习让预测的 dense vector 在 embedding 空间中逼近正样本、远离负样本。两个 loss 同时反向传播,不仅更新 Decoder,也更新 dense Encoder——这是 COBRA 和 TIGER(固定 embedding)最本质的区别。

2.6 推理流程:粗到细生成(Coarse-to-Fine Generation)

COBRA 粗到细推理流程
Figure 3(论文原图):推理阶段的粗到细生成流程。M 个 Sparse ID 通过 Beam Search 获取,每个 ID 对应一次 Dense Vector 预测,最后通过 BeamFusion 将 beam score 和 ANN 相似度融合得到最终推荐列表。

推理流程分为两个阶段:

  1. 1
    Sparse ID 生成(粗粒度):用 Beam Search 在 Transformer Decoder 上生成 top-$M$ 个 Sparse ID 序列,每个序列对应一个候选类别。每个 ID 有对应的 beam score $\phi$(累积对数概率)。
  2. 2
    Dense Vector 生成(细粒度):将每个生成的 Sparse ID embedding 追加到历史序列末尾,再调用 Decoder 生成对应的 Dense Vector $\hat{\mathbf{v}}_{T+1}^k$。
  3. 3
    ANN 候选检索:对于每个 Sparse ID,在对应候选 item 子集 $\mathcal{C}(\hat{\text{ID}}_{T+1}^k)$ 中用 ANN 检索出最相似的 top-$N$ 个 item。
  4. 4
    BeamFusion 排序:用融合 beam score 和 ANN 相似度的综合分数 $\Phi$ 对所有候选排序,取 top-$K$ 作为最终推荐结果。

2.7 BeamFusion 机制

直接合并来自不同 Sparse ID 的候选 item 时,beam score 和 ANN 相似度处于不同量级,无法直接比较。BeamFusion 通过 Softmax 归一化解决这一问题:

$$\Phi^{(\hat{\mathbf{v}}_{T+1}^k, \hat{\text{ID}}_{T+1}^k, \mathbf{a})} = \text{Softmax}(\tau \phi_{\hat{\text{ID}}_{T+1}^k}) \times \text{Softmax}(\psi \cos(\hat{\mathbf{v}}_{T+1}^k, \mathbf{a}))$$
符号说明
  • $\mathbf{a}$:候选 item 的 dense vector
  • $\phi_{\hat{\text{ID}}_{T+1}^k}$:第 $k$ 条 Beam 路径的累积 beam score(越高越好)
  • $\tau$:beam score 的缩放系数(控制不同 SID 之间的区分度)
  • $\psi$:ANN 相似度的缩放系数
  • $\text{Softmax}(\tau \phi)$:将不同 SID 的 beam score 归一化,使得分布可比
  • $\text{Softmax}(\psi \cos)$:将同一 SID 下的 dense 相似度归一化
  • $\Phi$:两者乘积作为最终综合分数
💡 举例:BeamFusion 的必要性

假设 Beam Search 生成了两个 SID:SID_A=[5,2,11](beam score=0.92,对应"运动鞋"类),SID_B=[12,7,3](beam score=0.30,对应"厨房刀具"类)。

SID_A 下的候选 item(运动鞋)与 SID_B 下的候选(刀具)如果直接合并 ANN 分数比较,是不公平的——因为刀具的 dense 相似度可能偶然很高,但这个 SID 本身置信度很低(0.30 vs 0.92)。

BeamFusion 先对两个 SID 的 beam score 做 Softmax,SID_A 约占 95%,SID_B 约占 5%。再与各自 SID 下的 ANN 相似度 Softmax 结果相乘,最终 SID_A 下的候选综合分 ≈ 0.95 × cos_score,SID_B 下的候选综合分 ≈ 0.05 × cos_score。这样跨 SID 的 item 就可以公平比较了。

调低 τ 可以让不同 SID 的得分差距缩小,提升多样性;调高 τ 则更倾向于置信度最高的 SID,提升精准率。

📊
3. 实验结果

公开数据集(Amazon Product Reviews)

在 Beauty、Sports and Outdoors、Toys and Games 三个子集上与 TIGER、BERT4Rec、SASRec 等多个 baseline 对比:

数据集TIGER Recall@5COBRA Recall@5提升
Beauty0.04540.0537+18.3%
Sports & Outdoors0.02640.0305+15.5%
Toys & GamesRecall@10 +24.5%

工业数据集(Baidu 广告平台,500万用户 × 200万广告)

在 Recall@{50,100,200,500,800} 上与多个消融 baseline 对比:

  • COBRA vs COBRA w/o ID(移除 Sparse ID):Recall@800 提升 43.6%
  • COBRA vs COBRA w/o Dense(移除 Dense Vector,退化为 TIGER-like):Recall@500 提升 42.2%
  • COBRA vs COBRA w/o BeamFusion:Recall@800 提升 36.1%
COBRA余弦相似度矩阵 COBRA w/o ID 余弦相似度矩阵 差异矩阵
Figure 4(论文原图):广告 dense embedding 的余弦相似度矩阵。COBRA 的 intra-ID 聚集性和 inter-ID 分离性明显强于去掉 SID 的版本,说明稀疏 ID 有效引导了 dense vector 的结构化学习。

在线 A/B 测试(百度广告平台,1月份,10%流量)

  • 转化率提升:+3.60%
  • ARPU(每用户平均收入)提升:+4.15%

Recall-Diversity 权衡分析

通过调节 BeamFusion 中的系数 $\tau$,可以控制准确率和多样性的权衡。实验发现 $\tau = 0.9, \psi = 16$ 在 Recall@2000 和 Diversity 之间达到最优平衡。降低 $\tau$ 会提升多样性(更多不同 SID 的 item 被召回),升高 $\tau$ 则更集中在最高 beam score 的 SID,提升精准率但降低多样性。

💡
4. 个人理解与启发

核心亮点

  • 信息损失问题的优雅解决:通过级联生成(先 SID 后 Dense),COBRA 本质上是在"先找到大方向,再细化精度",符合人类推理的两阶段过程。
  • 动态 Dense Encoder 是关键创新:与 TIGER / LIGER 使用固定的预训练 embedding 不同,COBRA 的 dense encoder 被联合优化,让 dense vector 同时携带语义特征和协同过滤信号。
  • BeamFusion 解决了跨 beam 可比性问题:这是一个工程上非常实用的创新,直接影响线上多样性效果。

潜在不足

  • 推理时需要两次 Decoder 前向(先算 SID 再算 Dense),延迟比 TIGER 高,需要工程优化(如缓存、并行化)。
  • Dense Encoder 需要端到端训练,item 更新时需要重新计算所有 item 的 dense vector,更新成本高于静态 embedding 方法。
  • 超参数 $\tau, \psi$ 需要仔细调节,对不同业务场景可能需要重新搜索。

对我的启发

COBRA 提供了一个很好的思路:不同粒度的表示(粗粒度 ID + 细粒度 Dense)可以通过级联而非并行来互相增强。Sparse ID 给 Dense Vector 的生成提供了有效的先验条件,降低了学习难度——这个"条件生成"的思路值得在其他序列推荐场景中借鉴。

论文链接:arXiv 2503.02453

关键词:生成式推荐 · 级联稀疏-稠密表示 · RQ-VAE · BeamFusion · 端到端训练

对比基线:TIGER, LIGER, SASRec, RecFormer