Diffusion Models
扩散模型通过学习逐步逆转渐进式加噪过程,从纯噪声一步步生成新的图像、视频和音频样本。
扩散模型是通过学习逆转逐步加噪过程来创建数据的生成式 AI模型。在训练期间,图像或其他数据会经过许多小步骤,逐步加入高斯噪声;神经网络则学会预测每一步的噪声。生成时,模型从纯随机噪声开始,逐步去噪,直到生成新的样本。Jascha Sohl-Dickstein 及其同事于 2015 年在论文《使用非平衡热力学进行深度无监督学习》中提出了这种方法;Jonathan Ho、Ajay Jain 和 Pieter Abbeel 于 2020 年通过《去噪扩散概率模型(DDPM)》让这种方法具备了竞争力,该模型在 CIFAR-10上创下了 3.17 的 FID最先进成绩。2021 年,OpenAI 研究人员证明扩散模型在 ImageNet图像合成上优于 GAN;如今,扩散模型及其流匹配变体为文生图系统(如 Stable Diffusion)、视频生成器、图像编辑器和科学模型提供支持。
扩散模型的工作原理#
正向过程是固定的,而非通过学习得到。它在 T 个步骤中的每一步都加入少量高斯噪声;DDPM 使用 T = 1,000,噪声方差则从每步的 0.0001 线性增加到 0.02。由于高斯噪声之和仍然是高斯分布,训练图像可以通过闭式公式直接跳到任意步骤 t:xt = sqrt(alpha_bar_t) * x0 + sqrt(1 - alpha_bar_t) * noise,其中 alpha_bar_t 是前 t 个步骤中 1 - beta 的乘积。训练时会反复选取一张图像、一个随机步骤和新的噪声,构造 xt,并用均方误差教网络预测该噪声;这就是 DDPM 的简化目标。下面的代码使用 DDPM 的噪声调度对照片应用正向过程:
import urllib.request
import numpy as np
import torch
from PIL import Image
# DDPM's linear schedule: 1,000 steps whose noise variance rises from 0.0001 to 0.02
betas = torch.linspace(1e-4, 0.02, 1000)
alpha_bar = torch.cumprod(1 - betas, dim=0)
# Load a photo and scale its pixels to [-1, 1]
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg")).convert("RGB").resize((256, 256))
x0 = torch.tensor(np.array(image), dtype=torch.float32).permute(2, 0, 1) / 127.5 - 1
# Jump straight to step t in closed form: x_t = sqrt(alpha_bar) * x0 + sqrt(1 - alpha_bar) * noise
frames = []
for t in (0, 99, 299, 599, 999):
xt = alpha_bar[t].sqrt() * x0 + (1 - alpha_bar[t]).sqrt() * torch.randn_like(x0)
frames.append(((xt.clamp(-1, 1) + 1) * 127.5).byte().permute(1, 2, 0).numpy())
print(f"step {t + 1}: image weight {alpha_bar[t].sqrt():.3f}, noise weight {(1 - alpha_bar[t]).sqrt():.3f}")
Image.fromarray(np.hstack(frames)).save("forward_diffusion.jpg")图像权重从第 1 步的 1.000 下降到第 100 步的 0.947、第 300 步的 0.630、第 600 步的 0.161,以及第 1,000 步的 0.006,而噪声权重则上升到 1.000。保存的 forward_diffusion.jpg 显示,公交车先是清晰可见,随后变得颗粒化、模糊,最终消失。
生成时,过程会反向运行。模型从纯高斯噪声开始,每一步都由网络预测当前样本中的噪声,再由求解器去除其中一部分,稍微干净一些的结果随后进入下一步。文本提示或类别标签会作为条件输入网络,通常通过交叉注意力实现。Jonathan Ho 和 Tim Salimans 提出的无分类器引导会训练同一个网络,使其既能处理有条件的输入,也能处理无条件的输入;采样时再从无条件预测向有条件预测外推。引导尺度越高(例如 Stable Diffusion 1.x 流水线的默认值 7.5),生成结果就越贴合提示词,但多样性会降低。
加快采样速度#
DDPM 采样每张图像需要进行 1,000 次网络评估,因此该领域的许多进展都致力于减少这一数量:
- 改进采样器:DDIM使用确定性采样器复用已训练的 DDPM,实际运行时间可快 10 到 50 倍,同时生成高质量样本。之后的 ODE 求解器将常见的生成过程缩短到了约 20 到 50 步。
- 潜在扩散:潜在扩散模型对自编码器压缩后的表示进行去噪,而不是直接处理像素。Stable Diffusion 的自编码器会将 512×512×3 的图像转换为 64×64×4 的潜在表示,数值数量减少了 48 倍。
- 蒸馏:一致性模型学会将任意带噪样本直接映射为干净样本,从而实现一步生成;潜在一致性模型则将同一理念用于 Stable Diffusion,只需 2 到 4 步。
- 更直的路径:流匹配和整流流沿着从噪声到数据的直线路径进行训练,求解器可以用更少的步骤沿这些路径前进。
去噪网络本身也从 DDPM 和 Stable Diffusion 1.x 使用的卷积式 U-Net,发展到了当前大多数图像和视频生成器使用的扩散 Transformer(DiT)。
扩散模型与其他生成模型的比较#
- 生成对抗网络(GAN):GAN 一次前向传播就能生成样本,但生成器与判别器之间的对抗训练容易不稳定并出现模式崩溃,即生成器只能覆盖部分数据。扩散模型通过稳定的回归训练能更全面地覆盖数据分布,但采样需要许多步骤。
- 变分自编码器(VAE):VAE 通过一次解码就能将潜在向量转换为样本,但生成的样本往往较模糊。潜在扩散模型只用 VAE 风格的自编码器压缩图像,而将生成工作交给扩散模型。
- 自回归模型:语言模型和视觉自回归模型会根据先前内容,逐个 token 或逐个尺度地生成内容。扩散模型则在每一步并行优化样本的所有部分;扩散语言模型将同样的去噪方法用于文本。
实际应用#
- 图像生成与编辑:文生图模型根据提示词创建图像;图像修复会重新生成蒙版区域,使其与周围内容相匹配;ControlNet使用边缘图、深度图或姿势图约束布局;扩散超分辨率模型则用于提升图像分辨率。
- 视频生成:视频生成模型会对跨越多帧的压缩潜在表示进行去噪,因此每一帧都会与相邻帧一起生成。
- 合成训练数据:生成的图像可以填补视觉数据集中的空缺,例如罕见缺陷、特殊天气或少见视角。在 Ultralytics Platform的数据集中,生成相似图像操作会参考现有图像,每批生成 1 到 16 张新图像;你保留的图像会以未标注状态加入数据集,等待标注。
- 机器人:扩散策略以摄像头图像为条件,通过去噪生成机器人动作序列。
- 科学:AlphaFold 3 使用扩散模块对原始原子坐标进行去噪,从而预测蛋白质、核酸和小分子复合物的结构,取代了 AlphaFold 2 的结构模块。










