RoFiGR: Coarse Routing, Fine Refinement via Level-Adaptive Distillation in Multimodal Generative Recommendation

Ji Dai, Zhipeng Wei, Zhuang Zhuang, Rongfeng Guo, Jie Chen, Quan Fang, Fei Pan · arXiv 2610.39470 · 发表 2026-10-29
14 分钟阅读时长 5387字 4.00综合分 第 4 名11-02 Generative 日报
目录 · 10 节1它到底在解决什么问题?2整体结构:三块改动3前两层码为什么要和协同 embedding 对齐?4老师怎么告诉学生每个分支该有多大概率?5学生到底学哪八个任务?6历史序列里怎么分清"哪个物品、哪一层"?7结果说明了什么8我认为它的局限9一个推荐团队可以怎么试10值不值得读
相关 4新颖 4实用 4证据 4时效 4

做生成式召回、尤其是用图文内容建 SID 的团队值得读。它把注意力放在 SID 最前面那一两个码上,因为后面所有的精细选择都要在前面的分支里进行。生成式推荐逐个码地生成物品的 SID,前几个码决定大方向。前面走错一个分支,后面再准也找不回相关物品。多模态推荐里这个问题更突出:SID 多按图文语义构建,前几个码未必反映哪些物品常被同一批用户购买。RoFiGR 在构建 SID 时就把前两层码向量和冻结的协同 embedding 对齐;生成时再用一个序列推荐模型当老师,在每一步告诉学生模型各个能对应到真实物品的分支该有多大概率。前几层固定给较大的蒸馏权重,其余权重看哪一层上老师比学生更看好正确的分支,就多分给哪一层。在三个亚马逊数据集上,五个排序指标都超过对比基线。把三个数据集、五个指标共 15 组结果平均,相对最强基线高约 9.4%。这个数字里有一部分来自更多的解码路数,后面会拆开看。

它到底在解决什么问题?

SID 生成在粗选和细化之间交替:前几个码选一个大分支,后几个码在分支里认出具体物品,下一个物品又从头开始选分支
SID 生成在粗选和细化之间交替:前几个码选一个大分支,后几个码在分支里认出具体物品,下一个物品又从头开始选分支

先看一个示意场景。一家乐器店的商品按图文语义建成 4 层 SID。第一层把商品分成 64 个大类,第二层再细分,第三、四层在细类里认出具体商品。某个用户最近买了电吉他和效果器,下一件真正会买的是一根吉他连接线。

示意第一层大类按图文语义按共同购买
电吉他弦乐器和木吉他、尤克里里相近常和效果器、连接线一起买
吉他连接线线材配件和麦克风线、音箱线相近常和电吉他、效果器一起买

按图文语义,连接线和电吉他落在两个不同的大类里。生成模型看了这段历史,第一步很可能选"弦乐器"这个大类,那么无论后面三个码多准,连接线都已经出局了。这就是论文说的粗选错误:前面的码决定了哪些商品还能被走到,beam 的预算又有限。

论文用 MACRec(一个分别建文本树和图像树的多模态生成式推荐)作基础,指出它的训练对四层一视同仁,都用同一个交叉熵。可是四层的难度和作用并不一样:第一层没有任何前缀,要在几十个大类里挑;第二层在大类里收窄;第三、四层只在很小的分支里认物品。RoFiGR 想在两个地方把协同信息加进来:建 SID 的时候,和生成的时候。

整体结构:三块改动

RoFiGR 总览:左边是建 SID 时把前两层码向量和冻结的协同 embedding 对齐;中间是一个 encoder-decoder 同时学八个任务,第一层 attention 额外知道每个 token 属于哪个物品、哪一层;右边是用老师的分支分布做逐层蒸馏,前两层有固定权重,其余按需求分配
RoFiGR 总览:左边是建 SID 时把前两层码向量和冻结的协同 embedding 对齐;中间是一个 encoder-decoder 同时学八个任务,第一层 attention 额外知道每个 token 属于哪个物品、哪一层;右边是用老师的分支分布做逐层蒸馏,前两层有固定权重,其余按需求分配

整个流程分两个阶段:

阶段做什么产出
离线准备训练一个多模态序列推荐模型 MISSRec 当老师并冻结每个物品一个协同 embedding;每段训练历史对全库物品的打分
建 SID文本树、图像树各自做残差量化,前两层对齐协同 embedding两棵冻结的 4 层 SID 树
训练生成器八个任务共用一个 encoder-decoder,加逐层蒸馏学生模型
线上推理四路 beam search 各自解码,结果按概率平均推荐列表,不调用老师

关键分工是:协同信息负责把前两层分好组,老师负责在每一步告诉学生分支之间谁更该选。下面拆开讲。

前两层码为什么要和协同 embedding 对齐?

MACRec 的 SID 按图文内容量化,前两层的大类反映的是"长得像、写得像"。RoFiGR 加了一个对比学习损失:把一个物品前两层选中的两个码向量相加,过一个线性投影,要求它和老师给的同一物品的协同 embedding 最接近,和同一 batch 里其他物品的协同 embedding 拉开。协同 embedding 是老师把物品的 ID、文本、图像三种表示各自归一化后相加得到的,里面带着"谁和谁常被一起买"的信息。

这个约束只加在前两层,后两层照旧只管图文细节。这样分工的理由很直接:前两层决定分支,需要反映购买行为;后两层负责在分支里区分具体商品,图文细节更有用。论文还试过对齐全部四层,效果更差。

效果可以在离散的树上直接看到。论文统计了行为近邻落在第一层同一个分支里的比例。行为近邻是在训练历史里相隔 1 到 3 个位置内经常一起出现的物品对,每个物品最多取 20 个。在乐器数据集的文本树上,不对齐时是 13.89%,对齐后是 31.87%。第一层的有效分支数仍超过 62 个(满分 64),而且没有空分支。有效分支数是按物品在各分支上的分布算熵、再取指数得到的:物品均匀分到 64 个分支时正好是 64,越挤向少数分支就越小。这说明对齐把行为相近的物品聚到了一起,但没有把所有物品挤进少数几个大类。

老师怎么告诉学生每个分支该有多大概率?

普通的 next-token 训练只告诉学生"正确的子分支是哪个",其他分支谁好谁差完全不提。RoFiGR 用老师补上这一块。老师是一个逐物品打分的序列推荐模型,它给每个物品一个分数。在训练时给定正确的前缀后,把每个合法子分支下所有物品的分数取指数加起来,再在合法子分支之间归一化,就得到老师眼中每个分支的概率。

举个例子,论文图里的示意:某一层有三个子分支,第一个分支下三个物品的概率是 0.30、0.21、0.06,第二个是 0.25、0.08,第三个是 0.10。加起来,三个分支的老师概率就是 0.57、0.33、0.10。学生在这一层的输出也只在这三个分支上做 softmax,损失是老师分布和学生分布之间的 KL。只有"能对应到真实物品"的合法分支参与,学生不会被要求给一个空分支分概率。

为什么还需要按层分配权重?四层都用同样的蒸馏权重,最难的第一层得不到额外照顾。RoFiGR 的权重分两部分。第一部分是固定的锚定权重,第一层 0.10、第二层 0.075、后两层 0,保证粗选从训练一开始就有老师信号。第二部分是一份总量 0.015 的浮动权重,按"需求"分给各层:每层的需求先做指数滑动平均,再取 1.5 次方,按各层所占比例分这 0.015。

需求的算法是:看正确子分支上,老师给的概率比学生高多少,再比"按物品数随便猜"高多少,两个差距都取对数,取较小的那个;小于 0 就记 0。举个手算的例子(示意):第一层上老师给正确分支 0.30,学生只给 0.10,这个分支物品数占比是 0.05,两个对数差约为 1.10 和 1.79,需求取 1.10。第三层上老师给 0.5,学生已经给到 0.6,需求就是 0。于是这份浮动权重几乎全给第一层,第一层的总权重约为 0.10 加 0.015。分母里还加了一个极小的常数,所以实际分出去的总量是 0.015 乘以"需求总和除以(需求总和加这个常数)":所有层的需求都接近 0 时,浮动部分也接近 0,只剩固定锚定权重;需求变大后,总量才逐渐接近 0.015。训练最初 1% 的步数里浮动部分不启用,等滑动平均先积累起来。取较小的差,是为了不在老师只是复述目录分布的地方浪费权重。

学生到底学哪八个任务?

学生是一个 T5 结构的 encoder-decoder,八个任务共用它,每个任务有自己的 soft prompt。其中六个沿用 MACRec:用文本码历史生成下一个物品的文本码、用图像码历史生成下一个图像码;用一种模态的历史生成另一种模态的下一个码(两个方向各一个);以及不看历史,把同一物品的文本码和图像码互相翻译(两个方向各一个)。RoFiGR 新加两个:历史里每个物品同时给出文本码和图像码,分别生成下一个物品的文本码和图像码。带历史的六个任务都加蒸馏,两个互译任务不加。

线上只用其中四个任务头各解码一路:文本历史生成文本码、图像历史生成图像码、双模态历史生成文本码、双模态历史生成图像码。每一路用受前缀树约束的 beam search(beam 20)生成完整的 4 个码,每个完整 SID 只对应一个物品,所以能直接换回物品 ID。每一路先在自己的候选里把物品概率归一化,再把四路的概率取平均,某一路没出现的物品在那一路记 0,最后按平均分排序。

历史序列里怎么分清"哪个物品、哪一层"?

每个历史物品有 4 个文本码和 4 个图像码,20 个物品展平后是一长串 token。只靠 token 距离,模型分不清两个相邻的 token 属于同一个物品,还是一个物品的末尾和下一个物品的开头。RoFiGR 在 encoder 第一层的 attention 上加了两个偏置:一个看两个 token 隔了几个物品,一个看被读取的 token 来自 SID 的哪一层。具体做法是每个注意力头各有两张可学习的小表:一张按物品间隔查一个数,间隔截在前后 19 个物品以内,共 39 档;另一张按被读取 token 的层号(4 层)和两者相隔的物品数查一个数,物品数分成 11 档:前后 2 个物品以内逐个分开,再远就合并成 3 到 4、5 到 8、9 及以上这样的大档。两个数和 T5 原有的 token 距离偏置一起加到这一对 SID token 的 attention 分数上,所以模型能分清物品边界,也知道信息来自哪一层。6 个头乘以(39 加 4 乘 11),一共 498 个参数,零初始化,decoder 不动。

结果说明了什么

三个数据集来自亚马逊评论,乐器、艺术用品、游戏,物品数在 6,250 到 13,839 之间,每个用户最后一次交互作测试,在全库上排序,五个随机种子取平均。下面是 NDCG@10:

数据集MACRecSynGRRoFiGR相对最强基线
乐器0.10230.11370.1208+6.245%
艺术用品0.09200.09920.1093+10.181%
游戏0.05640.05400.0642+13.830%

三个数据集上 HR@10 和 NDCG@10 对最强基线的提升,在五个种子的配对检验和多重比较校正后都显著。但要注意,主表里 RoFiGR 用四路解码,基线保留了各自原生的两路。

论文自己做了拆分,这张表更能说明问题(NDCG@10 乘 100):

训练任务 / 解码路数乐器艺术用品游戏
MACRec 8 个任务 / 两路10.3899.3695.699
RoFiGR 8 个任务 / 两路11.45410.3686.050
RoFiGR 8 个任务 / 四路12.08510.9286.425
RoFiGR 四路但候选截到 40 个11.52810.3226.029

同样八个任务、同样两路解码,RoFiGR 在乐器上比 MACRec 高约 1.07 个点,这反映了任务和解码都相同时 RoFiGR 整套改动的贡献,包括前两层对齐、结构注意力偏置和分支蒸馏。从两路换成四路又多了约 0.63 个点。但四路各用 beam 20 解码后,在融合前按每路自己的排名轮流挑,最多留 40 个不重复的物品,再在留下的物品上重新归一化、平均,结果和两路几乎一样,说明四路的收益有相当一部分依赖更大的候选集合。不过在同为 80 个 beam 位置的对照里,四路在三个数据集上仍都超过两路,所以候选数量和融合本身的贡献没有被完全分开。

消融:每一行是去掉或替换一个部件后,完整模型比它高多少个百分点(五个种子配对,带 95% 置信区间)。所有点都在 0 的右边,说明每个部件都有贡献;去掉老师和换成均匀目标时差距最大
消融:每一行是去掉或替换一个部件后,完整模型比它高多少个百分点(五个种子配对,带 95% 置信区间)。所有点都在 0 的右边,说明每个部件都有贡献;去掉老师和换成均匀目标时差距最大

消融里每个部件都有贡献。在乐器上,去掉分支老师、改成均匀分配合法分支概率、去掉前两层对齐,NDCG@10 掉得最多,在 0.9 到 1.0 个点左右。只去掉浮动权重,在验证集上 NDCG@10 下降约 6%。在艺术用品数据集上,文本树第一层码的贪心预测准确率从 MACRec 的 17.73% 升到 22.53%,说明收益确实落在粗选上。

我认为它的局限

第一,数据集很小。三个数据集最多一万多个物品、四万多个测试用户,第一层只有 64 个分支。工业目录动辄千万级,前两层的分组和这里差别很大,对齐是否还能让一起购买的物品聚到同一前缀,论文没有大规模实验。

第二,老师的缓存会随规模爆炸。蒸馏目标要预先存好每段训练历史对全库物品的打分,游戏数据集上全量 FP16 缓存就要 6.360 GiB,大小正比于历史条数乘物品数。论文试了只存老师分数最高的前 K 个物品的压缩办法:K 越大,缓存的分布离完整老师分布越近,但学生的排序效果并不随之单调变好,在 K=2000 处还出现了不单调的结果。

第三,主表的提升混着解码预算。四路解码在乐器上把平均延迟从 31.8 ms 提到 56.7 ms,而同等候选数下四路和两路几乎打平。只看主表的 9.4% 会高估方法本身。

一个推荐团队可以怎么试

  1. 先诊断粗选是不是瓶颈。在现有生成式召回上统计正确前缀在每一层 beam 里的存活率,如果大部分丢失发生在第一、二层,这篇的思路才值得试。
  2. 最便宜的一步是前两层对齐。用现有的协同 embedding 作目标,在 SID 训练里加一个只作用于前两层码向量之和的对比损失,先看"共同购买物品共享前缀"的比例有没有上升、有没有出现空分支。
  3. 有一个靠谱的序列推荐模型时,再加分支蒸馏。离线算好老师分数,先只在前两层加固定权重的 KL,再加按需求分配的浮动权重,比较每一步的增量。
  4. 评估时固定候选总数,比如都截到同样多个,避免把解码预算的收益算到方法头上。

值不值得读

生成式推荐的错误大多在前两层就已经犯下,把协同信息集中用在这里,比四层平均用力更划算。

维度评价
问题重要性高。粗选错误会直接让相关物品不可达,多模态 SID 尤其明显
方法创新性中。对齐、蒸馏都是已有工具,新意在只对齐前两层和按层需求分配蒸馏权重
实验证据中。对照做得很细,有配对检验;但只在三个小数据集上,主表混着解码预算
工程成本中。线上不调老师,但离线要训老师并缓存全库打分,规模大时存储压力明显
是否值得尝试前两层对齐值得先试;分支蒸馏要先确认粗选确实是瓶颈

读完这篇,你觉得

点一下即可,无需登录;再点一次撤回。只统计匿名次数,不记录你是谁。

相关论文RELATED

  1. Generative · 2026-10-27CoFiRec: Coarse-to-Fine Tokenization for Generative Recommendation用户在网上挑东西,通常是先看大类再挑具体商品,但大多数生成式推荐在编 Semantic ID 时,把物品的类目、标题、描述和协同信号揉成一个向量再量化,这种由粗到细的结构就丢了。UIUC 和 Meta 的这篇论文提出 CoFiRec,按类目、文本内容、协同信号分层,各层单独编码,再由粗到细地生成。在多个公开数据集和不同骨干模型上,按 Recall 和 NDCG 计算,它比最强的传统和生成式基线平均高 7.27%。冷门物品上的提升达到 10.0%,高于热门物品上的 4.7%。
  2. Generative · 2026-10-24Coarse-to-Fine Long-term Interest Modeling for Generative Recommendation生成式推荐一个码一个码地生成下一个物品的 Semantic ID,注意力计算量随序列长度平方增长,所以这类模型通常只吃最近几十条行为,用不上长期历史。GLASS 按 Semantic ID 的层级分开用长期历史。生成第一层码之前,它给每个一级码取该类物品向量的平均当原型。再把余弦相似度区间等分成若干档,统计长期历史里和原型的相似度落在每一档的物品数,所有一级码的计数拼起来经一个小网络压成一个兴趣 token 送进编码器;第一层码生成之后,拿它当检索键,从长期历史里取出同一大类的物品,辅助生成后两层码。在 TAOBAO-MM 上,R@1 比最强基线高 21.57%;短视频平台两周 A/B 中,召回率绝对提升 3 个百分点。
  3. Generative · 2026-10-23Controllable Generative Recommendation via Guided Token Refinement生成式推荐按左到右逐个生成物品 ID 的 token,推理时想临时提高多样性,只能中途改某一位,结果常拼出目录里不存在的 ID。ReGen 改用双向 Transformer 一次预测 ID 的全部 4 位,只在最粗的几位上给用户历史里常见的 token 值减分,再把置信度低的位遮住重新预测,并用全部合法 ID 建成的前缀树排除补不成真实物品的 token 值,全程不改模型参数。Amazon Instruments 上把 top-10 品类覆盖率从 0.41 提到 0.59,Recall@10 只从 0.0427 降到 0.0394,TIGER-MMR 同区间从 0.0433 掉到 0.0319;去掉前缀树后只有 27.63% 的 ID 对应真实物品。
  4. Generative · 2026-10-29KL-MOPD: Discrepancy-Aware Multi-Objective On-Policy Distillation for Generative Recommendation把点击老师和价值老师一起蒸馏进生成式推荐时,每个 token 平分权重并不公平:在 TencentGR 上,学生生成第 1 个 token 时离价值老师的 KL 是离点击老师的 3.13 倍,而且难学的老师在后两个 token 换成了点击老师。浙大和阿里的 KL-MOPD 在训练前算一次学生离两个老师的距离,每个 token 上离得更远的老师拿更大的权重,训练时没有额外开销。线上 A/B 中,广告收入提升 1.63%,说明点击和价值两个目标一起涨了。
  5. Generative · 2026-10-28MuSID-KD: Multigranularity Knowledge Distillation for Generative Recommendation with Semantic IDs把 SID 生成式推荐模型蒸馏成小模型时,通常只让学生对齐教师在最终推荐物品上的概率分布。华东师大的 MuSID-KD(一种按 SID 层级做多粒度蒸馏的方法)发现这样不够:只对齐物品分布的学生,在 SID 中间层给候选组排出的先后,平均有 53.8% 的比较和教师不一致。教师的知识不只在最后一层的物品概率里,也在每一层前缀的排序里。在三个 Amazon 数据集上,它的 NDCG@10 比基础蒸馏平均高 8.31%,线上推理结构完全不变。
  6. Generative · 2026-10-28SLIDE: Search-to-List Item Distillation for Single-Rollout Generative Retrieval生成式召回线上通常用束搜索出候选,各条束互不可见;想让模型一口气写出整张列表,最直接的贪心解码效果却差得多。淘宝的 SLIDE(一种把离线搜索结果蒸馏成列表的训练方法)把搜索挪到离线:教师对每个训练请求跑束搜索,把搜出的商品按得分拼成一条长序列,学生照着学,线上只贪心解码一遍。它把线上的搜索成本换成了离线的标注成本。教师用 7B 时,0.5B 学生的 HR@10 达到 0.4578,反超同尺寸模型束搜索的 0.4498。
  7. Generative · 2026-10-27Knowledge Distillation across Item and Code Spaces for Parallel Generative Recommendation用 Semantic ID 做生成式推荐时,训练只告诉模型下一个物品是哪一个,同一段历史下其他物品有多大可能,模型学不到。传统序列推荐模型能给出这种概率分布,但它给物品打分,生成模型却逐位预测编号,知识很难直接蒸馏过去。港科大等单位的这篇论文给并行生成模型设计了两种蒸馏:一种把学生的编号预测还原成全库物品分布再对齐老师,另一种把老师的物品概率摊到每个编号位上再对齐。平均来看,前者让 Recall@10 提升 15.39%,后者让 NDCG@10 提升 8.28%。
  8. Generative · 2026-10-29PailitaoMMSearch2.0 Technical Report: Scaling Generative Retrieval to Unified End-to-End Multimodal Search淘宝拍立淘里,用户拍一件衬衫再说「找条配它的短裤」,要的是搭配而不是同款。传统做法先分意图、再分发到不同召回通道,任何一步分错后面全错。阿里这篇技术报告让一个 2B 视觉语言模型直接读原图和原话,生成商品的 Semantic ID,不需要意图标签。优秀率指前 10 个结果里被评审模型判满分的比例。「找搭配」请求的这一指标从多路召回链路的 44.2% 提到 74.3%,线上 GMV 提升 8.94%,已全量上线。

讨论

欢迎补充实验细节、复现经验或不同看法。需 GitHub 登录。

正在加载讨论…