MDGR: Masked Diffusion Generative Recommendation
Alibaba International Digital Commerce Group × Wuhan University
把 SID 生成从「固定左到右的自回归」改成「掩码扩散去噪」:在 OPQ 并行码本上,从全 [MASK] 的 8 位 SID 出发,用双向注意力解码器按置信度自由选位、多步迭代填充,生成顺序不再写死。训练侧在时间维度用余弦课程调度逐步加大掩码个数,在样本维度按「目标 token 在用户历史中出现得越少越优先 mask」分配位置;推理侧先 4 步单位置 warm-up 锁定语义锚点,再每步并行填 2 位并配合 beam search 出 Top-B。工业集上比 RPG 提升约 10%,东南亚电商广告线上替换 TIGER 收入 +1.20%、GMV +3.69%。
核心思路
现有 SID 生成式推荐大致分两类。一类是 残差码本 + 自回归(TIGER),按层级从左到右逐个生成 token;另一类是 并行码本 + 单步解码(RPG),一次前向把所有位预测出来。作者认为两者都有问题:
- 自回归只能看左侧前缀,难以保证多个语义维度的全局一致;而且所有用户共用一条固定的解码路径,相当于假设大家都按同一顺序关注品类、品牌、价格等属性,这和用户兴趣的异质性相矛盾;同时需要 L 步串行,推理慢。
- 单步并行解码一次定终局,忽略了局部属性之间的细粒度约束,解码顺序同样与用户无关。
MDGR 的做法是把 SID 生成看成 掩码扩散的去噪过程:从全 [MASK] 的 SID 出发,双向注意力解码器每步挑置信度最高的若干位填上,多步迭代完成。这样同时满足三点:生成顺序随用户而变(顺序无关)、可以多步细化、每步可并行填多位。
直接套用通用 MDM 有两个问题:均匀随机 mask 不区分 SID 各位的难度;扩散模型只出一条序列,召回却需要 Top-B 候选。MDGR 针对这两点分别在训练和推理侧做了改造。
整体实现思路
整体分三块:
- 码本:用基于 OPQ 的并行码本代替残差码本。每位 token 落在独立子空间,没有层级依赖,因此可以按任意顺序 mask 和填充。
- 训练:encoder-decoder 架构,decoder 使用双向注意力。每个样本先由 全局课程噪声调度 决定 mask 几位(时间维度),再由 历史感知位置分配 决定 mask 哪几位(样本维度),同时加入难度 embedding
d_k,只在被 mask 的位置上计算交叉熵。 - 推理:从全
[MASK]开始,前R_warm步每步只填置信度最高的 1 位(warm-up),之后每步并行填m_par位,配合改造后的多位置 beam search 输出 Top-B 个 SID,再映射回商品。
整体可以看成每个语义维度独立的离散时间吸收态马尔可夫过程:每一位要么保持不变,要么以掩码率 alpha_{t,l}(u,i+) 被吸收到 [MASK]。这个掩码率没有显式参数化,而是由 P_time 和 P_pos 隐式决定。
子模块实现(可复现细节)
1. 并行码本(OPQ 式)
- 内容编码:用 Qwen3-8B 编码商品内容(标题、描述等),得到
e_i ∈ R^d。 - 子空间投影:
e_i^l = f_l(e_i) ∈ R^{d_l},其中f_l是线性层,l = 1..L。 - 量化:
c_i^l = argmin_j || e_i^l - C^l[j] ||^2,每个子空间各自取最近码字。 - 配置:L = 8 个码本,每个 300 个码字,码字维度 256,每个商品得到 8 位 SID。
2. 编码器 / 解码器骨架
- Encoder:6 层 Transformer,hidden 256,8 头,输入用户点击序列(以 SID 表示)。
- Decoder:把因果自注意力换成 双向自注意力,通过 cross-attention 读取 encoder 输出;输入为部分被 mask 的目标 SID 加上位置信息。
- 训练环境:分布式 PyTorch,2 个 PS 和 10 个 worker,每个 worker 一张 A100。
3. 时间维度:全局课程噪声调度
- 训练进度:
tau = min(1, n/N)。 - 难度标量:
delta = ( sqrt(1 - cos^2(pi/2 · (1 - tau))) )^gamma,gamma控制delta从 1 降到 0 的快慢,默认 gamma = 2.0。 - mask 个数打分:
s(k) = (1 - delta)·f_high(k) + delta·f_low(k),k = 1..L。实际使用线性函数f_low(k) = L + 1 - k、f_high(k) = k。 - 归一化:
P_time(k) = s(k) / Σ_j s(j),每个样本采样k ~ P_time。 - 效果(论文图 3b,gamma=2):k=1 的概率从训练初期的 0.22 逐渐降到 0.05,k=8 的概率从 0.04 升到 0.21,训练从易逐步过渡到难。
- 难度 embedding:把 k 当作离散索引,从可学习表
D ∈ R^{L×D}中取d_k,加到 decoder 每个输入 token embedding 上,让模型知道当前噪声强度。推理时初始用d_(L)。
4. 样本维度:历史感知 mask 位置分配
- 对目标 SID 的每一位 l,统计用户历史中同一位 token 相同的次数:
f^l = #{ j ∈ s_u | c_j^l = c_{i+}^l }。 - 权重取频次倒数:
w^l = 1 / (f^l + eps),归一化后得到P_pos^l = w^l / Σ_m w^m。 - 按
P_pos采样 k 个位置构成 M,将这些位置替换为共享的[MASK],其余位置保留原 token。 - 直观理解:用户历史里少见的属性更难预测,就更常被遮住,监督集中在难的维度上。
5. 训练目标
L = E_{(u,i+)} E_{k~P_time} E_{M~P_pos(·|k,u,i+)} [ - Σ_{l∈M} log p_θ( c_{i+}^l | c̃_{i+}, s_u, d_k ) ]
只在被 mask 的位置上计算标准交叉熵。复杂度与同规模 AR 一样是 O(H·L^2·d),两个调度只增加 O(L) 的采样开销。
6. 推理:warm-up 两阶段位置调度
- 第 r 步更新的位数:
m = 1(r < R_warm),否则m = m_par(m_par > 1)。 - 总步数:
R = R_warm + (L - R_warm) / m_par。默认 R_warm = 4、m_par = 2,8 位 SID 共 6 步。 - warm-up 阶段先锁定最有把握的语义锚点,避免在全噪声状态下一次填多位导致早期出错。
7. 置信度选位
- 对每条 beam 的未填位置 l,计算
conf(l) = max_c p_θ(x^l = c | x^(r), s_u, d^(r))。 - 取置信度最高的 m 个位置组成
S^(r)。选位不受左到右限制,每条路径的顺序可以不同。
8. 多位置 beam search
- 每条 beam b 在每个被选位置 l 上保留 Top-B 候选 token 及其概率。
- 对 m 个位置做笛卡尔组合,每条 beam 展开为
B^m条,得分为v + Σ_k log p̃。 - 汇总所有候选后取 Top-B 进入下一步,B = 50。所有位置填满后停止,用离线构建的码本索引把 SID 映射回商品集合。
- 推理复杂度:AR 为
O(B·H·L^3·d),并行 GR 为O(B·H·L^2·d),MDGR 为O(R·B·H·L^2·d),约为 AR 的R/L。
实验设置与结果
数据集
| 数据集 | 用户 | 商品 | 交互 | 备注 |
|---|---|---|---|---|
| Amazon Electronics | ~250K | ~90K | 2.1M | 过滤交互少于 5 的用户,序列截断 20,leave-one-out |
| Amazon Books | ~110K | ~180K | 3.1M | 同上 |
| 工业集(东南亚电商) | 18M | 25M | >1B | 2025 年 5-12 月,平均序列长度 128,含点击和转化,多模态内容 |
基线:ID 判别式(SASRec、BERT4Rec、S3Rec、PinnerFormer、HeterRec、DiffuRec、VQ-Rec),SID 生成式(TIGER、Cobra、RPG)。
主结果(表 2,摘录)
| 方法 | Elec R@10 | Elec N@10 | Books R@10 | Books N@10 | 工业 R@5 | 工业 N@5 | 工业 R@10 | 工业 N@10 |
|---|---|---|---|---|---|---|---|---|
| SASRec | 0.0490 | 0.0309 | 0.0697 | 0.0391 | 0.1413 | 0.0909 | 0.1695 | 0.1080 |
| HeterRec | 0.0510 | 0.0319 | 0.0712 | 0.0398 | 0.1592 | 0.1014 | 0.1890 | 0.1208 |
| DiffuRec | 0.0507 | 0.0317 | 0.0722 | 0.0403 | 0.1586 | 0.1013 | 0.1889 | 0.1207 |
| TIGER | 0.0524 | 0.0324 | 0.0731 | 0.0408 | 0.1620 | 0.1049 | 0.1943 | 0.1244 |
| Cobra | 0.0544 | 0.0338 | 0.0763 | 0.0426 | 0.1659 | 0.1059 | 0.1996 | 0.1285 |
| RPG | 0.0543 | 0.0339 | 0.0762 | 0.0427 | 0.1679 | 0.1076 | 0.2018 | 0.1296 |
| MDGR | 0.0583 | 0.0367 | 0.0826 | 0.0463 | 0.1856 | 0.1192 | 0.2210 | 0.1422 |
| Improv. | +7.17% | +8.26% | +8.26% | +8.43% | +10.45% | +10.78% | +9.54% | +9.72% |
Electronics 上 R@5/N@5 为 0.0394/0.0258(+9.75%/+8.86%),Books 上为 0.0631/0.0361(+8.61%/+8.73%)。
效率与效果权衡(表 3,工业集)
| R_warm | m_par | 总步数 | R@10 | QPS | QPS 提升 |
|---|---|---|---|---|---|
| 0 | 1 | 8 | 0.2219 | 2.212 | 基线(逐位解码) |
| 0 | 2 | 4 | 0.2127 | 3.015 | +36.30% |
| 2 | 2 | 5 | 0.2199 | 2.741 | +23.92% |
| 4 | 2 | 6 | 0.2210 | 2.527 | +14.24% |
| 6 | 2 | 7 | 0.2213 | 2.365 | +6.92% |
| 4 | 3 | 6 | 0.2205 | 2.526 | +14.19% |
| 4 | 4 | 5 | 0.2204 | 2.739 | +23.82% |
不做 warm-up 时 R@10 掉 4.15%;R_warm 取 4 到 6 时基本追平逐位解码。
消融(表 4,工业集)
| 设置 | R@5 | 变化 | N@5 | 变化 |
|---|---|---|---|---|
| MDGR | 0.1856 | – | 0.1192 | – |
| 码本换 RQ-VAE | 0.1829 | -1.46% | 0.1175 | -1.43% |
| 码本换 RQ-KMeans | 0.1830 | -1.40% | 0.1176 | -1.34% |
| Random quantity(去课程调度) | 0.1831 | -1.35% | 0.1179 | -1.09% |
| Random positions(随机位置) | 0.1822 | -1.83% | 0.1168 | -2.01% |
| Vanilla mask(标准 MDM) | 0.1792 | -3.45% | 0.1154 | -3.19% |
| w/o d_k | 0.1837 | -1.02% | 0.1179 | -1.09% |
| w/o confidence(随机选位) | 0.1820 | -1.94% | 0.1170 | -1.85% |
gamma 敏感性:gamma 取 0.5 到 1.0 时课程过激,取 2.5 到 3.0 时过缓,两端都变差,gamma=2 在四个指标上都最好。
线上 A/B
东南亚头部电商的广告推荐平台,2026-01-05 至 01-12,对照组为线上的 TIGER,实验组和对照组各占 20% 用户:广告收入 +1.20%,GMV +3.69%,CTR +2.36%(双侧检验 p<0.05)。
思考与可参考价值
值得借鉴的地方
- 历史频次反比 mask 是这篇最容易迁移的技巧。它对目标 SID 中「与历史重复的属性」降权、对「新属性」加权,等于在训练信号上对抗模型抄写历史。任何多位 SID 的 MTP 或多头训练都可以试,几乎没有成本。
- 课程式 mask 数量 + 难度 embedding 是很便宜的稳定化手段。消融中标准 MDM 比完整版低 3.45%,说明做离散扩散 GR 时,面向推荐的噪声设计比扩散框架本身更关键。
- 置信度选位 + warm-up 的思路不依赖扩散:即使用 RQ 码本,也可以考虑先串行解码前几层锁定粗类目,再并行解码剩余层(推断)。
需要保留意见的地方
- 速度卖点偏弱:默认配置只比逐位解码快 14.24%,且没有和 TIGER/RPG 直接比时延。AR 的
O(L^3)复杂度没有考虑 KV cache。B=50 时每步每条 beam 展开B^m个组合,GPU 上的 top-k 开销不可忽略。 - 表 3 有疑点:m_par=3 与 m_par=2 在 R_warm=4 下总步数都是 6,QPS 几乎相同(2.526 对 2.527),文中却说 QPS 随 m_par 单调上升。
- 增益来源不清:MDGR 用 Qwen3-8B embedding 配 8×300 的 OPQ 码本,基线的码本和内容编码器是否对齐没有说明。码本消融只做了「MDGR 换 RQ」(掉约 1.4%),缺少「同一并行码本 + AR 解码」的对照,所以约 10% 的提升里有多少来自扩散本身无法判断。
- 对比不完整:没有和点名的并发工作 LLaDA-Rec、DiffuGR 比较;图 2 画了 ReMask,但正文没有说明是否使用重新 mask。
- 公开集上的绝对提升约 0.004,没有方差或多次运行;Improv. 列有小的算术不一致(工业 R@5 按表算约为 +10.54%,文中写 +10.45%)。非法 SID 比例和 SID 冲突率都没有报告。
落地前建议核对:(1) 在自有码本上跑「AR 解码」与「掩码扩散解码」的同码本对照;(2) 实测 B=50、m_par=2 下端到端时延与显存;(3) 统计 8 位并行码本下的非法 SID 率和碰撞率;(4) 如果线上 SID 是 RQ 层级结构,迁移到并行码本需要重建码本和下游索引,这部分成本要单独评估。