B 站推荐算法秋招面经:生成式召回与多任务模型
- 轮次
- 秋招
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- SID 范式生成式召回对比传统召回有哪些优势,落地时这些优势能否兑现?
- SID 除了用作生成推荐的特殊 token,还有什么其他应用?
- 简述 RQ-VAE 整体流程、模块作用、损失函数与梯度传播逻辑。
- RQ-VAE 损失里的 stop gradient 项,代码上如何实现?
- 除 STE 之外,还有哪些方法解决梯度截断问题,说说 rotation trick。
- 介绍 SharedBottom、MMOE、PLE 这几类多任务模型的区别。
- MMOE、PLE 会出现专家坍缩,是什么原因,怎么解决?
- 多任务场景为什么选用 Focal Loss,而不是普通交叉熵?
- 召回阶段做多兴趣建模,多兴趣双塔训练时标签该如何设置?
- DIN 的注意力机制是怎样的,自注意力的时间、空间复杂度是多少?
《参考解析》
SID 生成式召回与传统召回的区别:传统召回是双塔 + 向量近邻检索(ANN),用户向量与物品向量点积排序,本质是”在连续空间里找最近邻”;生成式召回把物品先量化成离散的语义 ID(SID,通常由 RQ-VAE 这类残差量化模型产生),然后用自回归模型”生成”下一个物品的 ID 序列,把召回变成一个序列生成问题。理论优势在于:能建模物品之间的组合与转移关系(而不只是相似度)、可以做束搜索控制多样性、天然支持冷启动物品(只要有内容特征就能分配 ID)、并且和 LLM 式的生成框架统一。落地时的现实约束:自回归解码比 ANN 检索慢得多,要做受限解码和缓存;SID 的质量直接决定天花板,量化误差会损失细粒度信息;线上还要解决”生成的 ID 不存在 / 已下架”的合法性问题。所以”优势能否兑现”的诚实回答是:在序列依赖强、物品更新快的场景收益明显,但需要工程上把解码延迟和 ID 合法性管住,否则不如双塔稳。
RQ-VAE 与梯度传播:RQ-VAE 用多层 VQ(向量量化)做残差近似——第一层量化得到粗略的码本向量,计算残差,第二层再量化残差,如此叠几层(通常 3 层左右),最终物品被表示为一串码本索引,也就是 SID。每层都有码本和对应的重构损失,总损失是各层重构误差之和加上码本对齐损失。梯度传播的难点在”量化”这一步是不可导的(argmin 取最近码本),所以前向用量化后的向量、反向要绕过它。标准做法是 STE(直通估计):反向时把量化层的梯度原样传过去,相当于假装量化是恒等映射。stop gradient 项在代码里的实现就是 z_q = z + (z_q - z).detach()——前向等于 z_q,反向对 z 的梯度是 1(因为 (z_q - z) 被 detach 掉了),这正是”码本那边不接收梯度、编码器这边照常收梯度”的表达。
STE 之外的方法:一是 rotation trick,把量化看成旋转 / 正交变换,通过构造一个使梯度方向更合理的变换,让反向传播携带方向信息,而不是简单直通;二是 soft 量化 / softmax 松弛,用温度控制的 softmax 代替硬 argmin,训练后期再退火到硬量化;三是 Gumbel-Softmax,为离散采样提供可导的近似;四是 直通 + 辅助损失(如承诺损失 commitment loss)配合 EMA 更新码本,让码本自己向编码器输出靠拢,减少对梯度的依赖。工程上通常不是单选,而是 STE + EMA 码本更新 + 承诺损失的组合。
SharedBottom、MMOE、PLE 的区别:SharedBottom 是所有任务共享底层,顶层各自分头,结构最简省算力,但任务之间相关性弱时会出现负迁移(一个任务把共享层往自己的方向拽)。MMOE 用多个专家网络加一组 gate,每个任务有自己的 gate 来决定对各专家的加权,相当于给每个任务一条柔软的、可组合的子网络路径。PLE 在 MMOE 之上再做分层:除了任务专属专家,还有共享专家,且 gate 也分层(先按任务分组,再在组内与共享专家之间分配),从而进一步缓解任务间的冲突。演进逻辑是”共享的粒度越来越细、冲突隔离越来越显式”。
专家坍缩:表现为少数几个专家的 gate 权重长期接近 0,实际只有一两个专家在干活,模型退化成单塔。原因通常是:任务之间差异大而 gate 初始化不均衡、专家数量多于数据能支撑的容量、某个专家早期偶然占优后形成正反馈(越被选中越被训练,越强)、以及专家之间缺少差异性约束。解法包括:给 gate 加负载均衡损失或熵正则,鼓励权重分散;用更大的数据量与更充分的训练让专家分化;专家初始化做多样化;减少专家数量降低冗余;引入 dropout 或噪声增加探索;以及定期检查 gate 权重的分布作为监控指标。
Focal Loss 与多任务:Focal Loss 通过对易分样本降权((1-p)^γ 调制因子)把梯度集中到难样本上,在类别极不平衡时比交叉熵更有效。多任务场景用它的动机通常是主任务的标签极度不平衡(比如转化率是千分之几),普通交叉熵会被海量负样本淹没,模型学到的全是”预测不转化”。但要注意两点:它调的是样本难度权重,不是直接解决多任务之间的权重问题(那是 loss 加权、GradNorm、不确定性加权等方法的职责);γ 和 α 需要按数据分布调,调过头会让模型只盯难样本、忽略整体校准(预测概率不再反映真实概率),排序场景通常无妨,但需要对概率做校准的场景要谨慎。
多兴趣双塔的标签设置:单兴趣双塔是”用户一个向量 ↔ 物品一个向量”的正样本对;多兴趣建模要回答”这个正样本该归给哪个兴趣头”。常见做法有两种:按行为序列聚类——用用户历史行为聚类出多个兴趣簇,每个正样本分配给与其最接近的那个兴趣簇(离线聚类,簇心作为初始兴趣);注意力路由——让每个兴趣头自己去”认领”序列里与它相关的行为,训练时用类似多标签的监督,每个正样本与最匹配的兴趣头计算损失(其它头做负样本或不参与)。标签层面要注意:一个用户在同一时刻可能对多个兴趣都感兴趣,所以标签不是硬分配,而是软分配或 top-k 匹配;同时要防止所有头收敛到同一种兴趣(加多样性正则或做去重),以及保证每个头都有足够的正样本可学。
DIN 的注意力与复杂度:DIN 用注意力机制对用户历史行为做加权池化,权重由候选物品与历史行为的外积交互算出(而不是固定权重),从而表达”针对当前候选物品,历史里哪些行为更相关”。它的注意力本身是候选物品相关的,能捕捉局部激活的兴趣,也是”用户兴趣随候选变化”这一直觉的建模。复杂度上,DIN 的注意力是候选物品与历史序列两两交互的,若序列长度为 L、嵌入维度为 d,单次计算约 O(L·d);自注意力(如 Transformer 结构)则是序列内部两两交互,时间与空间复杂度都是 O(L²·d),序列越长开销增长越快——所以工业界做长序列建模时会用稀疏注意力、局部窗口或压缩记忆来把 L² 压下来。