在 AI 绘画的世界里,生成高清、风格多变的图像不再是梦。背后的核心技术——扩散模型(Diffusion Models),通过“先加噪、再去噪”的独特方法,让计算机从随机噪声中逐步生成清晰的图像。
本文将带你从零开始,手把手解析扩散模型的原理、核心网络结构(U-Net)、采样流程及训练方法,并辅以大量 PyTorch 代码示例。无论你是 AI 初学者,还是希望实现自己图像生成实验的开发者,都能在这里找到完整的实战指南。
第一部分:扩散模型的基本原理
1.1 什么是扩散模型(Diffusion Model)
扩散模型是一类 生成式模型(Generative Models),它的核心思想是:
先把真实数据逐步加入噪声(扩散过程,Forward Process);
再训练一个模型学会逐步去噪(反向过程,Reverse Process);
最终实现 从纯噪声中生成高质量图像。
通俗点说:就像你把一张清晰的照片放进搅拌机里,打上 100 次,完全变成雪花点;然后再训练一个模型,让它学会“倒带”,一步步复原出照片。
1.2 对比 GAN、VAE 和 Diffusion
GAN (生成对抗网络):通过判别器和生成器对抗,训练难、容易崩。
VAE (变分自编码器):生成速度快,但图像往往模糊。
Diffusion Model:稳定、效果好,但采样速度较慢。
1.3 正向扩散(Forward Process)
在正向过程中,我们不断往图像里加噪声。假设初始干净图像为

其中:
是每一步的噪声强度(通常在 [0.0001, 0.02] 之间)。β t 表示第x t 步的图像。t
经过很多步后,图像就变成了接近高斯分布的纯噪声。
1.4 反向扩散(Reverse Process)
目标:学会去噪,逐步从噪声恢复图像。模型的训练目标就是预测噪声

1.5 Python代码示例:前向扩散
我们用一个简单的示例,把 MNIST 数字逐步加噪,看看从清晰到模糊的过程。
import torchimport torchvisionimport torchvision.transforms as transformsimport matplotlib.pyplot as plt# 超参数T = 200 # 扩散步数beta = torch.linspace(1e-4, 0.02, T) # 噪声强度调度# 前向扩散函数def forward_diffusion(x0, t):"""x0: 原始图像t: 第 t 步"""noise = torch.randn_like(x0)alpha = torch.cumprod(1 - beta, dim=0)mean = torch.sqrt(alpha[t]) * x0var = torch.sqrt(1 - alpha[t]) * noisereturn mean + var# 下载 MNIST 数据transform = transforms.Compose([transforms.ToTensor()])dataset = torchvision.datasets.MNIST(root="./data", train=True, transform=transform, download=True)img, _ = dataset[0]img = img.unsqueeze(0) # (1, 1, 28, 28)# 展示不同步数的扩散效果fig, axes = plt.subplots(1, 5, figsize=(15, 3))steps = [0, 50, 100, 150, 199]for idx, t in enumerate(steps):xt = forward_diffusion(img, t)axes[idx].imshow(xt.squeeze().numpy(), cmap="gray")axes[idx].set_title(f"Step {t}")axes[idx].axis("off")plt.show()
运行结果:你会看到一张手写数字 从清晰 → 模糊 → 完全噪声的过程。
第二部分:前向扩散过程(Forward Diffusion)
2.1 什么是前向扩散?
前向扩散(Forward Diffusion)就是 不断往数据里添加高斯噪声,直到它变成标准高斯分布的过程。
设一张原始图像为

其中:
:噪声强度(调度参数)。β t I:单位方差的高斯噪声。
2.2 直接计算任意步的公式
如果我们想从 第 0 步直接跳到第 t 步,可以用累积系数:

2.3 Python代码实现
下面我们写一个前向扩散函数,展示从 MNIST 数字到纯噪声的过程。
import torchimport torchvisionimport torchvision.transforms as transformsimport matplotlib.pyplot as plt# 超参数T = 200 # 扩散总步数beta = torch.linspace(1e-4, 0.02, T) # 噪声调度alpha = 1 - betaalpha_bar = torch.cumprod(alpha, dim=0) # 累积alphadef q_sample(x0, t):"""前向扩散公式: x_t = sqrt(alpha_bar_t) * x0 + sqrt(1-alpha_bar_t) * noise"""noise = torch.randn_like(x0)sqrt_alpha_bar = torch.sqrt(alpha_bar[t]).view(-1, 1, 1, 1)sqrt_one_minus_alpha_bar = torch.sqrt(1 - alpha_bar[t]).view(-1, 1, 1, 1)return sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise# 加载 MNIST 数据transform = transforms.Compose([transforms.ToTensor()])dataset = torchvision.datasets.MNIST(root="./data", train=True, transform=transform, download=True)img, _ = dataset[1] # 随便取一个数字img = img.unsqueeze(0) # (1, 1, 28, 28)# 展示不同步数的扩散效果fig, axes = plt.subplots(1, 6, figsize=(18, 3))steps = [0, 20, 50, 100, 150, 199]for idx, t in enumerate(steps):xt = q_sample(img, torch.tensor([t]))axes[idx].imshow(xt.squeeze().numpy(), cmap="gray")axes[idx].set_title(f"Step {t}")axes[idx].axis("off")plt.show()运行效果:
Step 0:清晰的手写数字
Step 20:有点模糊
Step 100:几乎认不出
Step 199:完全高斯噪声
2.4 关键点总结

第三部分:反向扩散过程(Reverse Diffusion)
3.1 什么是反向扩散?
在前向扩散(Forward Process)里,我们逐步加噪,最后得到纯噪声。而反向扩散(Reverse Process)就是 从噪声一步步去噪,恢复原始图像。
但问题是:
前向扩散是已知的概率分布(高斯),
反向扩散的分布是未知的!
所以我们需要训练一个神经网络来学习 如何去噪。
3.2 反向扩散的数学公式

3.3 关键思想 —— 预测噪声
训练时,我们不直接预测图像

这样,采样时就能 逐步减去噪声,恢复出图像。
3.4 用 PyTorch 实现一个小型去噪网络
我们先写一个最小的神经网络,用来预测噪声。
import torchimport torch.nn as nnimport torch.nn.functional as Fclass SimpleDenoiseNet(nn.Module):def __init__(self, img_channels=1, hidden_dim=64):super(SimpleDenoiseNet, self).__init__()self.conv1 = nn.Conv2d(img_channels, hidden_dim, 3, padding=1)self.conv2 = nn.Conv2d(hidden_dim, hidden_dim, 3, padding=1)self.conv3 = nn.Conv2d(hidden_dim, img_channels, 3, padding=1)def forward(self, x, t):"""x: 带噪图像t: 时间步(这里只是占位,后面会加time embedding)"""h = F.relu(self.conv1(x))h = F.relu(self.conv2(h))return self.conv3(h)# 测试网络model = SimpleDenoiseNet()dummy_x = torch.randn(1, 1, 28, 28) # 一张带噪图dummy_t = torch.tensor([10]) # 时间步out = model(dummy_x, dummy_t)print(out.shape) # (1, 1, 28, 28)
输出结果应该是 (1, 1, 28, 28),表示预测的噪声和输入图像形状一致。
3.5 训练损失函数
我们定义训练损失,让模型学会“预测噪声”:
def loss_fn(model, x0, t, alpha_bar):"""x0: 原始干净图像t: 时间步alpha_bar: 累积alpha (前向扩散时计算的)"""noise = torch.randn_like(x0)sqrt_alpha_bar = torch.sqrt(alpha_bar[t]).view(-1, 1, 1, 1)sqrt_one_minus_alpha_bar = torch.sqrt(1 - alpha_bar[t]).view(-1, 1, 1, 1)xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise# 预测噪声pred_noise = model(xt, t)# 训练目标:预测噪声接近真实噪声return F.mse_loss(pred_noise, noise)
3.6 小结
前向扩散:不断加噪,直到纯噪声。
反向扩散:训练一个神经网络预测噪声,从而逐步去噪。
核心损失:噪声预测误差

第四部分:核心模型结构 —— U-Net
4.1 为什么选择 U-Net?
在反向扩散过程中,我们要预测噪声。这个任务本质上就是 图像到图像的映射(输入是带噪图像,输出是噪声图像)。
U-Net 是一个 编码器-解码器结构:
编码器(Encoder):逐步下采样,提取语义特征。
解码器(Decoder):逐步上采样,恢复空间分辨率。
跳跃连接(Skip Connection):把浅层的空间细节直接传递给解码器,避免细节丢失。
这和扩散模型的需求完美匹配。
4.2 U-Net 的基本结构
一个简化版 U-Net 结构:
输入x_t↓卷积 + 下采样↓卷积 + 下采样↓卷积(中间层)↓卷积 + 上采样 ← 跳跃连接↓卷积 + 上采样 ← 跳跃连接↓输出噪声 ε
4.3 时间嵌入(Time Embedding)
扩散模型的特殊点:
不仅输入图像,还需要输入 时间步 t(表示扩散到第几步)。
时间步通常通过 正弦位置编码(sinusoidal positional encoding)映射成向量,再输入网络。
公式:

4.4 PyTorch 实现简化版 U-Net
我们实现一个精简版的 U-Net,用于 MNIST 这种小图像。
import torchimport torch.nn as nnimport torch.nn.functional as Fimport math# 时间嵌入模块class SinusoidalPosEmb(nn.Module):def __init__(self, dim):super().__init__()self.dim = dimdef forward(self, t):device = t.devicehalf_dim = self.dim // 2emb = math.log(10000) / (half_dim - 1)emb = torch.exp(torch.arange(half_dim, device=device) * -emb)emb = t[:, None] * emb[None, :]emb = torch.cat((emb.sin(), emb.cos()), dim=-1)return emb# 基础卷积块class ConvBlock(nn.Module):def __init__(self, in_channels, out_channels, time_emb_dim):super().__init__()self.conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, 3, padding=1),nn.GroupNorm(1, out_channels),nn.ReLU())self.time_mlp = nn.Linear(time_emb_dim, out_channels)def forward(self, x, t):h = self.conv(x)# 时间步信息注入到特征图time_emb = self.time_mlp(t)[:, :, None, None]return h + time_emb# U-Net 主体class UNet(nn.Module):def __init__(self, img_channels=1, time_emb_dim=128):super().__init__()self.time_mlp = nn.Sequential(SinusoidalPosEmb(time_emb_dim),nn.Linear(time_emb_dim, time_emb_dim),nn.ReLU())self.conv1 = ConvBlock(img_channels, 64, time_emb_dim)self.conv2 = ConvBlock(64, 128, time_emb_dim)self.conv3 = ConvBlock(128, 64, time_emb_dim)self.conv4 = nn.Conv2d(64, img_channels, 1)def forward(self, x, t):# 时间嵌入t_emb = self.time_mlp(t)# 编码h1 = self.conv1(x, t_emb)h2 = self.conv2(F.avg_pool2d(h1, 2), t_emb)# 解码h3 = F.interpolate(h2, scale_factor=2, mode="nearest")h3 = self.conv3(h3, t_emb)# 跳跃连接out = self.conv4(h1 + h3)return out# 测试model = UNet()dummy_x = torch.randn(1, 1, 28, 28) # 一张28x28的灰度图dummy_t = torch.tensor([50]) # 时间步out = model(dummy_x, dummy_t)print(out.shape) # (1, 1, 28, 28)
输出:
torch.Size([1, 1, 28, 28])
说明网络能正常工作,输入和输出尺寸一致,适合做“图像到图像”的预测。
4.5 小结
U-Net 是扩散模型的核心骨架,用来预测噪声。
时间嵌入让模型知道“现在是扩散的第几步”。
简化版 U-Net 已经能跑 MNIST,扩展到 Stable Diffusion 就是更深更复杂的 U-Net(带残差块、注意力机制、多层 skip connection)。
第五部分:采样过程(Sampling)
5.1 为什么需要采样?

采样,就是用训练好的模型一步一步“倒带”,最终生成一张新图像。
5.2 采样的数学公式
在反向扩散中,每一步我们要从分布中采样:

5.3 采样流程

5.4 PyTorch 实现 DDPM 采样
import torch@torch.no_grad()def p_sample(model, xt, t, alpha, alpha_bar, beta):"""单步采样公式xt: 当前的图像 (带噪)t: 当前时间步 (int)"""betat = beta[t]sqrt_recip_alpha = 1 / torch.sqrt(alpha[t])sqrt_one_minus_alpha_bar = torch.sqrt(1 - alpha_bar[t])# 预测噪声eps_theta = model(xt, torch.tensor([t], device=xt.device))# 计算均值mean = sqrt_recip_alpha * (xt - (1 - alpha[t]) / sqrt_one_minus_alpha_bar * eps_theta)if t > 0:z = torch.randn_like(xt)sigma = torch.sqrt(betat)return mean + sigma * zelse:# 最后一步,不加噪声return mean@torch.no_grad()def p_sample_loop(model, shape, T, alpha, alpha_bar, beta):"""反向扩散采样循环"""xt = torch.randn(shape) # 从纯噪声开始imgs = []for t in reversed(range(T)):xt = p_sample(model, xt, t, alpha, alpha_bar, beta)if t % 20 == 0:imgs.append(xt.clone())return imgs# 参数准备T = 200beta = torch.linspace(1e-4, 0.02, T)alpha = 1 - betaalpha_bar = torch.cumprod(alpha, dim=0)# 假设已经训练好的模型(这里用未训练的 U-Net 代替)model = UNet()# 从噪声采样imgs = p_sample_loop(model, (1, 1, 28, 28), T, alpha, alpha_bar, beta)print(f"生成了 {len(imgs)} 张采样过程的中间图像")
说明:
如果模型未训练,输出就是纯噪声。
如果模型训练充分,输出会从噪声逐渐变成 清晰的数字/图像。
5.5 DDIM:加快采样速度
DDPM 的采样通常要跑 1000 步,非常慢。DDIM(Denoising Diffusion Implicit Models)提出了 非马尔科夫采样,可以在 50 步左右得到不错的效果。
核心区别:
DDPM:必须严格按顺序采样。
DDIM:可以跳步采样,大幅度加快生成速度。
代码上,只要修改采样的时间步序列即可,例如只取 50 个时间步:
timesteps = torch.linspace(0, T-1, 50, dtype=torch.long)
5.6 小结
DDPM 采样:严格一步步从噪声还原图像,稳定但慢。
DDIM 采样:允许跳步采样,大幅度提升速度。
核心思想:训练网络预测噪声,采样时逐步减去噪声。
第六部分:扩展与优化
6.1 条件扩散模型(Conditional Diffusion)
普通的扩散模型只能无条件生成图像(Unconditional Generation),但在实际应用中我们常常希望 控制生成内容,比如:
生成指定类别的数字(MNIST 里的 3 或 7)。
根据文本描述生成图像(Text-to-Image)。
解决方案:
在 U-Net 输入中加入条件(标签、文本 embedding)。
在训练损失里引导模型学会利用条件信息。
6.2 类别条件扩散(Class-Conditional Diffusion)
以 MNIST 手写数字为例,我们希望生成指定数字。做法:
获取类别标签
。y 将标签嵌入成向量(embedding)。
将类别嵌入与时间步 embedding、图像特征结合。
PyTorch 实现类别条件 U-Net
class ConditionalUNet(nn.Module):def __init__(self, img_channels=1, num_classes=10, time_emb_dim=128):super().__init__()self.time_mlp = nn.Sequential(SinusoidalPosEmb(time_emb_dim),nn.Linear(time_emb_dim, time_emb_dim),nn.ReLU())self.label_emb = nn.Embedding(num_classes, time_emb_dim)self.conv1 = ConvBlock(img_channels, 64, time_emb_dim)self.conv2 = ConvBlock(64, 128, time_emb_dim)self.conv3 = ConvBlock(128, 64, time_emb_dim)self.conv4 = nn.Conv2d(64, img_channels, 1)def forward(self, x, t, y):# 时间嵌入t_emb = self.time_mlp(t)# 类别嵌入y_emb = self.label_emb(y)# 两者相加作为条件cond_emb = t_emb + y_emb# 编码h1 = self.conv1(x, cond_emb)h2 = self.conv2(F.avg_pool2d(h1, 2), cond_emb)# 解码h3 = F.interpolate(h2, scale_factor=2, mode="nearest")h3 = self.conv3(h3, cond_emb)# 跳跃连接out = self.conv4(h1 + h3)return out# 测试model = ConditionalUNet()dummy_x = torch.randn(1, 1, 28, 28)dummy_t = torch.tensor([50])dummy_y = torch.tensor([3]) # 条件:数字 3out = model(dummy_x, dummy_t, dummy_y)print(out.shape) # (1, 1, 28, 28)
这样模型就能生成“数字 3”的图像,而不是随便的数字。
6.3 文本引导扩散(Text-to-Image)
在 Stable Diffusion 里,条件不是数字标签,而是 文本。关键点:
使用预训练的文本编码器(例如 CLIP Text Encoder、BERT)。
把输入的 prompt(比如 "a cat sitting on a chair")转成向量 embedding。
把这个 embedding 输入到 U-Net 作为条件。
Stable Diffusion 的关键优化
潜在空间(Latent Space)
不是直接在像素空间训练,而是在 VAE 压缩后的 latent space 训练。
这样图像从 512×512 压缩到 64×64,训练速度快很多。
交叉注意力(Cross-Attention)
U-Net 在解码阶段引入 cross-attention,让图像生成和文本 embedding 交互。
保证图像和文本语义一致。
采样优化
使用 DDIM、PLMS 等采样器,加速采样,提高图像质量。
6.4 简化版 “文本条件” U-Net 框架
class TextConditionalUNet(nn.Module):def __init__(self, img_channels=3, text_emb_dim=512, time_emb_dim=128):super().__init__()self.time_mlp = nn.Sequential(SinusoidalPosEmb(time_emb_dim),nn.Linear(time_emb_dim, time_emb_dim),nn.ReLU())self.text_proj = nn.Linear(text_emb_dim, time_emb_dim)self.conv1 = ConvBlock(img_channels, 64, time_emb_dim)self.conv2 = ConvBlock(64, 128, time_emb_dim)self.conv3 = ConvBlock(128, 64, time_emb_dim)self.conv4 = nn.Conv2d(64, img_channels, 1)def forward(self, x, t, text_emb):# 时间嵌入t_emb = self.time_mlp(t)# 文本嵌入(映射到相同维度)txt_emb = self.text_proj(text_emb)cond_emb = t_emb + txt_embh1 = self.conv1(x, cond_emb)h2 = self.conv2(F.avg_pool2d(h1, 2), cond_emb)h3 = F.interpolate(h2, scale_factor=2, mode="nearest")h3 = self.conv3(h3, cond_emb)out = self.conv4(h1 + h3)return out# 测试:假设 text encoder 给了一个 512 维向量model = TextConditionalUNet()dummy_x = torch.randn(1, 3, 64, 64) # RGB 图像dummy_t = torch.tensor([10])dummy_text_emb = torch.randn(1, 512) # 文本 embeddingout = model(dummy_x, dummy_t, dummy_text_emb)print(out.shape) # (1, 3, 64, 64)
这就是一个 极简版的 Stable Diffusion 框架(当然真实版本更复杂,包含 attention、残差块等)。
6.5 小结
条件扩散模型:通过标签或文本 embedding 控制生成内容。
Stable Diffusion 的关键:潜在空间 + 文本编码器 + cross-attention。
我们写了 类别条件 U-Net和 文本条件 U-Net的简化实现。
第七部分:训练流程
7.1 训练目标

7.2 训练数据
以 MNIST 手写数字为例(28×28 灰度图像):
from torchvision import datasets, transformsfrom torch.utils.data import DataLoadertransform = transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: (x - 0.5) * 2) # 归一化到 [-1, 1]])dataset = datasets.MNIST(root="./data", train=True, download=True, transform=transform)dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
7.3 前向扩散函数(加噪声)
def forward_diffusion_sample(x0, t, alpha_bar):"""给图像 x0 在时间步 t 添加噪声"""noise = torch.randn_like(x0)sqrt_alpha_bar_t = torch.sqrt(alpha_bar[t])[:, None, None, None]sqrt_one_minus_alpha_bar_t = torch.sqrt(1 - alpha_bar[t])[:, None, None, None]return sqrt_alpha_bar_t * x0 + sqrt_one_minus_alpha_bar_t * noise, noise
7.4 训练循环
import torchimport torch.nn as nnimport torch.optim as optim# 参数device = "cuda" if torch.cuda.is_available() else "cpu"T = 200beta = torch.linspace(1e-4, 0.02, T).to(device)alpha = 1 - betaalpha_bar = torch.cumprod(alpha, dim=0)# 模型 & 优化器model = UNet().to(device)optimizer = optim.Adam(model.parameters(), lr=1e-4)loss_fn = nn.MSELoss()# 训练循环epochs = 5for epoch in range(epochs):for step, (x0, _) in enumerate(dataloader):x0 = x0.to(device)batch_size = x0.shape[0]# 随机选择时间步 tt = torch.randint(0, T, (batch_size,), device=device).long()# 加噪声,得到 x_t 和 真实噪声x_t, noise = forward_diffusion_sample(x0, t, alpha_bar)# 模型预测噪声noise_pred = model(x_t, t)# 损失函数loss = loss_fn(noise_pred, noise)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()if step % 100 == 0:print(f"Epoch [{epoch+1}/{epochs}] Step [{step}/{len(dataloader)}] Loss: {loss.item():.4f}")
7.5 训练效果监控
训练过程中,Loss 应该逐渐下降。
采样过程,可以用前面写的
p_sample_loop,从噪声生成图像。如果训练时间不够长,生成的图像可能比较模糊。
7.6 小结
训练扩散模型的关键是 预测噪声(不是直接预测图像)。
前向扩散:随机选择时间步 t,加噪声。
反向传播:优化模型参数,使预测噪声接近真实噪声。
我们已经实现了完整的训练循环,可以在 MNIST 数据集上跑通。
第八部分:总结与展望
8.1 扩散模型回顾
本文分八部分系统讲解了扩散模型(Diffusion Models)及其实现:
引言与基本概念
介绍 AI 绘画背景和扩散模型的优势。
前向扩散过程(Forward Diffusion)
从图像逐步加噪至高斯噪声的过程。
提供了 PyTorch 实现。
反向扩散过程(Reverse Diffusion)
核心:训练神经网络预测噪声。
提供了最小 U-Net 去噪网络代码。
核心模型结构 —— U-Net
编码器-解码器结构 + 跳跃连接。
时间嵌入和简化 PyTorch 实现。
采样过程(Sampling)
DDPM 逐步采样公式。
DDIM 加速采样方法。
提供采样循环代码示例。
扩展与优化
条件扩散模型(类别条件、文本条件)。
Stable Diffusion 核心优化:潜在空间 + cross-attention + 文本编码器。
训练流程
训练目标、数据准备、前向扩散加噪、反向传播。
提供完整 PyTorch 训练循环。
通过这些内容,读者可以从零开始理解并搭建一个简化版扩散模型。
8.2 扩散模型的优势
生成质量高:在图像细节和结构上,比 GAN 更稳定。
训练稳定:损失函数简单(MSE),不像 GAN 那样容易不收敛。
可控生成:条件扩散可以根据标签或文本生成特定图像。
8.3 当前局限性
采样慢:DDPM 通常需要上千步采样,生成大图像耗时。
计算资源高:高分辨率图像训练需要大量 GPU 内存。
多模态融合复杂:如文本 + 图像 + 音频,需要复杂的 cross-attention 机制。
8.4 未来发展方向
采样加速
DDIM、PNDM、Fast Sampling 方法。
目标:在几十步内生成高质量图像。
多模态生成
文本 + 图像 + 视频 + 3D 模型生成。
未来可实现 AI 全息创作平台。
轻量化与移动端部署
Tiny Diffusion、剪枝、量化技术。
目标:移动端也能生成 512×512 高质量图像。
结合强化学习与风格控制
用 RLHF 或控制信号对生成风格进行优化。
安全与内容监管
自动过滤有害内容,保证 AI 绘画合规使用。
8.5 总结
扩散模型是 AI 绘画领域的一场革命:
从 DDPM 到 Stable Diffusion,模型不断优化采样速度、生成质量和可控性。
PyTorch 实现让我们可以快速实验和扩展模型。
未来,扩散模型将不仅局限于图像生成,还可能扩展到视频、3D、跨模态创作。
核心理念:
先加噪,再去噪,借助神经网络预测噪声,逐步从随机中生成可控、高质量的图像。
扩散模型(Diffusion Models)是 AI 绘画领域的核心技术,它通过 前向加噪和 反向去噪的过程,实现从纯随机噪声到高质量图像的生成。本文系统梳理了扩散模型的 基本原理、U-Net 网络结构、采样方法、条件扩展、训练流程,并配以大量 PyTorch 实战代码,让读者可以快速上手搭建自己的实验平台。
扩散模型生成稳定、可控性强,尤其在文本条件生成(Text-to-Image)中表现出色;但也存在采样速度慢、计算资源需求高等挑战。未来,随着 采样加速、多模态生成、轻量化部署等技术的发展,扩散模型将在图像、视频、3D 乃至跨模态创作中发挥更大潜力。
夜雨聆风