人工智能之核心技术 深度学习
第七章 扩散模型(Diffusion Models)
文章目录
- [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
- [前言:扩散模型(Diffusion Models)------ 生成式 AI 的新王者](#前言:扩散模型(Diffusion Models)—— 生成式 AI 的新王者)
- 一、扩散模型核心原理
- [1.1 直观类比:从"墨水滴入清水"说起](#1.1 直观类比:从“墨水滴入清水”说起)
- [1.2 前向扩散过程(Fixed, Non-Learnable)](#1.2 前向扩散过程(Fixed, Non-Learnable))
- [1.3 反向扩散过程(Learnable)](#1.3 反向扩散过程(Learnable))
- [1.4 马尔可夫链建模](#1.4 马尔可夫链建模)
- 二、扩散模型关键技术
- [2.1 噪声预测网络:UNet 架构](#2.1 噪声预测网络:UNet 架构)
- [2.2 损失函数:简单而强大](#2.2 损失函数:简单而强大)
- [2.3 采样加速策略](#2.3 采样加速策略)
- 三、经典扩散模型变体
- [3.1 DDPM(Denoising Diffusion Probabilistic Models, 2020)](#3.1 DDPM(Denoising Diffusion Probabilistic Models, 2020))
- [3.2 Stable Diffusion(2022)](#3.2 Stable Diffusion(2022))
- [3.3 DALL·E 3(2023)](#3.3 DALL·E 3(2023))
- 四、扩散模型应用场景
- [五、配套代码实现(简化 DDPM)](#五、配套代码实现(简化 DDPM))
- [六、扩散模型 vs GAN](#六、扩散模型 vs GAN)
- 七、总结
- 资料关注
前言:扩散模型(Diffusion Models)------ 生成式 AI 的新王者
如果说 GAN 是生成模型的"艺术家",那么扩散模型(Diffusion Models) 就是"科学家"------它通过模拟物理中的热力学扩散过程 ,以极其稳定、高质量的方式生成图像、音频、3D 等复杂数据。自 2020 年 DDPM 提出以来,扩散模型迅速超越 GAN,成为生成式 AI 的主流架构,并催生了 Stable Diffusion、DALL·E 2/3、Midjourney 等现象级应用。
一、扩散模型核心原理
1.1 直观类比:从"墨水滴入清水"说起
想象一滴墨水滴入清水中:
- 前向过程(Forward Process) :墨水逐渐扩散,最终整杯水变均匀灰色(加噪)
- 反向过程(Reverse Process) :如果知道扩散规律,理论上可以逆向操作,让墨水重新聚集成一滴(去噪)
扩散模型正是模拟这一过程:
- 训练阶段:学习如何从噪声中一步步还原原始数据
- 生成阶段:从纯噪声开始,逐步"去噪"生成新样本
1.2 前向扩散过程(Fixed, Non-Learnable)
给定真实图像 x 0 x_0 x0,通过 T T T 步逐步添加高斯噪声:
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 \mathbf{I}) q(xt∣xt−1)=N(xt;1−βt xt−1,βtI)
其中:
- β t \beta_t βt 是预设的小噪声方差(如线性增长:0.0001 → 0.02)
- t = 1 , 2 , . . . , T t = 1, 2, ..., T t=1,2,...,T(通常 T = 1000 T = 1000 T=1000)
- 经过足够多步后, x T ∼ N ( 0 , I ) x_T \sim \mathcal{N}(0, \mathbf{I}) xT∼N(0,I)(纯噪声)
✅ 关键性质 :任意时刻 x t x_t xt 可直接由 x 0 x_0 x0 计算(重参数化技巧):
x t = α ˉ t x 0 + 1 − α ˉ t ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon, \quad \epsilon \sim \mathcal{N}(0, \mathbf{I}) xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I)
其中 α ˉ t = ∏ s = 1 t ( 1 − β s ) \bar{\alpha}t = \prod{s=1}^t (1 - \beta_s) αˉt=∏s=1t(1−βs)
1.3 反向扩散过程(Learnable)
目标:学习一个神经网络 ϵ θ \epsilon_\theta ϵθ,预测每一步添加的噪声 ϵ \epsilon ϵ,从而逆向还原图像。
反向过程定义为:
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
在 DDPM 中,方差 Σ θ \Sigma_\theta Σθ 固定为 β t \beta_t βt ,只需学习均值 μ θ \mu_\theta μθ。而更巧妙的是:直接预测噪声 ϵ \epsilon ϵ!
1.4 马尔可夫链建模
整个扩散过程构成一个马尔可夫链:
- 每一步只依赖前一状态
- 前向链固定,反向链由神经网络参数化
+噪声 β₁
+噪声 β₂
去噪 θ
去噪 θ
真实图像 x₀
x₁
x₂
...
纯噪声 x_T ~ N(0,I)
x_{T-1}
x_{T-2}
生成图像 x̂₀
💡 优势:训练稳定、不易模式崩溃、生成质量高!
二、扩散模型关键技术
2.1 噪声预测网络:UNet 架构
扩散模型的核心是一个时间条件 UNet:
结构特点:
- 编码器-解码器:下采样提取特征,上采样重建图像
- 残差连接(Skip Connections):保留细节信息
- 时间嵌入(Time Embedding) :将时间步 t t t 编码为向量,注入每一层(通过 AdaGN 或 Attention)
- 自注意力机制:增强全局建模能力(尤其在高分辨率)
UNet
x_t
Conv + TimeEmb
Downsample + TimeEmb
Attention + ResBlock
Upsample + Skip + TimeEmb
Conv + Skip + TimeEmb
ε̂_θ(x_t, t)
t
Time Embedding
2.2 损失函数:简单而强大
DDPM 使用简化版变分下界(ELBO),最终等价于:
L simple = E x 0 , t , ϵ [ ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 ] \mathcal{L}\text{simple} = \mathbb{E}{x_0, t, \epsilon} \left[ \| \epsilon - \epsilon_\theta(x_t, t) \|^2 \right] Lsimple=Ex0,t,ϵ[∥ϵ−ϵθ(xt,t)∥2]
- 输入 :带噪图像 x t x_t xt + 时间步 t t t
- 目标 :预测原始噪声 ϵ \epsilon ϵ
- 损失:均方误差(MSE)
✅ 优点:无需对抗训练,梯度稳定,易于优化!
2.3 采样加速策略
原始 DDPM 需 1000 步采样 → 太慢!改进方法:
| 方法 | 原理 | 加速倍数 |
|---|---|---|
| DDIM(2021) | 非马尔可夫反向过程,允许跳步采样 | 10~50× |
| 知识蒸馏 | 训练小模型模仿大模型的 1000 步 → 用 10 步生成 | 100× |
| 剪枝与量化 | 移除冗余参数,降低计算量 | 2~4× |
| Latent Diffusion(Stable Diffusion) | 在低维潜在空间扩散 | 10×+ |
🚀 Stable Diffusion 关键 :
先用 VAE 将图像压缩到 latent space(如 64×64),再在此空间进行扩散 → 大幅降低计算成本!
三、经典扩散模型变体
3.1 DDPM(Denoising Diffusion Probabilistic Models, 2020)
- 开山之作,证明扩散模型可生成高质量图像
- 使用 UNet + 时间嵌入
- 采样慢(1000 步),但训练稳定
3.2 Stable Diffusion(2022)
-
文本到图像生成的里程碑
-
三大组件:
- VAE:图像 ↔ 潜在表示
- UNet 扩散模型:在 latent space 去噪
- CLIP Text Encoder:将文本编码为条件向量
-
条件生成:UNet 输入 = latent + text embedding + time
文本提示
CLIP Text Encoder
文本条件 c
随机噪声 z_T
UNet
时间步 t
z_{t-1}
...
z_0
VAE Decoder
生成图像
✅ 优势:开源、高效、支持 fine-tuning(LoRA、Textual Inversion)
3.3 DALL·E 3(2023)
-
结合 Transformer 与扩散模型
-
两阶段生成:
- Prompt 改写:用大语言模型(LLM)将用户输入改写为更详细的描述
- 扩散生成:用改进的 GLIDE 模型生成图像
-
多模态对齐:确保图像细节与文本严格一致
四、扩散模型应用场景
| 应用 | 说明 | 代表模型 |
|---|---|---|
| 文生图(Text-to-Image) | 根据文本生成图像 | Stable Diffusion, DALL·E 3 |
| 图生图(Image-to-Image) | 草图 → 真实图、风格迁移 | ControlNet + SD |
| 图像修复/编辑 | 填补缺失区域、换背景 | LaMa, InstructPix2Pix |
| 图像超分辨率 | 低清 → 高清 | SR3, Real-ESRGAN + Diffusion |
| 3D 生成 | 从单图生成 3D 模型 | DreamFusion, Shap-E |
| 语音合成 | 生成自然语音 | DiffWave, WaveGrad |
| 视频生成 | 生成连贯视频 | Make-A-Video, Sora(基于 diffusion-like 架构) |
🔮 趋势 :扩散模型正成为多模态生成的统一框架!
五、配套代码实现(简化 DDPM)
python
import torch
import torch.nn as nn
import math
# 1. 时间嵌入(Sinusoidal)
def timestep_embedding(timesteps, dim, max_period=10000):
half = dim // 2
freqs = torch.exp(
-math.log(max_period) * torch.arange(start=0, end=half, dtype=torch.float32) / half
).to(timesteps.device)
args = timesteps[:, None].float() * freqs[None]
embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1)
if dim % 2:
embedding = torch.cat([embedding, torch.zeros_like(embedding[:, :1])], dim=-1)
return embedding
# 2. 简化 UNet 块
class UNetBlock(nn.Module):
def __init__(self, in_ch, out_ch, time_emb_dim):
super().__init__()
self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)
self.time_proj = nn.Linear(time_emb_dim, out_ch)
self.norm = nn.GroupNorm(8, out_ch)
self.act = nn.SiLU()
def forward(self, x, time_emb):
x = self.conv(x)
time_bias = self.time_proj(time_emb)[:, :, None, None]
x = x + time_bias
x = self.norm(x)
return self.act(x)
# 3. 极简 UNet(仅示意)
class SimpleUNet(nn.Module):
def __init__(self, img_channels=3, time_emb_dim=128):
super().__init__()
self.time_mlp = nn.Sequential(
nn.Linear(1, time_emb_dim),
nn.SiLU(),
nn.Linear(time_emb_dim, time_emb_dim)
)
self.enc1 = UNetBlock(img_channels, 64, time_emb_dim)
self.enc2 = UNetBlock(64, 128, time_emb_dim)
self.dec2 = UNetBlock(128, 64, time_emb_dim)
self.final = nn.Conv2d(64, img_channels, 1)
def forward(self, x, t):
# t: [batch_size]
t = t.unsqueeze(-1).float()
time_emb = self.time_mlp(t) # [B, time_emb_dim]
x1 = self.enc1(x, time_emb)
x2 = self.enc2(x1, time_emb)
x = self.dec2(x2, time_emb)
return self.final(x)
# 4. 训练步骤(核心)
def train_step(model, x0, t, noise):
# x0: [B, C, H, W], t: [B], noise: [B, C, H, W]
alpha_bar = get_alpha_bar(t) # 预计算 ᾱ_t
xt = torch.sqrt(alpha_bar) * x0 + torch.sqrt(1 - alpha_bar) * noise
pred_noise = model(xt, t)
loss = nn.functional.mse_loss(pred_noise, noise)
return loss
# 使用示例
model = SimpleUNet()
x0 = torch.randn(4, 3, 32, 32)
t = torch.randint(0, 1000, (4,))
noise = torch.randn_like(x0)
loss = train_step(model, x0, t, noise)
print("Loss:", loss.item())
📌 说明:此为教学简化版,实际 UNet 包含下采样、上采样、注意力等模块。
六、扩散模型 vs GAN
| 特性 | GAN | Diffusion Model |
|---|---|---|
| 训练稳定性 | 不稳定,易崩溃 | 非常稳定 |
| 生成多样性 | 易模式崩溃 | 高多样性 |
| 生成质量 | 高(但可能有 artifacts) | 极高(细节丰富) |
| 采样速度 | 快(单次前向) | 慢(需多步,但可加速) |
| 理论基础 | 博弈论 | 概率生成模型 |
| 当前地位 | 逐渐被取代 | 生成式 AI 主流 |
七、总结
DDPM 2020
Improved Sampling
(DDIM, etc.)
Latent Diffusion
(Stable Diffusion)
ControlNet
(可控生成)
Text-to-3D
(DreamFusion)
Audio Diffusion
(DiffWave)
多模态生成统一框架
✅ 未来方向:
- 更快采样(1 步生成?)
- 更强语义控制(结合 LLM)
- 3D/视频/科学生成
深度学习核心架构的系统学习:
CNN → RNN → Transformer → GAN → Diffusion
共同构成了现代 AI 的技术基石。
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》