图像生成领域的Diffusion模型近年来表现抢眼,其核心思路是训练一个神经网络来逆转一个逐步加噪的过程。前向扩散时,我们不断往真实图像上叠加高斯噪声,经过足够多步后图像会变成纯噪声;反向扩散时,网络需要学会从噪声中一步步恢复出清晰图像。在这个过程中,神经网络在每一步接收带噪图像和时间步信息,输出一个预测结果。而这个预测结果应该是什么,直接决定了训练目标的定义。目前最常见的两种选择是预测噪声和预测原图。

从直觉上看,预测噪声意味着让网络学会“擦除”每一步添加的噪声,而预测原图则要求网络直接输出干净图像。虽然两者在数学上可以通过重参数化相互转换,但实际训练中的行为和效果差异很大。接下来我们分别拆解这两种训练目标,并讨论为什么预测噪声成为当前主流方案。
预测噪声:从DDPM开始的主流选择
DDPM(Denoising Diffusion Probabilistic Models)奠定了预测噪声目标的基础。在前向扩散过程中,图像\(x_0\)经过\(T\)步逐渐添加高斯噪声,每一步可以表示为\(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \epsilon\),其中\(\epsilon\)是标准高斯噪声,\(\bar{\alpha}_t\)是累积的信号保留系数。神经网络\(\epsilon_\theta(x_t, t)\)接收带噪图像\(x_t\)和时间步\(t\),目标是预测出实际添加的噪声\(\epsilon\)。训练时使用均方误差损失:\(L = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon_\theta(x_t, t) - \epsilon \|^2 \right]\)。由于噪声服从简单的高斯分布,网络只需学习一个同维度的映射,这大大降低了优化难度。
下面是一段PyTorch风格的训练循环示例,展示了预测噪声目标的实现细节。代码中通过累积系数\(\bar{\alpha}_t\)生成带噪图像,然后计算预测噪声与实际噪声的MSE损失。
import torch
import torch.nn.functional as F
def train_step_epsilon(model, x_0, optimizer, alpha_bar_t):
batch_size = x_0.shape[0]
t = torch.randint(1, T, (batch_size,), device=x_0.device)
noise = torch.randn_like(x_0)
alpha_t = alpha_bar_t[t].view(-1, 1, 1, 1)
x_t = torch.sqrt(alpha_t) * x_0 + torch.sqrt(1 - alpha_t) * noise
pred_noise = model(x_t, t)
loss = F.mse_loss(pred_noise, noise)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item()
预测噪声目标的一大优势是训练稳定。因为在任意时间步\(t\),噪声都来自标准正态分布,网络输出的尺度相对固定,梯度幅度不会剧烈波动。这使得模型可以使用较大的学习率,训练过程更加平滑。同时,生成时使用迭代去噪公式\(x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) + \sigma_t z\),可以逐步还原图像。不过这种目标也有缺点:它不直接提供中间步骤的清晰图像,导致无法方便地进行图像编辑或可视化去噪过程;此外在高噪声步骤中,噪声占比很大,预测误差会被放大,影响最终生成质量。
预测原图:更直观但挑战更大
另一种训练目标是让网络直接预测去噪后的原图,即\(x_0^\theta(x_t, t)\)。损失函数变为\(L = \mathbb{E}_{t, x_0, \epsilon} \left[ \| x_0^\theta(x_t, t) - x_0 \|^2 \right]\)。这种目标在概念上非常直观:我们希望网络在每个时间步都能输出一张清晰图像,这样在生成过程中可以直接观察中间结果,也便于引入感知损失或对抗损失来提升图像质量。从数学上看,一旦网络输出了\(x_0\)的预测值,可以通过公式\(\epsilon_\theta = \frac{x_t - \sqrt{\bar{\alpha}_t} x_0^\theta}{\sqrt{1-\bar{\alpha}_t}}\)转换回噪声预测,因此两种目标在理论上是等价的。
预测原图的训练代码与预测噪声类似,只是损失函数计算的对象不同。以下示例展示了如何训练一个输出原图的网络。
def train_step_x0(model, x_0, optimizer, alpha_bar_t):
batch_size = x_0.shape[0]
t = torch.randint(1, T, (batch_size,), device=x_0.device)
noise = torch.randn_like(x_0)
alpha_t = alpha_bar_t[t].view(-1, 1, 1, 1)
x_t = torch.sqrt(alpha_t) * x_0 + torch.sqrt(1 - alpha_t) * noise
pred_x0 = model(x_t, t)
loss = F.mse_loss(pred_x0, x_0)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss.item()
然而,预测原图在实际训练中面临更多困难。当时间步\(t\)较大时,带噪图像\(x_t\)中噪声占据主导地位,图像内容几乎被完全掩盖,此时要求网络直接恢复出清晰原图是一项极具挑战的任务。损失函数的梯度在这些高噪声步骤会变得非常大,容易导致训练不稳定,甚至出现梯度爆炸。同时,由于原图分布远比高斯噪声复杂,网络需要学习更复杂的映射,收敛速度通常慢于预测噪声。因此,虽然预测原图在图像编辑、超分辨率等需要中间可视化或语义控制的场景中具有优势,但大多数大规模生成模型并没有直接采用它。
两种训练目标对比:为什么预测噪声成为主流?
从数学关系上看,预测噪声和预测原图之间存在一个与时间步相关的缩放因子。将预测原图的损失对网络参数的梯度展开,可以发现它等价于预测噪声损失的梯度乘以一个与\(\bar{\alpha}_t\)有关的权重。具体来说,对\(x_0\)预测的MSE损失相当于对噪声预测的MSE损失施加了一个\( \frac{1-\bar{\alpha}_t}{\bar{\alpha}_t} \)的加权。当\(t\)较小时,\(\bar{\alpha}_t\)接近1,权重较小;当\(t\)较大时,权重非常大,这导致高噪声步骤的梯度主导训练,从而使得优化不稳定。预测噪声目标则天然具有均匀的梯度尺度,因为噪声本身不随\(t\)改变分布,这种隐式的梯度均衡是它训练稳定的重要原因。
实际模型的选择也印证了这一点。DDPM及其后续变体(如Improved DDPM、ADM)均采用预测噪声。Stable Diffusion、DALL·E 2等大规模文本到图像模型同样基于噪声预测目标,并结合Classifier-Free Guidance技术进一步提升生成质量。这些成功案例表明,预测噪声在经过充分调优后能够取得极佳的图像生成效果,并且在训练超大规模模型时稳定性至关重要。而预测原图虽然在早期一些工作中被使用过,但后来大多被噪声预测或混合目标取代。此外,还有研究者提出了v-prediction(预测速度场)作为折中方案,它同时利用了噪声和原图的信息,在部分任务上表现出更好的数值稳定性。
那么在实际项目中应该如何选择呢?如果目标是训练一个高质量的图像生成模型,建议优先采用预测噪声,因为它经过了大量实践验证,训练稳定,生态工具完善。如果任务需要模型在去噪中间步骤输出有意义的清晰图像(例如图像编辑、超分辨率、医学影像重建等),预测原图可能更有优势,但需要注意以下几点:使用较小的学习率,对损失函数按时间步进行加权(如使用SNR加权),或者采用混合目标在训练初期使用噪声预测、后期切换为原图预测。此外,也可以考虑使用v-prediction作为折中,它在某些数据集上能同时获得两者的优点。总的来说,两种训练目标并非互斥,理解它们的本质差异有助于我们在具体任务中做出更合理的设计。
Diffusion模型预测噪声预测原图修改时间:2026-09-23 20:39:51