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 余弦相似度加权融合,兼顾精准率与多样性。
推荐系统正在经历从「判别式召回」向「生成式召回」的范式转移。传统双塔模型为每个 item 计算独立 embedding,通过 ANN 检索;而生成式方法(以 TIGER 为代表)将 item 编码为离散 token 序列,用自回归生成直接预测下一个 item 的 token。
现有方法的局限
生成式方法(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 提供细粒度精度,两者形成级联关系。
COBRA 的整体框架如下图所示。输入是用户历史交互序列中每个 item 的级联表示(Sparse ID embedding + Dense Vector 拼接),送入 Transformer Decoder 后,先预测下一个 item 的 Sparse ID,再以该 ID 为条件预测 Dense Vector。
2.1 稀疏表示(Sparse Representation via RQ-VAE)
稀疏语义 ID 由 Residual Quantized VAE(RQ-VAE)生成。具体步骤:
- 1提取 item 的文本描述(标题、价格、类目等),用 T5/BERT 编码为初始 dense embedding $\mathbf{e}_0$
- 2第一层 codebook:找距离最近的码字 $c_1$,记录 index $\text{ID}^{(1)}$,计算残差 $\mathbf{r}_1 = \mathbf{e}_0 - c_1$
- 3第二层 codebook:对残差 $\mathbf{r}_1$ 再次量化,得到 $\text{ID}^{(2)}$ 和 $\mathbf{r}_2$
- 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 树状搜索高效枚举。
假设商品 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。
传统方法(如 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{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 的输入。
2.4 序列建模(Sequential Modeling)
COBRA 采用仅解码器(Decoder-only)的 Transformer 架构进行自回归序列建模(不同于 TIGER 使用的 encoder-decoder T5)。
Sparse ID 预测
给定历史序列 $\mathbf{S}_{1:t}$,Transformer Decoder 输出上下文向量:
- $\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:
- $\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 预测损失(交叉熵)
- $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 对比学习)
- $\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)$:余弦相似度
总损失:
2.6 推理流程:粗到细生成(Coarse-to-Fine Generation)
推理流程分为两个阶段:
-
1
Sparse ID 生成(粗粒度):用 Beam Search 在 Transformer Decoder 上生成 top-$M$ 个 Sparse ID 序列,每个序列对应一个候选类别。每个 ID 有对应的 beam score $\phi$(累积对数概率)。
-
2
Dense Vector 生成(细粒度):将每个生成的 Sparse ID embedding 追加到历史序列末尾,再调用 Decoder 生成对应的 Dense Vector $\hat{\mathbf{v}}_{T+1}^k$。
-
3
ANN 候选检索:对于每个 Sparse ID,在对应候选 item 子集 $\mathcal{C}(\hat{\text{ID}}_{T+1}^k)$ 中用 ANN 检索出最相似的 top-$N$ 个 item。
-
4
BeamFusion 排序:用融合 beam score 和 ANN 相似度的综合分数 $\Phi$ 对所有候选排序,取 top-$K$ 作为最终推荐结果。
2.7 BeamFusion 机制
直接合并来自不同 Sparse ID 的候选 item 时,beam score 和 ANN 相似度处于不同量级,无法直接比较。BeamFusion 通过 Softmax 归一化解决这一问题:
- $\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$:两者乘积作为最终综合分数
假设 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,提升精准率。
公开数据集(Amazon Product Reviews)
在 Beauty、Sports and Outdoors、Toys and Games 三个子集上与 TIGER、BERT4Rec、SASRec 等多个 baseline 对比:
| 数据集 | TIGER Recall@5 | COBRA Recall@5 | 提升 |
|---|---|---|---|
| Beauty | 0.0454 | 0.0537 | +18.3% |
| Sports & Outdoors | 0.0264 | 0.0305 | +15.5% |
| Toys & Games | — | — | Recall@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%
在线 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,提升精准率但降低多样性。
核心亮点
- 信息损失问题的优雅解决:通过级联生成(先 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