WWW2025 快手最新论文 T2Diff 解读:生成式扩散模型+混合注意力打造高效推荐
文章目录
- 1. 背景
- 2. 扩散模型
- 2.1 正向过程(Forward Process):加入噪声
- 2.2 正向过程的封闭表达式(直接从 x 0 x_0 x0 生成 x t x_t xt)
- 2.3 反向过程(Reverse Process):一步步还原信号
- 2.4 损失函数(VLB & 简化)
- 3. 方法
- 3.1 框架
- 3.2 问题设定
- 3.2.1 推荐建模结构基础
- 3.2.2 模型目标概括
- 3.3 Diffusion Module
- 3.3.1 Diffusion Process
- 3.3.2 Reverse Process
- 3.4 混合注意力机制
- 3.4.1 Early Interaction - 融合当前兴趣
- 3.4.2 Target Attention - 融合历史兴趣
- 3.4.3 用户表示融合
- 3.4.4 与Transformer中注意力机制的不同
- 3.5 模型优化与训练目标(Model Optimization)
- 3.5.1 Stop-gradient:解决梯度冲突的关键技巧
- 4. 总结
准备入职快手推荐算法的实习,这里分享一篇WWW2025的快手的模型,主要是用来解决双塔中,用户与物品交互较晚导致太过于独立,召回的效果不那么好的问题。里面涉及了生成式(扩散模型)以及混合注意力机制。
1. 背景
在当今内容爆炸的互联网环境中,推荐系统已成为连接用户与信息的关键技术。从短视频平台到搜索引擎,从电商平台到广告投放,推荐模型的效率与准确性直接决定了用户体验与业务成效。为了更高效地从海量候选中筛选出可能感兴趣的内容,工业界普遍采用“两阶段推荐架构”:第一阶段通过召回模型快速筛选候选项(Matching),第二阶段通过排序模型精准打分(Ranking)。其中,Matching 阶段对系统的规模扩展性提出了极高的要求。
在工业实践中,“双塔模型(Two-Tower Model)”因其结构简单、延迟低、易于扩展,成为 Matching 阶段的事实标准。它通过将用户侧和物品侧分别建模为两个独立的塔,将二者映射到同一向量空间后进行相似度匹配(如内积)。这种结构虽然能高效检索候选,但也面临一个老大难问题:由于用户和物品的建模是完全独立的,它无法在建模阶段捕捉二者的交互关系,直到最后打分才“匆匆相见”,这被称为“Late Interaction 问题”。
为了解决这一结构性限制,近年来一些研究尝试引入浅层交互(如 COLD 模型)或借助历史正样本信息(如 DAT 模型)来引导交互建模。但这些方法大多局限于排序阶段,且缺乏对未来用户意图的预测能力。快手团队在 WWW 2025 会议上提出的 T2Diff 则突破性地引入了生成式建模思路,通过扩散模型重建下一个用户的潜在兴趣行为,并结合混合注意力机制,实现了在 Matching 阶段的深层次用户-物品交互,为大规模推荐系统提供了全新的生成范式。
如图 1 所示,工业界主流的推荐系统通常采用两阶段架构:第一阶段为 Matching(召回/粗排),从数以千万计的候选内容中高效筛选出千级别的初选集合;第二阶段为 Ranking(精排),对这些候选内容进行细致打分排序,最终展示给用户。这种结构在保证推荐精度的同时也兼顾了系统的延迟与吞吐量。图 1(b) 展示了两塔结构在 Matching 阶段中的常见设计问题:传统做法中,用户塔和物品塔是独立建模的,直到最后通过内积计算进行打分,这种“Late Interaction”(延迟交互)方式难以捕捉用户与物品之间的深层语义关系。为此,T2Diff 借助生成式思路,将 Ranking 阶段中的交互能力“下放”到 Matching 阶段,引入一个生成的“虚拟物品”(Fake Item)作为中介,借助扩散模型预测用户潜在兴趣,从而实现用户与物品的深度交互建模。这使得 T2Diff 所提出的“跨塔交互解耦架构(Cross-interaction Decoupling Architecture)”在保证原有检索效率的同时,大幅提升了候选召回的质量,实现了效率与效果的双重突破。
2. 扩散模型
扩散模型(Diffusion Models)最初源自图像生成领域,近年来已逐渐被引入到推荐、语音、自然语言等任务中。它的核心思想非常简单 —— 从数据出发,逐步加入噪声破坏(forward process);然后再学会如何逐步去噪还原(reverse process),最终让模型具备从随机噪声中“生成”结构化内容的能力。
我们以一个“涂抹与还原画作”的例子来解释:
- 你有一张画作 x 0 x_0 x0;
- 你每次在它上面轻轻涂一层“高斯雾霾”,记为 x 1 , x 2 , . . . , x T x_1, x_2, ..., x_T x1,x2,...,xT,最终变得几乎看不清;
- 然后你训练一个模型,让它学会“如何从雾霾一层层还原这幅画”;
- 当模型学会这个逆过程后,它甚至能从一张纯噪声 x T x_T xT 出发,“生成”出一幅新画(也就是推荐场景中的用户兴趣)。
2.1 正向过程(Forward Process):加入噪声
我们首先定义一条“扩散链”,表示从原始数据 x 0 x_0 x0 开始,逐步加入噪声得到 x 1 , x 2 , . . . , x T x_1, x_2, ..., x_T x1,x2,...,xT,每一步噪声来自高斯分布,过程定义如下:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t}x_{t-1}, \beta_t I) q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中:
- x 0 x_0 x0 是原始数据(如用户行为序列的漂移向量);
- β t \beta_t βt 控制每一步添加噪声的程度,越靠近 T T T, β t \beta_t βt 越大;
- I I I 是单位矩阵,表示添加的是各维独立的标准高斯噪声;
- 本质上,每一步就是把原始数据“混入一丢丢高斯模糊”。
如果我们把整个正向过程写成联合分布,它可以表示为:
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1}) q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)
这意味着:每一步 x t x_t xt 的生成仅依赖于上一步 x t − 1 x_{t-1} xt−1,是一个马尔可夫链。
2.2 正向过程的封闭表达式(直接从 x 0 x_0 x0 生成 x t x_t xt)
借助 DDPM 中的 reparameterization 技巧,我们可以将 x t x_t xt 表示为对 x 0 x_0 x0 直接加噪后的封闭形式:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I) q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
其中:
- α ˉ t = ∏ i = 1 t ( 1 − β i ) \bar{\alpha}_t = \prod_{i=1}^{t} (1 - \beta_i) αˉt=∏i=1t(1−βi) 是噪声衰减因子;
- 这表示我们可以直接将 x 0 x_0 x0 加上高斯噪声 ϵ \epsilon ϵ 来构造 x t x_t xt:
x t = α ˉ t x 0 + 1 − α ˉ t ⋅ ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \cdot \epsilon,\quad \epsilon \sim \mathcal{N}(0, I) xt=αˉtx0+1−αˉt⋅ϵ,ϵ∼N(0,I)
📌 举例说明:
比如我们用扩散模型生成一张猫的图片,你可以理解为每一步就是往原图加入“模糊马赛克”,直到第 T T T 步完全看不出是猫。这就是 x T x_T xT ——一张纯高斯噪声图像。
2.3 反向过程(Reverse Process):一步步还原信号
既然我们知道了从 x 0 x_0 x0 到 x T x_T xT 的加噪过程,那么我们就希望能反过来,从 x T x_T xT 一步步还原回 x 0 x_0 x0。
这个过程不是简单反过来加,而是要学习出“从噪声恢复信号”的能力。
在每一步,我们希望从 x t x_t xt 恢复出 x t − 1 x_{t-1} xt−1,它的分布如下:
p ( x t − 1 ∣ x t , x 0 ) = N ( x t − 1 ; μ ~ t ( x t , x 0 ) , β ~ t I ) p(x_{t-1} \mid x_t, x_0) = \mathcal{N}(x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I) p(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tI)
其中均值 μ ~ t \tilde{\mu}_t μ~t 和方差 β ~ t \tilde{\beta}_t β~t 的计算公式如下:
μ ~ t ( x t , x 0 ) = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t \tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t μ~t(xt,x0)=1−αˉtαˉt−1βtx0+1−αˉtαt(1−αˉt−1)xt
β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t \tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t β~t=1−αˉt1−αˉt−1βt
但是!推理阶段我们并不知道真实的 x 0 x_0 x0 啊!
所以我们就引入一个神经网络来估计 x 0 x_0 x0,这个网络通常用 U-Net 或 Transformer 来实现,记为 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵθ(xt,t) 或 μ θ ( x t , t ) \mu_\theta(x_t, t) μθ(xt,t)。
2.4 损失函数(VLB & 简化)
整个扩散模型的训练目标就是:学会从 x t x_t xt 中预测出添加的噪声 ϵ \epsilon ϵ,也就是:
L s i m p l e = E t ∼ [ 1 , T ] , x 0 , ϵ [ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] L_{simple} = \mathbb{E}_{t \sim [1, T], x_0, \epsilon} \left[ \left\| \epsilon - \epsilon_\theta(x_t, t) \right\|^2 \right] Lsimple=Et∼[1,T],x0,ϵ[∥ϵ−ϵθ(xt,t)∥2]
这个损失函数等价于一个最小化 KL 散度的变分下界(Variational Lower Bound, VLB),但在实际中我们通常只用这个简单的形式去优化网络。
扩散模型就是一套“先加噪,再学会去噪”的生成流程,而训练目标就是让模型学会如何从任意“噪声状态”中一步步还原出真实数据!
在 T2Diff 中,这种机制被用于生成用户下一次可能的行为,从而替代传统两塔中“只看过去”的方式,实现生成式交互建模。
3. 方法
3.1 框架
图 2 展示了 T2Diff 模型的整体架构,主要由两个关键模块组成:Diffusion Module(扩散模块)与 Mixed-attention Module(混合注意力模块)。
扩散模块整个流程分为训练阶段(上方)和推理阶段(下方),并以用户历史行为序列 X s e q u e n c e X_{sequence} Xsequence 为输入,目标是生成用户对下一个物品 x n + 1 x_{n+1} xn+1 的兴趣预测表示,并最终用于用户表示建模。
在训练阶段(右上粉色区域),模型首先将用户的完整行为序列 X s e q u e n c e X_{sequence} Xsequence 与目标行为 x n + 1 x_{n+1} xn+1 组合,构建出 X 1 : n + 1 X_{1:n+1} X1:n+1,然后利用滑动窗口生成两个序列 X 1 : n X_{1:n} X1:n 和 X 2 : n + 1 X_{2:n+1} X2:n+1,两者之间的差值即为兴趣漂移向量 z 0 z_0 z0,用于表征用户行为的变化趋势。扩散模块随后向 z 0 z_0 z0 中逐步加入高斯噪声,得到 z r z_r zr,并训练一个 U-Net 模型从 z r z_r zr 恢复出 z ^ 0 \hat{z}_0 z^0。在此过程中,为了使生成过程具备“条件性”,扩散模块在恢复每一步的同时引入 X 1 : n X_{1:n} X1:n 作为条件,引导模型学习“在当前用户兴趣轨迹下如何重建未来行为趋势”。
在推理阶段(右下蓝色区域),模型从一个标准高斯分布中采样得到 z T z_T zT,并利用训练好的扩散逆过程一步步恢复回 z ^ 0 \hat{z}_0 z^0。随后,结合用户历史行为 X 1 : n X_{1:n} X1:n,通过漂移利用(Drift Utilization)模块恢复出 x ^ n + 1 \hat{x}_{n+1} x^n+1,即用户的下一个可能行为。
左侧的混合注意力模块(Mixed-attention Module)则用于建模最终的用户表示 e u e_u eu。该模块将上一步生成的 x ^ n + 1 \hat{x}_{n+1} x^n+1 与最近 k k k 个会话行为 X s e s s i o n X_{session} Xsession 一同输入 Transformer 编码器并做平均池化,生成当前兴趣向量 h s h_s hs;然后以 h s h_s hs 为引导,通过注意力机制从历史行为 X h i s t o r y X_{history} Xhistory 中提取长期兴趣 h l h_l hl,最终将两者拼接送入前馈网络,生成最终的用户嵌入 e u e_u eu。
3.2 问题设定
T2Diff 模型提出的问题属于推荐系统中的用户兴趣建模任务,其核心目标是:在已知用户历史行为序列的基础上,预测用户可能产生的下一个正向行为 x ^ n + 1 \hat{x}_{n+1} x^n+1,并借此增强推荐召回阶段的用户表示。
假设我们有一个用户集合 U \mathcal{U} U 和一个物品集合 M \mathcal{M} M,每个用户 u ∈ U u \in \mathcal{U} u∈U 与多个物品 i ∈ M i \in \mathcal{M} i∈M 之间存在交互。我们用行为序列 X s e q u e n c e ∈ M X_{sequence} \in \mathcal{M} Xsequence∈M 来表示某个用户的历史交互轨迹,即:
X s e q u e n c e = [ x 1 , x 2 , … , x n ] X_{sequence} = [x_1, x_2, \dots, x_n] Xsequence=[x1,x2,…,xn]
其中, x j x_j xj 表示该用户与第 j j j 个物品的交互记录。为了更细致地建模行为意图,T2Diff 借鉴 session-based recommendation 的思路,将整个行为序列划分为两个部分:
-
当前会话行为段(短期兴趣):
X s e s s i o n = [ x n − k + 1 , … , x n ] X_{session} = [x_{n-k+1}, \dots, x_n] Xsession=[xn−k+1,…,xn]
表示最近的 k k k 个交互,反映当前用户的“临近意图”。 -
历史行为段(长期兴趣):
X h i s t o r y = [ x 1 , x 2 , … , x n − k ] X_{history} = [x_1, x_2, \dots, x_{n-k}] Xhistory=[x1,x2,…,xn−k]
捕捉用户更长期、稳定的偏好模式。
此外,模型引入一个关键变量:用户的下一个正向行为 x n + 1 x_{n+1} xn+1。在训练阶段我们拥有它,并通过扩散建模来还原出预测值 x ^ n + 1 \hat{x}_{n+1} x^n+1;在推理阶段,它则由扩散模型从高斯噪声中生成。
3.2.1 推荐建模结构基础
与大多数工业推荐系统一致,T2Diff 的基础建模框架是 Embedding-Based Retrieval(EBR),即将用户和物品特征分别通过两个独立神经网络编码为低维向量表示:
- 用户表示: e u e_u eu
- 物品表示: e i e_i ei
最终用户与物品的相关性通过向量间的内积计算得出:
s ( u , i ) = e u ⊤ ⋅ e i s(u, i) = e_u^\top \cdot e_i s(u,i)=eu⊤⋅ei
传统双塔模型只使用已有的 X s e q u e n c e X_{sequence} Xsequence 来编码 e u e_u eu,而 T2Diff 通过生成未来行为 x ^ n + 1 \hat{x}_{n+1} x^n+1,进一步增强用户向量,使其在 Matching 阶段就具备更强的兴趣表达能力。
3.2.2 模型目标概括
综上所述,T2Diff 的建模任务可以表述为:
给定用户历史行为序列 X s e q u e n c e = [ x 1 , … , x n ] X_{sequence} = [x_1, \dots, x_n] Xsequence=[x1,…,xn],通过生成的 x ^ n + 1 \hat{x}_{n+1} x^n+1 引导用户表示 e u e_u eu,以更充分地捕捉潜在兴趣偏好,提升召回阶段的推荐效果。
为此,T2Diff 提出了两个核心模块来协同建模:
- Diffusion Module:用于建模兴趣漂移(即 x n + 1 − x n x_{n+1} - x_n xn+1−xn)并生成 x ^ n + 1 \hat{x}_{n+1} x^n+1;
- Mixed-attention Module:结合 x ^ n + 1 \hat{x}_{n+1} x^n+1 和历史行为建模用户嵌入 e u e_u eu,实现深层交互。
3.3 Diffusion Module
在 T2Diff 框架中,扩散模块的核心目标是:从用户的历史行为序列出发,重建出下一次用户可能发生的正向行为 x ^ n + 1 \hat{x}_{n+1} x^n+1,作为用户未来兴趣的表征。整个过程借助扩散模型实现,其输入包括用户的完整行为序列 X s e q u e n c e = [ x 1 , x 2 , … , x n ] X_{sequence} = [x_1, x_2, \dots, x_n] Xsequence=[x1,x2,…,xn] 与该用户的真实下一次行为 x n + 1 x_{n+1} xn+1(仅训练阶段可得),并通过“兴趣漂移”建模生成训练信号。
为实现这一建模,T2Diff 首先构造扩散输入:将历史行为序列与下一个行为拼接,形成一个序列窗口:
X 1 : n + 1 = concat ( [ X s e q u e n c e , x n + 1 ] ) X_{1:n+1} = \text{concat}([X_{sequence}, x_{n+1}]) X1:n+1=concat([Xsequence,xn+1])
随后,模型使用滑动窗口的方式分别构造两个局部片段:
- X 1 : n = [ x 1 , … , x n ] X_{1:n} = [x_1, \dots, x_n] X1:n=[x1,…,xn] 表示当前观察到的历史;
- X 2 : n + 1 = [ x 2 , … , x n + 1 ] X_{2:n+1} = [x_2, \dots, x_{n+1}] X2:n+1=[x2,…,xn+1] 表示向右平移一位的“未来”。
两者做逐元素相减,即可得到兴趣变化(漂移)向量:
z 0 = d 1 : n = X 2 : n + 1 − X 1 : n z_0 = d_{1:n} = X_{2:n+1} - X_{1:n} z0=d1:n=X2:n+1−X1:n
这个 z 0 z_0 z0 反映了用户行为的局部变化趋势,作为扩散模型的建模目标。与直接生成 x n + 1 x_{n+1} xn+1 不同,T2Diff 的创新之处在于:选择建模兴趣漂移 z 0 z_0 z0 而非行为本身,这样可以有效规避原始行为序列的建模困难,提高生成质量和稳定性。
最终,T2Diff 将该漂移向量 z 0 z_0 z0 输入扩散流程,在训练阶段加入高斯噪声,学习从 z r z_r zr 中恢复出 z ^ 0 \hat{z}_0 z^0;而在推理阶段,则从高斯噪声出发逆向生成 z ^ 0 \hat{z}_0 z^0,再加回历史行为 X 1 : n X_{1:n} X1:n,恢复出目标行为 x ^ n + 1 \hat{x}_{n+1} x^n+1,即:
x ^ n + 1 = Slice ( z 0 + X 1 : n ) \hat{x}_{n+1} = \text{Slice}(z_0 + X_{1:n}) x^n+1=Slice(z0+X1:n)
这种基于差分的设计,使得模型在行为生成上更加平滑,也更容易优化。实验表明,这种设计在准确性和泛化性上均优于直接生成原始行为向量。
3.3.1 Diffusion Process
在训练阶段,T2Diff 采用扩散模型对兴趣漂移向量 z 0 z_0 z0 进行加噪操作,以训练生成模型学习去噪还原的能力。具体来说,扩散过程并不是固定逐步进行的,而是每次随机选择一个扩散步数 r r r,使得模型可以在不同程度的噪声水平下进行恢复训练,从而提高鲁棒性。
首先,从均匀分布中随机采样一个步数:
r ∼ Uniform ( { 1 , … , T } ) r \sim \text{Uniform}(\{1, \dots, T\}) r∼Uniform({1,…,T})
其中, T T T 是扩散步数的最大值,通常设为几十或上百。
为了逐步引入噪声,T2Diff 采用了一个指数型增长的噪声调度策略,即在扩散步骤 r r r 时,噪声量 β r \beta_r βr 由以下公式给出:
β r = a ⋅ e b r \beta_r = a \cdot e^{br} βr=a⋅ebr
其中, a a a 和 b b b 是超参数,控制噪声量随步数增长的速度。这种设计可以让扩散过程初期加噪较慢,后期加噪加快,更贴合用户兴趣变化的特点。
接下来,通过标准 reparameterization trick,将漂移向量 z 0 z_0 z0 加噪生成 z r z_r zr:
z r = α ˉ r z 0 + 1 − α ˉ r ϵ , ϵ ∼ N ( 0 , I ) z_r = \sqrt{\bar{\alpha}_r} z_0 + \sqrt{1-\bar{\alpha}_r} \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) zr=αˉrz0+1−αˉrϵ,ϵ∼N(0,I)
其中, α ˉ r \bar{\alpha}_r αˉr 是步数 r r r 累积下来的噪声保留比例, ϵ \epsilon ϵ 是采样自标准高斯分布的随机噪声。简单理解就是:把原始信号按一定比例弱化,叠加一定比例的随机噪声。
为了从 z r z_r zr 还原回原始漂移向量,T2Diff 使用了一个基于 U-Net 结构的去噪网络(Approximator),利用条件信息 X 1 : n X_{1:n} X1:n 辅助还原,具体输入形式是:
z ^ 0 = U-Net ( concat ( [ z r , X 1 : n ] ) ) \hat{z}_0 = \text{U-Net}(\text{concat}([z_r, X_{1:n}])) z^0=U-Net(concat([zr,X1:n]))
其中:
- z r z_r zr 是当前噪声污染后的输入;
- X 1 : n X_{1:n} X1:n 是历史行为序列,作为条件引导;
- concat 表示拼接操作,将两者联合输入;
- U-Net 结构能有效结合局部细节与全局特征,特别适合从复杂噪声中恢复结构信息。
这种“条件扩散(Conditional Diffusion)”设计,确保了模型在恢复 z 0 z_0 z0 时能够充分利用用户的历史兴趣轨迹,而不仅仅依赖随机噪声,从而提升了生成的准确性和多样性。
为了更直观地理解 T2Diff 中的扩散训练流程,图中的 Algorithm 1 展示了整个训练阶段的具体步骤。其核心目标是利用真实行为 x n + 1 x_{n+1} xn+1 与历史序列 X s e q u e n c e X_{sequence} Xsequence 构建兴趣漂移 z 0 z_0 z0,通过扩散加噪生成 z r z_r zr,再训练一个神经网络从 z r z_r zr 中恢复出无噪目标 z ^ 0 \hat{z}_0 z^0,并最终重建用户的下一个潜在行为 x ^ n + 1 \hat{x}_{n+1} x^n+1。
整个训练过程可分为以下几步:
- 构建输入序列:将完整的用户历史序列 X s e q u e n c e X_{sequence} Xsequence 与真实的下一个行为 x n + 1 x_{n+1} xn+1 拼接,构成序列 X 1 : n + 1 X_{1:n+1} X1:n+1。
- 兴趣漂移计算:通过滑动窗口构造 X 1 : n X_{1:n} X1:n 和 X 2 : n + 1 X_{2:n+1} X2:n+1,两者相减得到兴趣漂移向量 z 0 z_0 z0,刻画用户兴趣在时序维度上的微小变化。
- 随机采样扩散步数:从 { 1 , … , T } \{1, \dots, T\} {1,…,T} 中均匀采样扩散步数 r r r,用于控制噪声强度。
- 加噪生成 z r z_r zr:依据 z 0 z_0 z0 与噪声调度策略 β r \beta_r βr 采样噪声,生成噪声污染版本 z r z_r zr。
- 去噪还原 z 0 z_0 z0:使用 U-Net 结构的神经网络从 ( z r , X 1 : n ) (z_r, X_{1:n}) (zr,X1:n) 中恢复出 z ^ 0 \hat{z}_0 z^0,即目标漂移。
- 损失函数优化:通过 L K L ( z ^ 0 , z 0 ) L_{KL}(\hat{z}_0, z_0) LKL(z^0,z0) 度量模型输出与真实目标之间的差异,更新网络参数。
- 漂移还原行为:将去噪后的 z ^ 0 \hat{z}_0 z^0 加回 X 1 : n X_{1:n} X1:n,使用 Slice ( ⋅ ) \text{Slice}(\cdot) Slice(⋅) 操作提取最后一项,作为模型生成的预测行为 x ^ n + 1 \hat{x}_{n+1} x^n+1。
最终生成的 x ^ n + 1 \hat{x}_{n+1} x^n+1 将被用作后续混合注意力模块的输入,用于增强用户表示。整个流程既体现了生成模型的建模能力,也保留了推荐系统中对历史行为的高效建模路径。
3.3.2 Reverse Process
在推理阶段,T2Diff 通过扩散模型的“逆过程”从一个随机采样的高斯噪声 z T z_T zT 出发,逐步还原出用户的兴趣漂移表示 z ^ 0 \hat{z}_0 z^0,最终重构预测行为 x ^ n + 1 \hat{x}_{n+1} x^n+1。这一过程是整个生成建模的关键,在推荐系统中也非常新颖。
我们首先从标准正态分布中采样一个高斯噪声:
z T ∼ N ( 0 , I ) z_T \sim \mathcal{N}(0, I) zT∼N(0,I)
然后利用已经训练好的 U-Net 模型 f θ f_\theta fθ,结合用户的历史行为 X 1 : n X_{1:n} X1:n,逐步执行 T T T 次去噪操作。在每一步 t t t 中,我们从当前的状态 z t z_t zt 得到 z ^ 0 \hat{z}_0 z^0 的估计:
z ^ 0 = f θ ( z t , X 1 : n ) \hat{z}_0 = f_\theta(z_t, X_{1:n}) z^0=fθ(zt,X1:n)
接着,我们根据 z ^ 0 \hat{z}_0 z^0 和当前的 z t z_t zt 计算下一个状态 z t − 1 z_{t-1} zt−1:
z t − 1 = μ ~ t ( z t , z ^ 0 ) + β ~ t ⋅ ϵ ′ , ϵ ′ ∼ N ( 0 , I ) z_{t-1} = \tilde{\mu}_t(z_t, \hat{z}_0) + \tilde{\beta}_t \cdot \epsilon', \quad \epsilon' \sim \mathcal{N}(0, I) zt−1=μ~t(zt,z^0)+β~t⋅ϵ′,ϵ′∼N(0,I)
这里的 μ ~ t ( ⋅ ) \tilde{\mu}_t(\cdot) μ~t(⋅) 和 β ~ t \tilde{\beta}_t β~t 分别表示反向扩散过程中的均值和方差项,与训练过程保持一致,确保生成路径平稳可控。这个过程会重复执行 T T T 次,逐步清除噪声,还原出漂移向量 z 0 z_0 z0。
最后一步是“漂移反向映射”操作:将重建出的 z ^ 0 \hat{z}_0 z^0 加回历史行为 X 1 : n X_{1:n} X1:n,提取其中最后一个向量作为预测的下一次用户行为:
x ^ n + 1 = Slice ( z ^ 0 + X 1 : n ) \hat{x}_{n+1} = \text{Slice}(\hat{z}_0 + X_{1:n}) x^n+1=Slice(z^0+X1:n)
其中, Slice ( x ) \text{Slice}(x) Slice(x) 表示提取向量 x x x 的最后一个位置(即 x [ − 1 ] x[-1] x[−1])。
整体上,T2Diff 的推理阶段实现了“从高斯噪声 → 用户未来行为”的转化流程,打破了传统推荐系统只能基于过去历史推理的限制,使得生成的 x ^ n + 1 \hat{x}_{n+1} x^n+1 更具多样性与前瞻性,能够更有效引导后续用户表示建模与召回任务。
为了更清晰地描述推理阶段的实现细节,T2Diff 给出了如上所示的 Algorithm 2,用于展示扩散模型在推理阶段如何从高斯噪声出发,一步步生成用户的下一步潜在行为 x ^ n + 1 \hat{x}_{n+1} x^n+1。
该过程可分为以下几个关键步骤:
-
初始化输入:模型接收用户历史行为序列 X s e q u e n c e X_{sequence} Xsequence 或其子序列 X 1 : n X_{1:n} X1:n,作为条件信息参与后续生成。
-
采样扩散起点:从标准高斯分布中采样一个高维向量 z T ∼ N ( 0 , I ) z_T \sim \mathcal{N}(0, I) zT∼N(0,I),作为生成过程的起点。这类似于图像扩散模型中从纯噪声开始画画的方式。
-
T 步逆扩散迭代:
- 在每一步 t t t 中,利用当前状态 z t z_t zt 与条件 X 1 : n X_{1:n} X1:n 拼接后输入 U-Net 网络,预测出无噪目标漂移向量 z ^ 0 \hat{z}_0 z^0;
- 然后调用 Fusion 模块(即推导式中的 μ t + β t ϵ \mu_t + \beta_t \epsilon μt+βtϵ 过程),由 z t z_t zt 和 z ^ 0 \hat{z}_0 z^0 计算出下一个状态 z t − 1 z_{t-1} zt−1;
- 这个过程会持续迭代 T 步,逐步去除噪声,使 z t z_t zt 趋近于真实的兴趣漂移表示。
-
重建用户行为:在所有反向步骤完成后,最终输出的 z 0 z_0 z0 与用户历史行为 X 1 : n X_{1:n} X1:n 相加,并通过 Slice ( ⋅ ) \text{Slice}(\cdot) Slice(⋅) 操作提取出预测的下一行为:
x ^ n + 1 = Slice ( z 0 + X 1 : n ) \hat{x}_{n+1} = \text{Slice}(z_0 + X_{1:n}) x^n+1=Slice(z0+X1:n)
整个推理过程无需真实的 x n + 1 x_{n+1} xn+1,完全依赖随机采样与历史行为条件建模,因此在实际推荐场景中可以直接用于生成用户对未来兴趣的模拟行为,为下游的召回或排序模型提供更丰富的候选用户表示。
3.4 混合注意力机制
在传统两塔模型中,用户和物品的表示是通过两个独立网络分别编码的,这种解耦方式虽然利于大规模检索,但也导致模型难以在表示阶段捕捉用户与物品之间的交互特征,产生所谓的 “Late Interaction” 问题。为了解决这一缺陷,T2Diff 在 Matching 阶段引入了一个精心设计的 Mixed-attention Module,以在用户表示构建阶段就实现深层次交互。
3.4.1 Early Interaction - 融合当前兴趣
该模块首先通过连接最近的会话行为 X s e s s i o n = [ x n − k + 1 , … , x n ] X_{session} = [x_{n-k+1}, \dots, x_n] Xsession=[xn−k+1,…,xn] 和由扩散模块生成的下一个预测行为 x ^ n + 1 \hat{x}_{n+1} x^n+1,构造当前兴趣的输入序列:
h s = avg ( Transformer ( concat ( [ X s e s s i o n , x ^ n + 1 ] ) ) ) h_s = \text{avg}(\text{Transformer}(\text{concat}([X_{session}, \hat{x}_{n+1}]))) hs=avg(Transformer(concat([Xsession,x^n+1])))
其中,Transformer 结构负责建模时间上下文信息,avg 表示平均池化。这样生成的 h s h_s hs 表示用户当前的活跃兴趣状态,用于指导后续的注意力过程。
3.4.2 Target Attention - 融合历史兴趣
接下来,模型希望在更长时间尺度上捕捉用户的历史偏好。为此,T2Diff 引入了一种引导式注意力机制,以 h s h_s hs 为引导,从较早的行为序列 X h i s t o r y = [ x 1 , x 2 , … , x n − k ] X_{history} = [x_1, x_2, \dots, x_{n-k}] Xhistory=[x1,x2,…,xn−k] 中提取长期偏好表示。
对于每个历史行为 x j x_j xj,首先与当前兴趣 h s h_s hs 进行拼接、差值、乘积,然后送入前馈网络计算注意力分数 a j a_j aj:
a j = FFN ( concat ( [ x j , x j − h s , x j ∗ h s , h s ] ) ) ∑ i = 1 n − k FFN ( concat ( [ x i , x i − h s , x i ∗ h s , h s ] ) ) a_j = \frac{\text{FFN}(\text{concat}([x_j, x_j - h_s, x_j \ast h_s, h_s]))} {\sum_{i=1}^{n-k} \text{FFN}(\text{concat}([x_i, x_i - h_s, x_i \ast h_s, h_s]))} aj=∑i=1n−kFFN(concat([xi,xi−hs,xi∗hs,hs]))FFN(concat([xj,xj−hs,xj∗hs,hs]))
这个注意力机制通过外积等方式对特征交互进行显式建模,最终生成加权求和得到的历史兴趣表示:
h l = ∑ j = 1 n − k a j x j h_l = \sum_{j=1}^{n-k} a_j x_j hl=j=1∑n−kajxj
如图 3 所示,注意力的打分机制采用了双输入的激活单元和 Outer Product 操作,在结构上明确执行了引导式注意力(Target Attention)而非普通的 self-attention。
3.4.3 用户表示融合
最后,模型将当前兴趣表示 h s h_s hs 和历史兴趣表示 h l h_l hl 拼接,通过一层 FFN 投射为最终用户表示向量 e u e_u eu:
e u = FFN ( concat ( [ h l , h s ] ) ) e_u = \text{FFN}(\text{concat}([h_l, h_s])) eu=FFN(concat([hl,hs]))
这个用户表示将直接用于与物品 Embedding 做匹配打分,用于召回阶段。由于其中融合了历史兴趣、当前活跃偏好,以及生成的潜在下一行为信息,因此能更准确反映用户的意图。
整个混合注意力模块实现了跨时间段的多层次交互建模,不仅有效缓解了两塔架构中的“后期交互瓶颈”,也为后续推荐阶段提供了更精细、更动态的用户表示,为大规模推荐场景带来了更高的表达能力与泛化性能。
3.4.4 与Transformer中注意力机制的不同
T2Diff 中的 Mixed-attention Module 采用了一种引导式的注意力机制(Target Attention),与标准的 Transformer 中使用的 Self-Attention 有本质性的区别。
在 Transformer 中,Self-Attention 的核心思想是“所有位置彼此交互”,即每个 token(比如行为 x i x_i xi)都会同时作为查询(query)、键(key)和值(value)参与注意力计算,模型通过学习这些相似度权重,捕捉序列中各个元素之间的上下文依赖关系。具体来说,注意力的计算公式如下:
Attention ( q , k , v ) = softmax ( q ⋅ k ⊤ d ) v \text{Attention}(q, k, v) = \text{softmax}\left( \frac{q \cdot k^\top}{\sqrt{d}} \right) v Attention(q,k,v)=softmax(dq⋅k⊤)v
这种机制非常灵活,但也完全依赖模型自己去发现哪些位置之间应该交互,缺乏“引导性”。
相比之下,T2Diff 的注意力机制是有明确“引导目标”的:它使用当前会话中的兴趣表示 h s h_s hs 作为查询向量(query),主动去从历史行为序列 X h i s t o r y X_{history} Xhistory 中筛选出与之高度相关的行为特征。其注意力打分不是通过简单点积,而是采用拼接、差值、点乘等多种特征组合,再输入前馈网络(FFN)进行计算:
a j = FFN ( [ x j , x j − h s , x j ∗ h s , h s ] ) a_j = \text{FFN}([x_j, x_j - h_s, x_j \ast h_s, h_s]) aj=FFN([xj,xj−hs,xj∗hs,hs])
最终根据注意力权重 a j a_j aj 对历史行为进行加权求和,得到历史兴趣表示 h l h_l hl。这意味着,T2Diff 并不是让历史行为彼此交互,而是围绕一个“目标行为意图”——即 h s h_s hs——去构建历史行为的响应性表示。
✅ 从结构上来看:Self-Attention 是“全局、无目标、对称式”的;Target Attention 是“单向、引导式、不对称”的。
🎯 从应用角度看:Transformer 的注意力适合语言建模、图像建模等无监督序列建模任务;而 T2Diff 的 Target Attention 更契合推荐系统中“已知目标,回溯动因”的需求。
这类“带引导的注意力”机制,本质上更像是在执行一轮语义召回(relevance matching):当前用户的短期兴趣 h s h_s hs 就像是一道查询,系统需要从历史行为中找出那些“响应最强烈”的行为片段,进而构建一个完整、个性化的用户向量。这种机制非常适合推荐任务中的用户建模,尤其是在两塔模型的表示阶段。
而我们这里的优点类似Cross Attention,为什么不直接用Cross Attention呢?
实际上,T2Diff 中这个 引导式 Target Attention 机制 本质上确实就是一种特殊形式的 Cross-Attention,只不过它在实现上不使用标准的点积公式,而是采用了更加手工设计、结构更丰富的打分函数(拼接 + FFN),但它的 “语义功能”与 Cross-Attention 是一致的。
对比维度 | Cross-Attention(Transformer 中) | T2Diff 中的 Target Attention |
---|---|---|
Query | 外部信号(如 decoder 输入、问题描述) | 当前兴趣向量 h s h_s hs |
Key & Value | 一段候选表示序列(如 encoder 输出) | 历史行为序列 X h i s t o r y X_{history} Xhistory |
注意力计算 | 点积( q ⋅ k ⊤ q \cdot k^\top q⋅k⊤) + softmax + 加权求和 | 拼接/差值/乘积 + FFN 打分 + softmax + 加权求和 |
核心目标 | 查询引导输出关注上下文或答案 | 当前兴趣引导获取历史行为中有贡献的部分 |
可微性与通用性 | 标准模块,可用于任意场景 | 结构定制,优化推荐表达,非 Transformer 通用模块 |
Cross Attention 的设计动机就是 “一个 query 去关注一堆 keys/values”,比如:
- 机器翻译中:当前正在翻译的词(query)去关注源语言的上下文(key/value);
- 文本生成中:生成的问题去关注知识库;
- T2Diff 中:当前兴趣表示 h s h_s hs 去关注历史行为序列。
这正是 T2Diff 的语义:用 h s h_s hs 来“查找”对它最相关的历史行为!所以在结构层面,它确实是 cross-attention,只是没有采用经典 Transformer 中的点积范式。
设计选择差异(为什么不用标准 cross attention?)
T2Diff 没有用点积的 cross-attention,而是选择了:
a j = FFN ( [ x j , x j − h s , x j ∗ h s , h s ] ) a_j = \text{FFN}([x_j, x_j - h_s, x_j * h_s, h_s]) aj=FFN([xj,xj−hs,xj∗hs,hs])
可能原因如下:
- 更强的交互性表达:
- 拼接差值/乘积能显式建模局部差异(而点积只看方向角度)。
- 控制计算成本:
- 不需要为每个 token 都额外投影 query/key/value,适合推荐系统的大规模稀疏场景。
- 领域归纳偏好:
- 推荐系统中行为的匹配通常基于显式语义组合,而非方向相似度(点积)。
个人理解,可以把 T2Diff 的 Target Attention 理解为一种定制版的 Cross-Attention —— 查询向量是 h s h_s hs,值序列是 X h i s t o r y X_{history} Xhistory,关注方式不同,但核心语义是一致的。
3.5 模型优化与训练目标(Model Optimization)
在扩散模块中,每一步训练的目标是使得模型能够从带噪表示 z r z_r zr 中准确还原无噪的兴趣漂移表示 z ^ 0 \hat{z}_0 z^0,从而最终恢复出下一行为 x ^ n + 1 \hat{x}_{n+1} x^n+1。为了实现这一点,T2Diff 基于变分扩散模型(如 DDPM)提出了一个简化的优化目标,即 Kullback-Leibler 散度损失:
L K L = E r ∈ [ 1 , T ] , x 0 , μ r [ ∥ μ r − μ θ ( z r , r ) ∥ 2 ] L_{KL} = \mathbb{E}_{r \in [1, T], x_0, \mu_r} \left[ \left\| \mu_r - \mu_\theta(z_r, r) \right\|^2 \right] LKL=Er∈[1,T],x0,μr[∥μr−μθ(zr,r)∥2]
其中, μ r \mu_r μr 表示在第 r r r 个扩散步骤中添加的真实噪声的均值, z r z_r zr 是在该步骤生成的带噪输入, μ θ ( z r , r ) \mu_\theta(z_r, r) μθ(zr,r) 是模型的估计值,由 U-Net 网络(即近似器)通过学习得到。
这个损失函数的目标是使 μ θ ( z r , r ) \mu_\theta(z_r, r) μθ(zr,r) 尽可能贴近真实噪声均值 μ r \mu_r μr,从而帮助模型在逆向过程中更好地预测出漂移向量 z ^ 0 \hat{z}_0 z^0,进而重构用户行为。
从另一个角度看,T2Diff 实际上是在训练一个从高斯噪声恢复真实用户行为“漂移模式”的生成器。通过最小化 L K L L_{KL} LKL,我们可以缩小模型输出与真实样本之间的差距,并利用梯度下降方法不断优化近似器参数 θ \theta θ。
该训练过程在算法上对应于论文中的 Algorithm 1,即“Diffusion Process (Training)”,每一步都包含:
- 生成目标向量 z 0 z_0 z0;
- 添加高斯噪声得到 z r z_r zr;
- 预测 z ^ 0 \hat{z}_0 z^0;
- 最小化 KL 损失以更新网络参数。
通过 L K L L_{KL} LKL 的监督,T2Diff 能够在每一步扩散还原过程中学到一个可靠的估计器,使得最终输出的 x ^ n + 1 \hat{x}_{n+1} x^n+1 不仅贴近用户真实的行为偏好,同时也具备较好的泛化与生成能力。
在推荐系统中,尤其是两塔结构(Two-Tower)中,最常用的训练目标之一就是基于用户和物品的向量相似性进行匹配。因此,T2Diff 依然遵循这一设计思想,采用了经典的 Softmax Ranking Loss 作为主导的优化目标,用于驱动用户表示 e u e_u eu 和目标物品表示 e i e_i ei 之间的相似度最大化。
该损失函数定义如下:
L T O W E R = − log exp ( e u ⋅ e i ) ∑ m ∈ M exp ( e u ⋅ e m ) L_{TOWER} = -\log \frac{\exp(e_u \cdot e_i)}{\sum_{m \in \mathcal{M}} \exp(e_u \cdot e_m)} LTOWER=−log∑m∈Mexp(eu⋅em)exp(eu⋅ei)
其中, e u e_u eu 是通过混合注意力机制构造得到的用户向量, e i e_i ei 是当前正样本的物品向量, M \mathcal{M} M 表示物品全集或其采样子集。该损失的目标是拉近 e u e_u eu 与目标物品 e i e_i ei 之间的内积距离,同时将它与其他无关物品 e m e_m em 拉远。由于该训练目标直接作用于用户与物品的稀疏 Embedding 表达,因此它能有效强化检索表达能力,在工业推荐系统中具有极高实用性。
为了进一步引入用户行为的生成建模能力,T2Diff 还引入了扩散模块对应的 KL 损失 L K L L_{KL} LKL(详见前文)。这部分的目标是训练 U-Net 模型从噪声中复原兴趣漂移向量 z ^ 0 \hat{z}_0 z^0,最终得到用户的下一行为预测 x ^ n + 1 \hat{x}_{n+1} x^n+1。但这两个模块的训练方向并不完全一致:
- L T O W E R L_{TOWER} LTOWER 更偏向“表示学习”,强化语义匹配;
- L K L L_{KL} LKL 是“生成建模”,关注序列的还原与重建。
为了综合两者的训练目标,T2Diff 将它们加权求和,得到总损失:
L T O T A L = L T O W E R + λ L K L (25) L_{TOTAL} = L_{TOWER} + \lambda L_{KL} \tag{25} LTOTAL=LTOWER+λLKL(25)
其中, λ \lambda λ 是一个超参数,用于控制扩散模块损失的影响力,通常设为 1 1 1 或 10 10 10,具体取值依数据集和任务而定。
3.5.1 Stop-gradient:解决梯度冲突的关键技巧
由于 L T O W E R L_{TOWER} LTOWER 主要用于优化稀疏 Embedding 表达,而 L K L L_{KL} LKL 主要优化扩散网络的生成能力,它们的优化方向往往互相干扰,容易造成“梯度打架”的现象。举个例子,扩散模块试图从行为中提炼时序特征,而两塔模块则倾向于压缩表示以提升匹配效率,两者若共用梯度通路,就会导致训练震荡甚至发散。
为了解决这一冲突,T2Diff 提出了一种有效的技巧:Stop-gradient机制。具体来说,在模型结构中(见 Figure 2(a)),扩散模块对用户向量的反向传播路径被“截断”,这样就能保证:
- 扩散模块只优化自己的 U-Net 和重建路径;
- 两塔模块只优化用户表示的上层投影;
- 两者之间通过“静态连接”共享预测结果,而不干扰彼此的训练过程。
这个机制使得 T2Diff 能够将表示学习(用于匹配)与生成建模(用于行为建模)高效融合,既保留了传统召回模型的高性能,又引入了生成式预测能力,最终在多个真实世界数据集上取得了强大的效果提升。
4. 总结
总的来说,T2Diff 提出了一种创新的生成式推荐方法,突破了传统双塔模型“信息交互弱”和“行为建模浅”的限制。通过引入扩散模型,T2Diff 能够生成用户的下一个潜在兴趣行为,从而显式引导用户建模过程;同时结合混合注意力机制,引入当前兴趣与历史行为的深度交互,有效提升了用户表示的表达能力。文章在多个真实世界和工业级数据集上验证了方法的有效性,显著优于现有最先进方法,展现出生成式模型在大规模推荐系统中的巨大潜力。