目录 · 10 节
1它到底在解决什么问题?2整体流程3思考 token:一个读全部,一个读最近4嵌套 adapter 路径:给不同用户不同深度的修正5训练时怎么选路径,推理时怎么选路径6训练分三段7实验:涨了多少,涨在哪里8我认为它的局限9一个推荐团队可以怎么试10结论做 SID 生成式推荐的团队可以读一读,它在 TIGER 这类模型上补了两处很具体的短板,而且不改 SID 码表、共用同一个词表投影,也不加多套模型。第一处在生成之前:模型额外加两个“思考 token”,一个只读用户的全部历史,一个只读最近 5 件物品,这样最近冒出来的新兴趣不会被大量老行为盖住。第二处在生成的时候:解码器输出的向量在进入词表投影之前,先过一组深浅不同的小 adapter,每个用户只走其中一条,走哪条由模型在第一个 SID 位置的置信度决定。论文把整套方法叫 MV-Thinker。在 Amazon Instruments 数据上,以 LETTER(一种把协同信号也编进 SID 的生成式推荐模型)为底座时,H@5 从 0.0854 提到 0.0906,最强的对照方法是 0.0882。前 20 个推荐覆盖到的不同 SID,从 TIGER 的 19.56% 提到 25.50%。思考 token 管“看哪段历史”,adapter 路径管“怎么把看到的东西落到具体型号”。代价是三段式训练更繁琐。实验用的公开数据集平均历史只有 8 到 10 件物品,比线上短得多。
它到底在解决什么问题?
SID 生成式推荐有两个问题。第一个问题是最近的兴趣容易被整段历史稀释。
论文附录里有一个示意案例。一个用户早期互动的是吉他弦、背带和调音器,最近换成了电子鼓、鼓凳,又连着三次是 Zildjian 鼓槌。把整段历史放进一个序列,最近这几次容易被吉他记录稀释。TIGER 给这位用户推的第一名正是吉他调音器,真正的下一件鼓槌排在 20 名以外。完整的 MV-Thinker 推的第一名是 Zildjian 5B 木头头鼓槌,真正的下一件排第 3。
| 模型(论文附录表 5 的案例一) | 推荐的第一名 | 真正的下一件排第几 |
|---|---|---|
| TIGER | 吉他调音器 | 20 名以外 |
| 去掉分视角读历史模块(MVT)的版本 | 吉他弦 | 20 名以外 |
| 去掉 adapter 路径模块(HRA)的版本 | Zildjian 5A 鼓槌 | 第 6 |
| 完整 MV-Thinker | Zildjian 5B 木头头鼓槌 | 第 3 |
去掉 MVT(分视角读历史的模块)的版本仍然推吉他配件,这个案例提示,分视角读历史有助于认出最近转向鼓类的兴趣。去掉 HRA(adapter 路径模块)的版本找对了品类,却在相近型号里排得更靠后,这就引出第二个问题。两个模块的具体做法下面再讲。
第二个问题是所有用户共用同一套输出变换,它出在生成的最后一步。解码器在每个 SID 位置输出一个向量,再乘同一个词表投影矩阵得到下一个码的概率。所有用户共用这一套变换。可是有的用户只需要选对品类,有的用户需要在同一品类里分清细到弦的粗细这样的型号差别,共用一套变换很难同时照顾两类人。
整体流程

底座是一个 T5 式的 encoder–decoder,隐藏维度 128,4 层。一次推荐按下面的顺序走:
- 编码器读入用户历史里每件物品的 SID,输出每个位置的向量。
- 两个思考 token 分别从全部历史和最近 5 件物品里读信息,得到两个向量,放在解码器输入的最前面。这一步叫 MVT(Multi-View Temporal Thinking),每个用户只做一次。
- 解码器逐个生成 SID 的码。每个位置的输出向量先过一条 adapter 路径,再乘共用的词表投影。这一步叫 HRA(Hierarchical Residual Adaptation)。
- 用 beam search 生成,并限制每一步只能走到目录里真实存在的 SID 前缀,最后把 SID 映射回物品。
思考 token:一个读全部,一个读最近
思考 token 是两个新加的特殊 token,记作 <think_1> 和 <think_2>。它们不对应任何物品,各自的 embedding 是一个可学习的向量,所有用户共用。它们的作用是在生成 SID 之前,先从历史里把有用的信息汇总出来。
具体做法是:<think_1> 的 embedding 作为 query,用一个单独的 cross-attention 读编码器在全部历史上的输出;<think_2> 的 embedding 用另一个单独的 cross-attention,只读最近 件物品对应的编码器输出,论文取 。读到的结果乘一个可学习的缩放系数,加回原来的 embedding(下式省略了 LayerNorm):
这里 是思考 token 原来的 embedding, 是这个视角能看到的编码器输出, 是缩放系数。直觉上,query 本身对所有用户一样,读完之后的 才带上这个用户的信息。
为什么要两个独立的读取器?如果两个 token 共用一个,它们读出来的东西容易混在一起。如果把两段历史的编码直接拼起来,全部历史更长,又会压过最近几件。最近视角按整件物品截取,所以一件物品的几个 SID 码不会被截断一半。还要注意,编码器是在整段历史上算的,最近 5 件物品的输出向量本身已经带着前面历史的上下文。“只读最近”限制的是 <think_2> 能 attend 到哪些位置,不是让编码器只看这 5 件。
得到的两个向量排在解码器输入的开头,顺序是“起始 token、全部历史向量、最近历史向量、已经生成的 SID 码”。解码器之后每生成一个码,都能 attend 到这两个向量。原来的通路也保留着:解码器照常读取整段历史的编码结果,这两个向量是额外加进来的输入。
嵌套 adapter 路径:给不同用户不同深度的修正
HRA 准备了 4 个小 adapter,每个是先降维、过 GELU、再升回来的两层网络。为了让不同用户能拿到深浅不同的修正,它们串成 4 条路径:路径 1 只用第 1 个 adapter,路径 2 用第 1、2 个,路径 4 用全部 4 个。每过一个 adapter,就把它的输出乘一个固定的小系数 加回当前向量。最后把累计修正除以路径深度,所以深路径的修正不会比浅路径大太多。
举个能心算的例子(示意,系数取论文用的 )。解码器输出某一维是 1.0,路径 2 上第 1 个 adapter 给出 0.5,第 2 个给出 0.5。第一步得到 1.0 + 0.2×0.5 = 1.1,第二步得到 1.1 + 0.2×0.5 = 1.2。累计修正 0.2 再除以深度 2,最终是 1.1。
四条路径修正后的向量都乘同一个词表投影矩阵,所以它们预测的是同一套 SID 码,只是修正的深浅不同。和多专家模型比,这里深路径复用浅路径的 adapter,HRA 这一部分只多 4 个小 adapter。
训练时怎么选路径,推理时怎么选路径
这一节要分清训练和推理两个阶段,它们选路径的依据不一样。
训练时,模型能看到目标物品的 SID。对每个样本,4 条路径都在所有受监督的位置上算一遍交叉熵,这些位置主要是目标 SID 的各个码。损失越低的路径,被抽中的概率越高,概率是对负损失做 softmax(温度 1.0)。这组抽样概率本身不回传梯度。然后按这个概率抽一条,主要的交叉熵更新只来自这条路径的损失。论文把它叫“轮盘赌训练”。抽样而不是直接选最好的那条,是为了让每条路径都有机会被训练到。
抽中深路径时,前面那些浅 adapter 的输出照常参与计算,但不回传梯度。所以就交叉熵这一项来说,这条路径的 adapter 里只更新最后一个,底座或读取器仍照常更新。这样第 3 个 adapter 被训练时,不会把第 1 个 adapter 已经学好的修正改掉。为了防止训练早期总抽中少数几条路径,作者还加了一个均衡项。它把同样的负损失 softmax 重新算一遍,这一次保留梯度,再用这组概率算:一个 batch 里各路径的平均概率偏离 1/4 越多,惩罚越大。这一项的梯度会经过所有 4 条路径的损失,没被抽中的路径也会收到。但每条路径里前面 adapter 的输出同样不回传梯度,所以它在每条路径上能改的 adapter 也只有最后一个。
推理时没有目标 SID。模型在第一个 SID 位置把 4 条路径各算一遍,看每条路径给出的最高那个码的 log 概率,选最高的那条路径。之后这个用户剩下的码、beam search 里的所有分支,都固定走这条路径。只在第一个位置选一次,是因为每个位置都换路径,前后的修正会对不上;4 条路径各跑一遍完整 beam search 又太贵。 Hoot 说
示意数字。训练时 4 条路径按损失抽一条;推理时在第一个码按最高 log 概率挑一条,之后不再换。 出处: 论文 §3.3.2 轮盘赌训练、§3.3.3 按置信度推理;数字为示意
推理时选路径只用用户的历史和模型自己的置信度,碰不到真实的下一件物品。真实物品只在评测时用来算命中率。
训练分三段
作者没有一次把所有部件从头训起,而是分三段:
- 第 0 段:只训练普通的 encoder–decoder,用标准的逐 token 交叉熵学会从历史生成合法的 SID。
- 第 1 段:加入两个思考 token 和 HRA。两个思考 token 是新加的特殊 token,这一段模型也要像预测 SID 码一样,在它们的位置预测出这两个 token。底座、思考 token 和 adapter 一起更新。
- 第 2 段:加入两个视角各自的读取器,冻结底座。思考 token 不再计入损失,只更新读取器、思考 token 和 adapter。
冻结底座是为了不打乱第 0 段已经学好的 SID 生成能力。
实验:涨了多少,涨在哪里
评测用 Amazon 的 Instruments、Beauty、Games 三个品类和 Yelp。每个用户最后一次交互留作测试,倒数第二次做验证。评测时用真实的下一件物品算 H@K 和 N@K。对照组有两类。一类是 SASRec 这类判别式模型。另一类是在 TIGER 或 LETTER 底座上加近期的改进。其中两个改的是历史建模:CARE(生成前先对历史做几轮隐式推理)和 GEMs(把近期、中期、长期历史分成几路建模)。另外三个改的是生成过程:APAO(调整训练时对 SID 前缀的优化)、Latte(用隐 token 给每件物品多条解码路径)和 IBA(按信息量给不同 SID 位置分配计算步数)。
| 数据集与底座 | 底座 H@5 | 最强对照 H@5 | MV-Thinker H@5 | MV-Thinker N@5 |
|---|---|---|---|---|
| Instruments,TIGER | 0.0853 | 0.0875(APAO) | 0.0882 | 0.0751 |
| Instruments,LETTER | 0.0854 | 0.0882(GEMs) | 0.0906 | 0.0801 |
| Beauty,LETTER | 0.0379 | 0.0426(GEMs) | 0.0436 | 0.0291 |
| Yelp,TIGER | 0.0216 | 0.0247(CARE) | 0.0251 | 0.0163 |
MV-Thinker 在两个底座、四个数据集的所有指标上都最好。不过和最强的对照比,领先幅度很小,差别通常在小数点后第三位。最强的对照随数据集变化:在 Beauty 和 Games 上往往是改历史建模的 CARE、GEMs,在 Instruments 上往往是改生成过程的 APAO、Latte、IBA。MV-Thinker 对这两类改进都没输。
覆盖率的结果更有意思。作者在 Instruments 上把所有测试用户前 20 个推荐里出现过的不同 SID 合起来,TIGER 覆盖目录的 19.56%,以 TIGER 为底座的 MV-Thinker 覆盖 25.50%,同时命中率还更高。也就是说,它推荐得更散,但不是靠牺牲准确率换来的。
路径选择也确实因人而异。作者在 Beauty 上抽了 160 个测试用户,看推理时选中的深度。选最浅那条的最多,占 40.6%;选最深那条的最少,也有 15.0%。可见四条路径都被真正用上了,没有退化成所有人走同一条。

消融实验在 Instruments 和 Beauty 上做。去掉 MVT 或去掉 HRA,H@5 和 N@5 都会下降,但都还比 TIGER 好。去掉 HRA 时 H@5 掉得更多,去掉 MVT 时 N@5 掉得更多。只留全部历史比只留最近历史好,两者都不如合在一起。另外,作者还单独训练了只用一条固定深度路径的版本,深度 1 到 3 各训一个。在 Instruments 上,它们的 6 个指标都不如完整的嵌套路径,而且没有哪个固定深度在所有指标上都最好。
我认为它的局限
第一,绝对提升很小。Instruments 上以 TIGER 为底座,H@5 只比最强对照 APAO 多 0.0007。论文用三个随机种子取平均并做了显著性检验,但这个量级放到线上,未必能在 A/B 里看出来。
第二,数据集的历史都很短。四个数据集的平均历史长度只有 8.32 到 10.40,最近视角取 5 件物品,已经占了约一半的历史。新兴趣被老行为淹没的问题,在历史几百上千条的线上场景里才最严重,而四个数据集都远没有这么长。
第三,模型很小,训练链路变长了。底座只有 4 层、128 维,比线上常用的生成式推荐模型小得多,adapter 的收益在大模型上可能会变小。三段式训练也让训练流程更长,每一段要冻结什么、学习率多少,都要单独调。
一个推荐团队可以怎么试
- 先只加最近视角的思考 token:在现有 SID 生成模型的解码器开头加一个只读最近 N 件物品的 query,看兴趣刚转移的那批用户命中率有没有变化。这一步最便宜,也最能检验问题在你的数据上是否存在。
- 再加 HRA,但先离线统计路径分布。如果几乎所有用户都选同一条路径,说明你的场景不需要因人而异的修正,可以停在第 1 步。
- 两者都有收益时,再上三段式训练,并在冻结底座前后各存一个检查点,方便回滚。
- 线上同时看命中和覆盖。论文里覆盖率的提升比命中率明显,覆盖更广对冷门物品的曝光可能更有价值。
结论
把全部历史和最近几件物品分开读、再一起交给解码器,比只用其中一个视角更准。
| 维度 | 评价 |
|---|---|
| 问题重要性 | 中高。兴趣转移和同品类细分在推荐里很常见 |
| 方法创新性 | 中。两个部件分别借鉴了 latent thinking(先用可学习的查询向量读一遍历史、再生成,思考 token 就属于这一类)和 adapter,组合方式和路径选择规则是新的 |
| 实验证据 | 中。四个数据集、两个底座都赢,但领先幅度小,历史很短,都是离线公开数据 |
| 工程成本 | 中。加两个思考 token、两个 cross-attention 读取器和 4 个小 adapter,推理时在第一个位置多算 4 条路径;训练变成三段 |
| 是否值得尝试 | 值得先试最近视角那一半,成本低、可解释 |
读完这篇,你觉得
夜读鸮记下了,谢谢你的反馈。
点一下即可,无需登录;再点一次撤回。只统计匿名次数,不记录你是谁。
相关论文RELATED
Generative · 2026-07-13OneRec-Think: In-Text Reasoning for Generative Recommendation快手把 Semantic ID 加进 LLM 词表,先对齐物品 token,再教模型先写理由再给 ID,用束搜索里最好候选对上几位作 GRPO 奖励。线上离线生成推理和 ID 前两位,实时模型补最后一位,在 1.29% 的流量上,一周停留时长提高 0.159%。Beauty 上只微调 ID 的 Base 已在 R@5 上超过全部基线,公开数据上的推理是人工类目模板。
Generative · 2026-11-02RoFiGR: Coarse Routing, Fine Refinement via Level-Adaptive Distillation in Multimodal Generative Recommendation生成式推荐逐个码地生成物品的 SID,前两层码一旦选错大分支,后面再准也找不回相关物品;而多模态推荐里的 SID 多按图文语义构建,前几个码未必反映哪些物品常被同一批用户购买。这篇论文的 RoFiGR 因此把协同信息集中用在前两层码上。建 SID 时,它让每个物品前两层码向量之和,去贴近一个冻结的序列推荐模型(MISSRec)从用户行为里学到的同一物品的 embedding;生成时再用这个模型当老师:它给每个物品打分,一个分支下所有物品的概率加起来,就是这个分支该有的概率,学生每一步向它学。在三个亚马逊数据集上,五个排序指标(HR@10、NDCG@10 等)共 15 组比较全部领先,这 15 组相对最强基线的提升平均约 9.4%。
Generative · 2026-10-19Gryphon-v2: One Model in Place of a Cascade - Generate-and-Rank Recommender with Rollout Distillation推荐系统可以把召回与排序合并到一个模型里。Gryphon-v2 只编码一次用户历史,先生成 Semantic ID(物品的短编码),再用轻量排序头打分;教师只参与训练。Yandex Music 线上实验中,活跃用户数提升 1.41%。
Generative · 2026-10-27Unifying Behavior Modeling and Semantic Generation for Generative Recommendation用 Semantic ID 逐位生成下一个物品编号的生成式推荐,有一个系统性的偏向:华南理工大学这篇 KDD 2026 论文发现,用户历史里和目标物品同类的东西越少,它就越不如只看行为的老式序列推荐模型,最差的一组里 TIGER 的 NDCG@10 比 SASRec 低 30%。原因是编码器学的是下一个物品是谁,解码器要生成的却是编号。OMG 在两者之间加一个两层小网络,每一步把上一步的状态和编码器的最终状态相加再过一遍网络。每一步同时预测下一个物品和编号首位,后者的权重逐步加大,所有中间状态再一起交给解码器。只加这一个部件,各项指标平均涨 14.5%,计算量只多 0.16%。
讨论
欢迎补充实验细节、复现经验或不同看法。需 GitHub 登录。
正在加载讨论…