DMD score
让同一个带噪样本分别接受两个分布的"局部调整指引",再用这两个方向的差异来训练学生。 这里的 score 不是"这张图片得了 80 分",而是一个与图像或 latent 维度相同的方向向量
Score (s(x)) 回答:"站在这里,往哪个方向稍微移动,能让对数概率密度增加得最快?"
DMD(Distribution Matching Distillation,分布匹配蒸馏)是一种生成模型的加速训练方法:利用一个已经训练好的多步扩散模型,训练出能够一步生成图像的学生模型。它的核心不是要求学生对每个噪声都复现教师的同一张图片,而是让学生生成的大量样本,在整体分布上接近教师所描述的目标分布。 原始 DMD 面向一步生成,后续 DMD2 又扩展了少步生成
DMD 不是单纯把采样步数调小,而是重新训练模型,让它具备用更少步骤完成生成的能力。
DMD 不是让两个模型给图片打高低分,而是让两个去噪模型分别估计目标分布和学生当前分布的局部方向。两者相减后,得到考虑了"目标与现状差异"的训练信号,再通过反向传播更新学生。这样优化的重点是让学生的整体生成分布接近目标,而不是单纯把每个样本都推到目标分布的峰顶。
你抓住了 DMD 的核心形式,但"两个打分的差值"容易让人误解。更准确地说,是:让同一个带噪样本分别接受两个分布的"局部调整指引",再用这两个方向的差异来训练学生。 这里的 score 不是"这张图片得了 80 分",而是一个与图像或 latent 维度相同的方向向量。(arXiv)
最需要理解的是:为什么一个方向还不够,以及减掉另一个方向到底改变了什么。
相对于学生目前生成样本的分布,目标分布希望哪些区域得到更多支持?
DMD
DMD(Distribution Matching Distillation,分布匹配蒸馏)是一种生成模型的加速训练方法:利用一个已经训练好的多步扩散模型,训练出能够一步生成图像的学生模型。它的核心不是要求学生对每个噪声都复现教师的同一张图片,而是让学生生成的大量样本,在整体分布上接近教师所描述的目标分布。 原始 DMD 面向一步生成,后续 DMD2 又扩展了少步生成。(arXiv)
结合你最近学的扩散模型、Flow Matching 和 ODE,可以先记住:
DMD 不是单纯把采样步数调小,而是重新训练模型,让它具备用更少步骤完成生成的能力。
1. 它到底在加速什么?
假设一个教师模型需要调用生成网络 50 次,才能把噪声逐渐变成图片。DMD 希望训练一个学生,让它从噪声出发,一次网络前向就能得到最终结果。
这里有个重要区别:蒸馏不一定意味着学生的参数量更小。 原始 DMD 可以沿用教师去噪网络的架构和预训练参数,主要减少的是生成时的网络调用次数 ,而不是网络层数。(arXiv)
可以把这两件事区分开:
"把模型压小"是让每次调用更便宜;"把多步蒸馏成一步"是让模型少调用几次。DMD 主要关注后者。
另外,在潜空间生成系统中,"一步"通常指核心生成网络的一次调用,并不表示文本编码、VAE 解码等整个流程只有一次计算。(GitHub)
2. 为什么叫"分布匹配"?
先想一种最直接的蒸馏方法:
给教师一个噪声 (z),让教师经过多步生成图片 (x_{\text{teacher}}),然后要求学生用同一个噪声,一步生成尽量相同的图片。
这相当于要求学生学会:
这个具体噪声,就必须对应教师生成的这张具体图片。
DMD 的分布匹配目标放松了这种要求:不强制固定噪声与固定图片的一一对应,而是约束最终生成结果的整体分布。 (arXiv)
举一个假想例子。提示词是"山间的一栋小屋"。
对于同一个随机种子,教师可能把小屋画在左边,学生把小屋画在右边。逐样本回归会把这种差异当成误差;但从分布匹配的角度,不能仅凭这两张图构图不同,就判断学生做错了。更重要的是:在大量生成结果中,学生是否也能产生符合提示词、结构合理、具有适当变化的小屋图像。
所以,"分布匹配"并不只是"每张图看起来不错",还包括不同类型的结果是否具有合理的出现比例。
不过,原始 DMD 并不是完全取消逐样本监督:它还保留了一个回归正则项来稳定训练。分布匹配项与这个辅助回归项,需要分开理解。 (arXiv)
3. 训练时为什么会有三个模型?
DMD 的核心训练结构可以理解为三个角色:
| 角色 | 负责什么 | 是否更新参数 |
|---|---|---|
| 学生生成器 (G_\theta) | 从噪声一步生成图片或 latent | 更新 |
| 教师去噪模型 | 描述目标分布,提供 real score | 冻结 |
| 辅助去噪模型 | 学习学生当前生成的分布,提供 fake score | 更新 |
这里最容易混淆的是第三个模型:它不是最终负责生成图片的学生,也不是一个简单判断"真或假"的分类器。 它是另一个去噪模型,专门在学生生成的数据上训练,用来追踪"学生现在究竟会生成什么样的样本"。(arXiv)
可以把三个角色分别理解成:
学生负责生成,教师描述目标,辅助模型描述学生的现状。
有了"目标"和"现状",才能得到推动学生改进的信号。
这里的 score 是什么?
这里的 score 不是图像质量的一个标量分数,而是:
s ( x ) = ∇ x log p ( x ) s(x)=\nabla_x\log p(x) s(x)=∇xlogp(x)
它表示:在当前位置 (x),怎样小幅改变样本,能够让它在这个分布下的概率密度增大。
因此,score 是一个与样本维度对应的向量或张量。对于图像或 latent,它描述的是整个样本各个维度上的变化方向,不是"这张图得了 90 分"。DMD 用两个去噪模型分别近似目标分布和学生分布的 score。(arXiv)
4. 一轮训练具体怎么做?
下面先讲分布匹配部分,暂时把原始 DMD 的回归正则放在一旁。
第一步:学生先生成一个结果
采样噪声 (z),结合文本条件 (c),让学生生成:
x = G θ ( z , c ) x=G_\theta(z,c) x=Gθ(z,c)
这里的 (z) 是对应整个样本的噪声张量,不是图片中的某一个噪点。(x) 可以是图像,也可以是图像的 latent。
第二步:给学生的结果重新加噪
随机选择一个时间步 (t),再采样一份噪声 (\epsilon),构造:
x t = α t x + σ t ϵ x_t=\alpha_t x+\sigma_t\epsilon xt=αtx+σtϵ
注意,(z) 和 (\epsilon) 的用途不同:前者是学生生成时的输入 ,后者是训练评价时额外加入的噪声。
为什么生成完还要加噪?一方面,教师本来就擅长处理带噪样本;另一方面,加噪会平滑分布,让学生分布与目标分布之间更容易获得有效的比较信号。这里的加噪是训练手段,不代表最终推理时也要"生成完再破坏一次"。(arXiv)
第三步:让教师和辅助模型看同一个 (x_t)
把同一个带噪样本、同一个时间步、同一个条件交给两个去噪模型,获得:
s real ( x t , t , c ) , s fake ( x t , t , c ) s_{\text{real}}(x_t,t,c), \qquad s_{\text{fake}}(x_t,t,c) sreal(xt,t,c),sfake(xt,t,c)
教师提供目标分布的局部信息,辅助模型提供学生当前分布的局部信息。DMD 利用两者的差异,为学生生成器构造梯度,而不是让教师先为这个噪声完整生成一张"标准答案图"。(天韦印)
第四步:更新学生,同时让辅助模型跟上学生
学生利用分布匹配梯度更新参数。
辅助模型则用学生生成的样本进行普通去噪训练。例如,采用噪声预测形式时,可以把损失写成:
L fake = E ∥ ϵ ϕ ( x t , t , c ) − ϵ ∥ 2 \mathcal L_{\text{fake}}= \mathbb E\left \\left\\\| \\epsilon_\\phi(x_t,t,c)-\\epsilon \\right\\\|\^2 \\right Lfake=E∥ϵϕ(xt,t,c)−ϵ∥2
这个更新阶段会将学生输出视为固定训练数据,只训练辅助模型。随着学生生成能力变化,辅助模型也必须继续训练,否则它描述的就不再是学生"当前"的分布。(arXiv)
因此,两种训练任务不同:学生在学习"生成得更好",辅助模型在学习"准确描述学生现在生成的数据"。
5. 为什么需要"教师 score − 学生 score"?
这来自 DMD 背后的分布匹配目标。
用 (q_\theta) 表示学生分布,用 (p) 表示目标分布,理想目标是减小:
D K L ( q θ ∥ p ) D_{\mathrm{KL}}(q_\theta\|p) DKL(qθ∥p)
实际中,DMD 在不同加噪程度下构造近似的分布匹配梯度。它不必显式计算整张图像的概率密度;关键是利用两个 score 的差来得到更新方向。(arXiv)
从数学直觉看:
s real ( x ) − s fake ( x ) = ∇ x log p ( x ) q θ ( x ) s_{\text{real}}(x)-s_{\text{fake}}(x)= \nabla_x\log\frac{p(x)}{q_\theta(x)} sreal(x)−sfake(x)=∇xlogqθ(x)p(x)
这个式子表达的不是单纯"哪里目标概率高,就全部往哪里挤",而是在比较:
相对于学生目前生成样本的分布,目标分布希望哪些区域得到更多支持?
例如,假设目标分布中有几类不同构图,学生却总是生成其中一种。仅仅把已有样本往某个高概率区域推,并不一定能纠正这种单一化。引入学生分布的信息,才是在做"目标相对现状"的调整,而不是只追逐高概率样本。
不过,有了 fake score,并不等于数学上保证不会发生模式坍缩或丢失某类结果。 原始 DMD 仍然需要额外的稳定措施。(arXiv)
还要注意:这里的 score 差是训练学生参数的指导信号,不是学生推理时需要反复计算的"速度"。最终生成时,不需要再把教师和辅助模型都运行一遍。
6. 原始 DMD 与 DMD2 有什么区别?
原始 DMD:分布匹配,加上回归正则
原始 DMD 会提前让教师通过多步采样,生成一批"噪声---图片"配对数据。训练学生时,除了分布匹配,还要求它对这些噪声生成与教师结果相近的图像,用感知距离等回归损失稳定训练。(天韦印)
因此,下面这句话不够准确:
"DMD 完全不需要教师生成图片,也完全不使用配对样本。"
准确说法是:分布匹配项本身不要求配对,但原始 DMD 的辅助回归项需要。
DMD2:去掉配对回归依赖,并改进训练
DMD2 的改进主要体现在三个方面:
首先,让辅助模型更充分地跟踪学生。 论文发现,直接删掉回归项后,训练不稳定的重要原因是 fake score 估计不准确。因此采用不同更新频率,让辅助模型比学生更新得更充分,从而不再依赖昂贵的教师配对数据。
其次,加入基于真实图像的 GAN 监督。 这样学生不只是依赖教师近似出来的目标分布,还能直接获得真实数据的监督。
最后,支持少步生成,并处理训练与推理输入不一致的问题。 训练中模拟学生实际推理产生的中间状态,而不只使用理想化的带噪输入。(arXiv)
这里"去掉数据构造"指的是不再需要那批昂贵的教师噪声---图片配对数据,不等于完整 DMD2 训练完全不用真实图像。
7. 和你学的 Flow Matching、ODE 怎么联系?
Flow Matching 主要解决"怎样学习一个推动分布演化的速度场"。 生成时,通常还需要沿着这个速度场,通过 ODE 数值求解逐步更新样本。(arXiv)
DMD 主要解决"怎样利用已有生成模型,训练出一步或少步生成的学生"。 对一步学生来说,它学习的是直接的噪声到结果映射,因此推理时不需要沿教师的轨迹做多步积分。(arXiv)
可以用一个类比区分:
优化 ODE 求解器,是尽量沿着原来的路线,用更少次计算走到终点。
DMD 蒸馏,是重新训练一个生成器,让它更直接地产生符合目标分布的终点。
所以,DMD 不是一种新的 U-Net 或 Transformer 架构,也不是一种新的 ODE 求解器,而是一种通过分布级监督训练快速生成器的方法。
最后把核心串起来就是:
学生先生成样本,再对样本加噪;冻结教师估计目标分布的 score,动态训练的辅助模型估计学生分布的 score;两者的差异用于指导学生更新。训练完成后,只保留学生承担核心生成任务,从而把多步生成压缩到一步或少步。 (天韦印)
score的理解
1. Score 不是"当前位置有多好",而是"当前位置往哪里走"
你前面已经接触了概率密度 (p(x))。可以把它想象成一张地形图:某个位置的"高度",表示那个位置附近的概率密度。
这时,两件事不同:
概率密度 (p(x)) 回答:"当前位置有多高?"
Score (s(x)) 回答:"站在这里,往哪个方向稍微移动,能让对数概率密度增加得最快?"
它的定义是:
s ( x ) = ∇ x log p ( x ) \boxed{s(x)=\nabla_x\log p(x)} s(x)=∇xlogp(x)
注意,这里是对样本 (x) 求梯度 ,不是对网络参数求梯度。对于多维样本,score 是方向向量;对于一维数字,它就是一个带正负号的数。(杨松)
一个反例就能说明它不是"质量评分"
假设分布是以 0 为中心的标准高斯分布,它的 score 可以算出:
s ( x ) = − x s(x)=-x s(x)=−x
因此,在 (x=-2) 时,score 是 (+2),表示向右移动;在 (x=2) 时,score 是 (-2),表示向左移动。
在概率密度最高的 (x=0) 处,score 反而是 0。
因为那里已经位于峰顶,局部斜率为零。
所以:
Score 为负,不是图片不好;score 为正,不是图片好;score 为零,也不是图片得了零分。它们表达的是局部变化方向。
对于图像,score 的每个分量对应一个像素通道或 latent 分量的局部调整方向,但这些方向是根据整个样本的联合分布决定的,不是在给每个像素独立评优劣。
2. DMD 的两个 score,分别在指向什么?
DMD 先让学生生成结果,再加噪得到 (x_t)。然后,将同一个 (x_t)、同一个噪声级别 (t) 交给两个模型。条件生成时,也固定相同的条件。两个模型分别估计目标分布与学生当前分布在该噪声级别下的 score。(arXiv)
教师提供的 real score:
"按照目标分布,站在 (x_t) 这里,往哪里移动会进入密度更高的区域?"
辅助模型提供的 fake score:
"按照学生目前实际生成的分布,站在同一个 (x_t) 这里,往哪里移动会进入密度更高的区域?"
这里的 fake 只是指"来自学生生成的分布",不是"这张图有多假"。
为方便理解,暂时省略时间权重和加噪缩放系数,DMD 提供的样本调整方向是:
d ( x t ) = s real ( x t , t ) − s fake ( x t , t ) \boxed{ d(x_t)=s_{\text{real}}(x_t,t)-s_{\text{fake}}(x_t,t) } d(xt)=sreal(xt,t)−sfake(xt,t)
这个差值会通过反向传播用于更新学生,而不是作为一个标量质量分数。(天韦印)
下面用数字算出它的含义。
3. 例子一:学生整体偏右,两个 score 的差会让它整体左移
假设在某个固定噪声级别下:
目标分布: p = N ( 0 , 1 ) \text{目标分布:}\quad p=\mathcal N(0,1) 目标分布:p=N(0,1)
学生分布: q = N ( 2 , 1 ) \text{学生分布:}\quad q=\mathcal N(2,1) 学生分布:q=N(2,1)
也就是,两边的形状、宽度完全相同,只是目标以 0 为中心,学生以 2 为中心。
这时,我们希望纠正的是:
学生整体偏右了,应该往左调整,而不是把所有结果都挤成一个数字。
对于方差为 1、均值为 (\mu) 的高斯分布,score 为 (\mu-y)。因此:
s real ( y ) = − y , s fake ( y ) = 2 − y s_{\text{real}}(y)=-y, \qquad s_{\text{fake}}(y)=2-y sreal(y)=−y,sfake(y)=2−y
计算几个位置:
| 当前带噪位置 (y) | 教师 score | 学生分布 score | 差值:教师 − 学生分布 |
|---|---|---|---|
| 1 | −1 | +1 | −2 |
| 2 | −2 | 0 | −2 |
| 3 | −3 | −1 | −2 |
为什么在 (y=3) 处是这样?
目标分布以 0 为中心,所以教师指引向左,score 是 (-3)。
学生分布以 2 为中心,所以辅助模型也指引向左,score 是 (-1)。
两者相减:
− 3 − ( − 1 ) = − 2 -3-(-1)=-2 −3−(−1)=−2
为什么在 (y=1) 处仍然是 −2?
教师指引向左,score 是 (-1)。
辅助模型指引向右,因为学生分布的中心在 2,score 是 (+1)。
两者相减:
− 1 − ( + 1 ) = − 2 -1-(+1)=-2 −1−(+1)=−2
结果是:不同位置获得了相同的左移方向。
在这个理想化例子里,直接按该方向调整样本,会平移整团分布,而不是改变它的宽度。这恰好对应我们想修正的"整体偏右"。
这就是"分布匹配"与"让每个样本都往高密度位置挤"的区别。
4. 为什么不能只用教师 score?因为"更高密度"不等于"正确分布"
情况一:学生已经学对了,也不能继续往峰顶挤
假设学生已经完全匹配目标:
q = p = N ( 0 , 1 ) q=p=\mathcal N(0,1) q=p=N(0,1)
这时,学生生成一些接近 0 的数字,也会生成一些离 0 更远的数字。这种分散本来就是正确的。
但是,如果继续让每个样本单独沿教师 score 移动:
y new = y + η ( − y ) = ( 1 − η ) y y_{\text{new}}= y+\eta(-y)= (1-\eta)y ynew=y+η(−y)=(1−η)y
所有样本都会往 0 收缩,整个分布越来越窄。
也就是说:
每个样本都更靠近高密度位置了,但整体分布反而被改错了。
而使用两个 score 的差时,因为 (p=q),所以处处都有:
s real ( y ) − s fake ( y ) = 0 s_{\text{real}}(y)-s_{\text{fake}}(y)=0 sreal(y)−sfake(y)=0
已经匹配好的分布,就不会再受到这项分布匹配信号的推动。
情况二:学生太集中,正确方向甚至可能与教师 score 相反
再假设:
p = N ( 0 , 1 ) , q = N ( 0 , 0.25 ) p=\mathcal N(0,1), \qquad q=\mathcal N(0,0.25) p=N(0,1),q=N(0,0.25)
两边都以 0 为中心,但学生的方差只有 (0.25),生成结果太集中,缺少目标应有的分散程度。
在位置 (y=0.5):
s real = − 0.5 , s fake = − 2 s_{\text{real}}=-0.5, \qquad s_{\text{fake}}=-2 sreal=−0.5,sfake=−2
所以:
s real − s fake = − 0.5 − ( − 2 ) = + 1.5 \boxed{ s_{\text{real}}-s_{\text{fake}}= -0.5-(-2)= +1.5 } sreal−sfake=−0.5−(−2)=+1.5
教师 score 单独指向左边,但最终差值却指向右边!
这并不矛盾。因为此时需要修正的不是"离中心太远",而是"学生整体太挤了"。右侧样本适当向右移动、左侧样本适当向左移动,才有助于恢复正确宽度。
这两个例子说明:
教师 score 提供目标分布的信息;减去 fake score,让调整同时考虑学生现在已经形成了怎样的分布。
原始 DMD 论文也用实验区分了"只沿 real score 优化"和"用两个 score 做分布匹配"。不过,后者并不保证实际训练一定覆盖所有模式,原始方法仍加入了回归正则来缓解模式丢失。(arXiv)
5. 从数学上看,这个差值在比较什么?
把两个 score 的定义相减:
s real ( y ) − s fake ( y ) = ∇ y log p ( y ) − ∇ y log q ( y ) = ∇ y log p ( y ) q ( y ) \begin{aligned} s_{\text{real}}(y)-s_{\text{fake}}(y) &=\nabla_y\log p(y)-\nabla_y\log q(y)\\ &=\boxed{\nabla_y\log\frac{p(y)}{q(y)}} \end{aligned} sreal(y)−sfake(y)=∇ylogp(y)−∇ylogq(y)=∇ylogq(y)p(y)
这不是单独看 (p(y)) 有多大,而是在看目标密度相对于学生密度的比值,往哪个方向增加。
可以这样理解:
只看教师: 哪边在目标分布下更常见?
比较两者: 考虑到学生现在已经生成了多少,哪边相对更需要得到支持?
但这里还有个重要细节:score 差提供的是这个比值的局部变化方向,不是直接输出"这个区域缺了多少样本"。 它不是全局统计报告。
DMD 的理论联系在于:分布之间的反向 KL 散度,其生成器参数梯度可以用这样的 score 差来表达。因此,差值不是凭直觉设计的"两个评价器相减",而是来自分布优化目标。(arXiv)
6. 网络实际输出的不是噪声吗?怎么又变成 score 了?
它们可以相互换算。
以预测干净样本的形式为例。加噪过程是:
x t = α t x + σ t ϵ x_t=\alpha_t x+\sigma_t\epsilon xt=αtx+σtϵ
去噪模型给出干净样本的估计 (\hat x),对应的 score 估计是:
s ( x t , t ) = α t x ^ − x t σ t 2 s(x_t,t)= \frac{\alpha_t\hat x-x_t}{\sigma_t^2} s(xt,t)=σt2αtx^−xt
于是,两个模型看到同一个 (x_t) 时:
s real − s fake = α t σ t 2 ( x ^ real − x ^ fake ) \boxed{ s_{\text{real}}-s_{\text{fake}}= \frac{\alpha_t}{\sigma_t^2} \left( \hat x_{\text{real}}-\hat x_{\text{fake}} \right) } sreal−sfake=σt2αt(x^real−x^fake)
也就是说,两个 score 的差,也可以转化为两个去噪预测的差,再乘上对应系数 。实际网络采用噪声预测形式时,同样可以换算。(arXiv)
所以,它不是让教师生成一张完整图片,再让另一个模型给这张图片评分,而是:
同一个带噪输入,在"目标分布的去噪规律"和"学生分布的去噪规律"下,会得到不同的预测;这个差异被用来训练学生。
7. 最后,差值是"损失",还是"梯度"?
更准确地说,它是用来构造梯度的信号,不是直接把两个 score 相减,就得到了一个普通标量损失。
DMD 的实际生成器训练,是把"学生输出应该怎样改变"的信号,通过反向传播转换成"学生参数应该怎样改变"的信号。
这里也容易混淆符号:
s real − s fake ⏟ 希望推动样本的方向 对应 s fake − s real ⏟ 传回去的梯度方向 \underbrace{s_{\text{real}}-s_{\text{fake}}}{\text{希望推动样本的方向}} \qquad\text{对应}\qquad \underbrace{s{\text{fake}}-s_{\text{real}}}_{\text{传回去的梯度方向}} 希望推动样本的方向 sreal−sfake对应传回去的梯度方向 sfake−sreal
因为梯度下降会减去梯度 。实际还会包含时间权重和加噪缩放系数。(arXiv)
也不要把它误解为直接最小化:
∥ s real − s fake ∥ 2 \left\|s_{\text{real}}-s_{\text{fake}}\right\|^2 ∥sreal−sfake∥2
并对两个 score 网络一路反向传播。官方 DMD2 实现会先在不记录梯度的情况下计算两者预测及其差异,再构造带有 detach 的代理损失,把需要的梯度送给生成器。辅助模型则另外通过去噪任务学习学生分布。(GitHub)
所以,你可以把 DMD 的核心复述为:
DMD 不是让两个模型给图片打高低分,而是让两个去噪模型分别估计目标分布和学生当前分布的局部方向。两者相减后,得到考虑了"目标与现状差异"的训练信号,再通过反向传播更新学生。这样优化的重点是让学生的整体生成分布接近目标,而不是单纯把每个样本都推到目标分布的峰顶。
还是通过加噪预测噪声 来训练学习输出score的
还是没明白,之前看到的score是根据概率分布(目标分布和学生真实分布)算的;怎么突然就变成了期望之类的,还有 教师去噪模型和辅助去噪模型训练的时候都是通过预测噪声 训练的吗?不是说学的是输出分布的理解吗?为什么还是在采样噪声
你现在卡住的点非常准确:我们前面明明说 score 是从"分布 (p(x))"定义出来的,怎么到了神经网络训练时,突然又在采样噪声、预测噪声、算条件期望?
其实这里有两层:
第一层是数学定义:score 是由分布定义的。
第二层是实际训练:因为这个分布的概率密度根本算不出来,所以需要找一种办法,让神经网络间接学到这个 score。
"预测噪声"就是这个间接学习 score 的办法。
1. 先固定住:score 的定义从来没有变
假设有一个真实图像分布:
p real ( x 0 ) p_{\text{real}}(x_0) preal(x0)
给这些图片加到时间 (t) 的噪声后,会形成另一个分布:
p real , t ( x t ) p_{\text{real},t}(x_t) preal,t(xt)
那么 real score 永远定义为:
s real ( x t , t ) = ∇ x t log p real , t ( x t ) \boxed{ s_{\text{real}}(x_t,t)= \nabla_{x_t}\log p_{\text{real},t}(x_t) } sreal(xt,t)=∇xtlogpreal,t(xt)
学生也一样。
学生生成器反复生成:
x 0 = G θ ( z ) x_0=G_\theta(z) x0=Gθ(z)
这些结果形成:
p fake ( x 0 ) p_{\text{fake}}(x_0) pfake(x0)
给它们加到时间 (t) 的噪声:
p fake , t ( x t ) p_{\text{fake},t}(x_t) pfake,t(xt)
它的 score:
s fake ( x t , t ) = ∇ x t log p fake , t ( x t ) \boxed{ s_{\text{fake}}(x_t,t)= \nabla_{x_t}\log p_{\text{fake},t}(x_t) } sfake(xt,t)=∇xtlogpfake,t(xt)
这一直没变。
问题只是:
我手里只有很多图片样本,怎么真的算出
(\nabla_{x_t}\log p_t(x_t))?
这才引出了"预测噪声"。
2. 为什么不能直接根据图片样本算 score?
假设你有:
text
100 万张真实图片
这些图片当然来自某个真实分布:
p data ( x ) p_{\text{data}}(x) pdata(x)
但是你能写出这个函数吗?
比如输入一张:
一只猫站在沙发上的 512×512 图片
你能直接算:
p data ( x ) = ? p_{\text{data}}(x)=? pdata(x)=?
基本不行。
更别说:
∇ x log p data ( x ) \nabla_x\log p_{\text{data}}(x) ∇xlogpdata(x)
了。
所以我们遇到了一个很典型的问题:
我知道这个分布存在,也能从中拿到样本,但不知道它的概率密度函数的解析表达式。
这时候就需要 score matching / denoising score matching:
不显式计算 (p(x)),直接训练一个神经网络去学习它的 score。
3. 那为什么"加噪 + 预测噪声"可以学 score?
这就是最核心的一步。
假设加噪:
x t = α t x 0 + σ t ϵ \boxed{ x_t=\alpha_t x_0+\sigma_t\epsilon } xt=αtx0+σtϵ
其中:
ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ∼N(0,I)
现在先假设我把 (x_0) 也告诉你。
那么对于固定的 (x_0),(x_t) 的分布其实非常简单:
p ( x t ∣ x 0 ) = N ( α t x 0 , σ t 2 I ) p(x_t\mid x_0)= \mathcal N( \alpha_t x_0, \sigma_t^2I ) p(xt∣x0)=N(αtx0,σt2I)
这就是一个高斯分布。
而高斯的 score 我们会算。
4. 固定 (x_0) 时,score 可以直接算出来
高斯:
p ( x t ∣ x 0 ) = N ( α t x 0 , σ t 2 I ) p(x_t\mid x_0)= \mathcal N( \alpha_t x_0,\sigma_t^2 I ) p(xt∣x0)=N(αtx0,σt2I)
它对 (x_t) 的 score 是:
∇ x t log p ( x t ∣ x 0 ) = − x t − α t x 0 σ t 2 \nabla_{x_t}\log p(x_t\mid x_0)= -\frac{ x_t-\alpha_t x_0 }{ \sigma_t^2 } ∇xtlogp(xt∣x0)=−σt2xt−αtx0
但是根据加噪公式:
x t − α t x 0 = σ t ϵ x_t-\alpha_t x_0= \sigma_t\epsilon xt−αtx0=σtϵ
所以:
∇ x t log p ( x t ∣ x 0 ) = − ϵ σ t \boxed{ \nabla_{x_t}\log p(x_t\mid x_0)= -\frac{\epsilon}{\sigma_t} } ∇xtlogp(xt∣x0)=−σtϵ
你看:
对于"固定某张原图 (x_0)"的条件分布来说,知道噪声 (\epsilon),就等价于知道这个条件分布的 score。
这就是噪声第一次出现的原因。
不是突然不研究分布了。
恰恰相反:
因为高斯加噪后的条件分布有解析 score,而这个 score 就和加入的噪声直接相关。
5. 但是我们真正要的不是 (p(x_t\mid x_0)) 的 score
真正需要的是:
p t ( x t ) \boxed{ p_t(x_t) } pt(xt)
也就是所有真实图片加噪以后形成的整体分布。
注意区别:
条件分布
固定:
x 0 = 这一张猫图 x_0=\text{这一张猫图} x0=这一张猫图
然后加不同噪声:
p ( x t ∣ x 0 ) p(x_t\mid x_0) p(xt∣x0)
是一团以这张猫图为中心的高斯云。
整体分布
所有:
text
猫图
狗图
汽车
房屋
......
分别形成一团高斯云,全部混在一起:
p t ( x t ) p_t(x_t) pt(xt)
这才是 diffusion 真正研究的加噪数据分布。
6. "期望"就是在这里出现的
这一步是你目前最需要理解的。
假设现在给你一个具体:
x t x_t xt
问题是:
它到底是由哪一张 (x_0) 加哪一份噪声得到的?
我们不知道。
比如极简一维:
x t = x 0 + ϵ x_t=x_0+\epsilon xt=x0+ϵ
现在:
x t = 1 x_t=1 xt=1
它可能来自:
x 0 = 0 , ϵ = 1 x_0=0,\epsilon=1 x0=0,ϵ=1
也可能来自:
x 0 = 2 , ϵ = − 1 x_0=2,\epsilon=-1 x0=2,ϵ=−1
甚至还有很多其他可能。
所以对同一个 (x_t),不存在唯一的:
ϵ \epsilon ϵ
但我们想知道整体分布:
p t ( x t ) p_t(x_t) pt(xt)
在这里的 score。
有一个非常重要的数学关系:
∇ x t log p t ( x t ) = E ∇ x t log p ( x t ∣ x 0 ) ∣ x t \boxed{ \nabla_{x_t}\log p_t(x_t)= \mathbb E \\nabla_{x_t}\\log p(x_t\\mid x_0) \\mid x_t } ∇xtlogpt(xt)=E∇xtlogp(xt∣x0)∣xt
刚才条件 score 是:
∇ x t log p ( x t ∣ x 0 ) = − ϵ σ t \nabla_{x_t}\log p(x_t\mid x_0)= -\frac{\epsilon}{\sigma_t} ∇xtlogp(xt∣x0)=−σtϵ
代进去:
∇ x t log p t ( x t ) = − 1 σ t E ϵ ∣ x t \boxed{ \nabla_{x_t}\log p_t(x_t)= -\frac{1}{\sigma_t} \mathbb E\\epsilon\\mid x_t } ∇xtlogpt(xt)=−σt1Eϵ∣xt
这就是期望突然出现的来源。
不是 score 定义变成了期望。
而是:
整体分布的 score,可以写成"所有可能来源的条件 score 的加权平均"。
7. 用一个具体数字例子你会瞬间清楚
假设世界里只有两种干净样本:
x 0 = 0 x_0=0 x0=0
和:
x 0 = 2 x_0=2 x0=2
加噪:
x t = x 0 + ϵ x_t=x_0+\epsilon xt=x0+ϵ
现在我们观察:
x t = 1 x_t=1 xt=1
可能有两种情况:
情况 A
x 0 = 0 x_0=0 x0=0
那么:
ϵ = 1 \epsilon=1 ϵ=1
条件 score:
− ϵ = − 1 -\epsilon=-1 −ϵ=−1
表示向左。
情况 B
x 0 = 2 x_0=2 x0=2
那么:
ϵ = − 1 \epsilon=-1 ϵ=−1
条件 score:
− ϵ = + 1 -\epsilon=+1 −ϵ=+1
表示向右。
现在关键来了:
如果真实数据分布是:
P ( x 0 = 0 ) = 90 % P(x_0=0)=90\% P(x0=0)=90%
P ( x 0 = 2 ) = 10 % P(x_0=2)=10\% P(x0=2)=10%
那么看到 (x_t=1) 后,我们更倾向认为:
它原来来自 0,然后加了 +1 的噪声。
于是:
E ϵ ∣ x t = 1 E\\epsilon\\mid x_t=1 Eϵ∣xt=1
大概偏正。
比如在这个对称的极简例子里可以理解成:
0.9 × 1 + 0.1 × ( − 1 ) = 0.8 0.9\times 1 + 0.1\times(-1)= 0.8 0.9×1+0.1×(−1)=0.8
于是 score:
s ( 1 ) = − 0.8 s(1)=-0.8 s(1)=−0.8
向左。
因为这个分布本来就更多集中在 0。
如果学生分布正好相反:
P fake ( x 0 = 0 ) = 10 % P_{\text{fake}}(x_0=0)=10\% Pfake(x0=0)=10%
P fake ( x 0 = 2 ) = 90 % P_{\text{fake}}(x_0=2)=90\% Pfake(x0=2)=90%
同样看到:
x t = 1 x_t=1 xt=1
fake 模型会得到:
E fake ϵ ∣ 1 ≈ − 0.8 E_{\text{fake}}\\epsilon\\mid1 \approx-0.8 Efakeϵ∣1≈−0.8
于是:
s fake ( 1 ) = + 0.8 s_{\text{fake}}(1)=+0.8 sfake(1)=+0.8
向右。
看到没有?
完全相同的 (x_t=1)
真实分布告诉你:
text
←
学生分布告诉你:
text
→
为什么?
因为底层分布不同。
所以噪声预测绝对不是在单纯"猜随机噪声"。
它背后实际上是在回答:
"根据我见过的数据分布,这个 (x_t) 更可能是由什么样的干净样本加噪产生的?"
8. 现在回答你的第二个问题:Teacher 到底怎么训练?
Teacher 去噪模型
Teacher 本质上就是一个已经训练好的 diffusion model。
训练的时候取真实图片:
x 0 ∼ p real x_0\sim p_{\text{real}} x0∼preal
采样:
ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ∼N(0,I)
构造:
x t = α t x 0 + σ t ϵ x_t=\alpha_tx_0+\sigma_t\epsilon xt=αtx0+σtϵ
然后根据它的参数化方式训练。
经典 DDPM 可能预测:
ϵ \epsilon ϵ
loss:
L = ∥ ϵ θ ( x t , t ) − ϵ ∥ 2 \boxed{ L= \|\epsilon_\theta(x_t,t)-\epsilon\|^2 } L=∥ϵθ(xt,t)−ϵ∥2
但也可能预测:
- (x_0)
- velocity (v)
- 其他等价参数化
所以严格来说:
Teacher 不一定必须是 epsilon-prediction,但它是通过 diffusion / denoising objective 学到真实数据的 score 信息。
9. 辅助 fake-score 模型怎么训练?
也是类似的。
区别是它的"干净图片"不是来自真实数据:
x 0 ∼ p real x_0\sim p_{\text{real}} x0∼preal
而是来自学生:
x 0 = G θ ( z ) \boxed{ x_0=G_\theta(z) } x0=Gθ(z)
然后:
ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ∼N(0,I)
构造:
x t = α t x 0 + σ t ϵ x_t=\alpha_tx_0+\sigma_t\epsilon xt=αtx0+σtϵ
再训练辅助模型预测这个噪声:
L fake = ∥ ϵ ϕ ( x t , t ) − ϵ ∥ 2 \boxed{ L_{\text{fake}}= \| \epsilon_\phi(x_t,t)-\epsilon \|^2 } Lfake=∥ϵϕ(xt,t)−ϵ∥2
于是它最终学到:
ϵ ϕ ( x t , t ) ≈ E fake ϵ ∣ x t \epsilon_\phi(x_t,t) \approx E_{\text{fake}}\\epsilon\\mid x_t ϵϕ(xt,t)≈Efakeϵ∣xt
因此:
s fake ≈ − ϵ ϕ σ t \boxed{ s_{\text{fake}} \approx -\frac{ \epsilon_\phi }{\sigma_t} } sfake≈−σtϵϕ
所以辅助模型确实是通过普通的 diffusion 去噪训练来学习学生生成分布的 score。
10. "不是说学的是输出分布的理解吗?"
对。
但你要把"学分布"理解成:
不是给它一个标签:'这是你的分布'。
而是:
用大量从这个分布采出来的样本训练一个去噪任务;当这个去噪任务学好以后,它数学上等价于学到了这个分布在各个噪声级别下的 score field。
所以:
text
学生不断生成图片
↓
这些图片形成 p_fake
↓
从 p_fake 采样图片
↓
人为加高斯噪声
↓
训练辅助模型预测噪声
↓
学到 E[ε | x_t]
↓
等价得到
∇ log p_fake,t(x_t)
↓
也就是学生分布的 score
所以所谓:
"辅助模型理解学生分布"
具体落到训练操作上,就是:
在学生生成的数据上训练一个 diffusion denoiser。
11. 为什么还要"采样噪声"?不是已经有学生分布了吗?
因为我们的目标不是直接拟合:
p fake ( x 0 ) p_{\text{fake}}(x_0) pfake(x0)
的显式概率密度。
我们通过 Gaussian corruption + denoising score matching 来学习 score。
而这套方法需要人为构造:
x t x_t xt
所以需要:
ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ∼N(0,I)
注意这里的噪声只是训练工具。
你可以把它理解成一个已知的"探针":
我故意对样本施加一个已知扰动,再训练模型恢复这个扰动;通过它的恢复规律,间接推断原始数据分布的结构。
12. 一个很形象的类比
假设桌面上有很多铁屑,但你看不清它们背后的磁场。
你可以不断:
- 把铁屑随机扰动一下;
- 看它们在磁场影响下"应该怎么回去";
- 学习这些恢复方向。
最终就能反推出:
这个空间的场大概长什么样。
Diffusion 的去噪任务也有点类似:
text
数据分布
↓
人为加已知噪声
↓
学习怎么"去掉"这些噪声
↓
得到各个位置的局部方向
↓
学到 score field
13. 最后把 DMD 整条链重新串起来
Real / Teacher
真实图片:
x 0 ∼ p real x_0\sim p_{\text{real}} x0∼preal
Teacher 已经通过 diffusion 去噪训练学到了:
s real ( x t , t ) s_{\text{real}}(x_t,t) sreal(xt,t)
Fake / Student distribution
学生:
x 0 = G θ ( z ) x_0=G_\theta(z) x0=Gθ(z)
大量学生输出形成:
p fake p_{\text{fake}} pfake
辅助模型在这些学生图片上做:
x t = α t x 0 + σ t ϵ x_t=\alpha_tx_0+\sigma_t\epsilon xt=αtx0+σtϵ
并预测:
ϵ \epsilon ϵ
于是学到:
s fake ( x t , t ) s_{\text{fake}}(x_t,t) sfake(xt,t)
DMD
同一个:
x t x_t xt
送给两个模型:
text
Teacher
↙
同一个 x_t
↘
Fake score model
得到:
s real s_{\text{real}} sreal
和:
s fake s_{\text{fake}} sfake
再计算差:
s real − s fake \boxed{ s_{\text{real}}-s_{\text{fake}} } sreal−sfake
去修正学生生成器。
你现在最应该记住的一句话是:
Score 的定义一直是 (\nabla_x\log p(x)),从来没有变成"噪声"。只是现实中我们不知道高维图像分布的显式 (p(x)),因此通过给分布中的样本人为加入已知高斯噪声、训练模型预测噪声。最优噪声预测等于 (E\\epsilon\\mid x_t),而这个条件期望又与加噪分布的 score 有严格的一一对应关系,所以"预测噪声"只是实际训练 score estimator 的一种方式。
如果这层通了,DMD 里为什么要有 teacher denoiser + fake denoiser 就基本完全通了。