CS231n(拾肆)——生成模型(下)
本讲主题:生成模型(第二部分)。上一讲的分类学中,今天覆盖剩余两类: - GAN(生成对抗网络)——隐式密度、直接采样 - 扩散模型(Diffusion Models)——隐式密度、迭代采样(本讲以 Rectified Flow 为代表) - 以及现代扩展:Latent Diffusion、DiT、文生图/文生视频、扩散蒸馏
$\large\star$ 回顾:生成模型分类学
1 | Generative models |
已有模型回顾:
| 模型 | 思想 |
|---|---|
| 自回归模型 | 直接最大化训练数据的似然:pθ(x) = ∏ipθ(xi ∣ x1, …, xi − 1) |
| VAE | 引入潜变量 z,最大化似然的下界:pθ(x) = ∫Zpθ(x ∣ z)p(z) dz ≥ 𝔼z ∼ qϕ[log pθ(x ∣ z)] − DKL(qϕ‖p) |
🎯 GAN 的立场:放弃建模 p(x),但允许我们从 p(x) 采样!
$\large\star$ 一、生成对抗网络(GANs)
Goodfellow et al., “Generative Adversarial Nets”, NeurIPS 2014
1.1 设定与核心思想
设定:有数据 xi ∼ pdata(x),希望从中采样。
思想: 1. 引入潜变量 z,服从简单先验 p(z)(如标准高斯) 2. 采样 z ∼ p(z),送入生成器网络 x = G(z) 3. 则 x 是生成器分布 pG 的样本——希望 pG = pdata!
1 | z ~ p(z) → Generator G → 生成图像 x |
- Generator G:把 z 转换成”假”数据(x 采样自 pG)
- Discriminator D:把输入分类为真/假
- 训练方式:G 通过骗过 D 来学习;D 通过识别真假来学习
- 联合训练 G 和 D:希望 pG 收敛到 pdata
1.2 训练目标:极小极大博弈(Minimax Game)
minGmaxD 𝔼x ∼ pdata[log D(x)] + 𝔼z ∼ p(z)[log (1 − D(G(z)))]
其中 D(x) = P(x is real):D(x) = 0 表示假,D(x) = 1 表示真。
- 固定 G,训练 D:真实数据希望 D(x) → 1;假数据希望 D(G(z)) → 0
- 固定 D,训练 G:第一项与 G 无关;生成器希望 D(G(z)) → 1(骗过判别器)
训练循环(交替梯度更新):
1 | # 不是最小化任何整体损失!没有训练曲线可看! |
⚠️ 训练初期的梯度消失问题:开始时生成器很差,判别器一眼识破真假,D(G(z)) ≈ 0 → 对 G 的梯度接近 0,生成器学不动!
解决方案:让生成器最小化 −log (D(G(z)))(而非 log (1 − D(G(z)))),使训练初期就有强梯度。
1.3 为什么这个目标合理?(最优解分析)
内层目标:对任意固定的 pG,最优判别器为 $$D^*_G(x) = \frac{p_{data}(x)}{p_{data}(x) + p_G(x)}$$
外层目标:代入最优 D 后,最优生成器使得 pG(x) = pdata(x)
⚠️ 注意事项(Caveats): 1. 固定容量的神经网络未必能表示最优的 D 和 G 2. 有限数据下不保证收敛到该解
1.4 GAN 架构
| 架构 | 特点 |
|---|---|
| DC-GAN (Radford et al., ICLR 2016) | 生成器和判别器都是 CNN;第一个在非玩具数据上work的 GAN(GAN 流行时 ViT 尚未普及) |
| StyleGAN (Karras et al., CVPR 2019) | 更复杂的架构,通过自适应归一化注入噪声:每层预测与 x 同形状的缩放 w 和平移 b:$\text{AdaIN}(x,w,b)_i = w_i \frac{x_i - \mu(x)}{\sigma(x)} + b_i$ |
1.5 潜空间插值(Latent Space Interpolation)
潜空间是平滑的:给定潜向量 z0 和 z1,可线性插值: zt = tz0 + (1 − t)z1, xt = G(zt)
💡 生成的图像 xt 会在两个样本之间平滑过渡!
1.6 GAN 总结
| 优点 | 缺点 |
|---|---|
| ✅ 公式简单 | ❌ 没有损失曲线可看 |
| ✅ 图像质量非常好 | ❌ 训练不稳定 |
| ❌ 难以扩展到超大模型和数据 |
📌 GAN 是约 2016–2021 年的首选生成模型。
$\large\star$ 二、扩散模型(Diffusion Models)
关键文献: - Sohl-Dickstein et al., ICML 2015(奠基) - Song and Ermon, NeurIPS 2019(Score-based) - Ho et al., NeurIPS 2020(DDPM) - Song et al., ICLR 2021(SDE 视角) - Liu et al., 2022 Rectified Flow;Lipman et al., 2022 Flow Matching(本讲重点)
⚠️ 术语警告:该领域术语和记号混乱!不同论文有不同数学形式体系。本讲只讲一个现代”干净”的实现——Rectified Flow。
2.1 直觉
- 选一个噪声分布 z ∼ pnoise(通常为单位高斯)
- 考虑数据 x
在不同噪声水平 t 下被破坏得到带噪数据
xt:
- t = 0:无噪声(就是原始数据 x)
- t = 1:纯噪声
- 训练一个神经网络去除一点点噪声:fθ(xt, t)
- 推理(采样)时:采样 x1 ∼ pnoise,多次顺序应用 fθ,得到无噪声样本 x0
2.2 Rectified Flow:训练(Training)
设我们有简单分布 pnoise(如高斯)和 pdata 的样本:
每次训练迭代: 1. 采样 z ∼ pnoise,x ∼ pdata,t ∼ Uniform(0, 1) 2. 线性插值得到带噪样本:xt = (1 − t) x + t z 3. 定义速度(velocity)目标:v = z − x 4. 训练网络预测 v: ℒ = ∥ fθ(xt, t) − v ∥22
💡 核心训练循环只有几行代码! 网络输入带噪数据 xt 和时间 t,输出从 x 指向 z 的方向 v。
2.3 Rectified Flow:采样(Sampling)
- 选择步数 T(通常 T = 50)
- 采样 x ∼ pnoise(即 x1)
- 对 $t \in [1,\ 1-\frac{1}{T},\
1-\frac{2}{T},\ \dots,\ 0]$:
- 计算 vt = fθ(xt, t)
- 更新 x = x − vt/T(沿速度走一步)
- 返回 x(即 x0)
💡 直观理解:从纯噪声 x1 出发,沿着学到的速度场 v 一步一步”走”回数据分布 pdata。
2.4 条件 Rectified Flow
如果需要按条件 y 生成(pdata(x ∣ y)),把条件 y 也作为网络输入:fθ(xt, y, t)。
问题:能否控制条件 y 的”强调程度”?
2.5 Classifier-Free Guidance (CFG)
Ho and Salimans, “Classifier-Free Diffusion Guidance”, arXiv 2022
训练阶段:训练时随机丢弃条件 y(用空条件 y∅ 代替)→ 同一个模型既是条件模型也是无条件模型!
采样阶段:对带噪数据 xt: - v∅ = fθ(xt, y∅, t):指向无条件分布 p(x) - vy = fθ(xt, y, t):指向条件分布 p(x ∣ y) - 组合得到引导速度:$$\boxed{\,v_{cfg} = (1 + w)\, v_y - w\, v_\emptyset\,}$$ 更偏向 p(x ∣ y)
- w 越大 → 条件强调越强(但多样性下降)
- “Classifier-Free” 的由来:早期方法用单独的判别模型 p(y ∣ x) 计算步长方向 $\frac{\partial}{\partial x}\log p(y\mid x)$,CFG 不需要分类器
- ✅ 实践中到处使用,对高质量输出非常重要
- ⚠️ 代价:采样成本翻倍(需要同时跑条件和无条件两次前向)
2.6 最优预测(Optimal Prediction)与噪声调度
问题:网络的最优预测是什么?
- 可能存在多对 (x, z) 产生同一个 xt → 网络必须对它们取平均
- 全噪声(t = 1):容易——最优 v 是 pdata 的均值
- 无噪声(t = 0):容易——最优 v 是 pnoise 的均值
- 中间噪声:最难、最模糊(最歧义)!
⚠️ 但训练时对所有噪声水平给相同权重! → 解决方案:非均匀噪声调度
Noise Schedule: - 对中间噪声给更多权重(p(t) 分布偏向中间) - 常见选择:logit-normal 采样 - 对高分辨率数据:常把调度移向更高噪声(考虑像素间的相关性)
📌 总结:训练 = 简单的速度预测 + 精心设计的噪声调度;采样 = 从噪声出发逐步走回数据。简单且可扩展,适用于很多生成问题。
2.7 Latent Diffusion Models (LDM)
Rombach et al., “High-Resolution Image Synthesis with Latent Diffusion Models”, CVPR 2022
问题:Rectified Flow 不能直接用于高分辨率数据(在像素空间跑太贵)。
解决方案:先在潜空间(latent space)做扩散!
1 | 图像 H×W×3 ──Encoder──> 潜变量 (H/D)×(W/D)×C ──Diffusion 去噪──> 干净潜变量 ──Decoder──> 图像 |
- 训练 Encoder + Decoder 把图像转换为潜变量(常见:D = 8, C = 16;256 × 256 × 3 ⇒ 32 × 32 × 16;Encoder/Decoder 是带注意力的 CNN)
- 冻结 Encoder,训练扩散模型去除潜变量上的噪声
- 训练完成后采样:采样随机潜变量 → 迭代应用扩散模型去噪 → 过 Decoder 得到图像
Encoder+Decoder 怎么训练? - 它就是一个 VAE!(通常 KL 先验权重很小) - ⚠️ 问题:Decoder 输出常常模糊 - ✅ 解决:加一个判别器(GAN 技巧!)
🧠 现代 LDM 流水线 = VAE + GAN + Diffusion 的组合! Latent Diffusion 是当前最常见的形式(如 Stable Diffusion)。
2.8 Diffusion Transformer (DiT)
Peebles and Xie, “Scalable Diffusion Models with Transformer”, ICCV 2023
- Diffusion 使用标准的 Transformer Block!
- 核心问题:如何注入条件(时间步 t、文本…)?
| 条件注入方式 | 用途 |
|---|---|
| 预测 scale/shift(adaLN 式) | 最常用于扩散时间步 t |
| Cross-Attention / Joint Attention | 常用于文本、图像等条件 |
2.9 文生图(Text-to-Image)流水线
1 | 文本提示 → 预训练文本编码器(T5, CLIP) → 文本嵌入 D×L |
示例:FLUX.1 [dev] - 文本编码器:T5 + CLIP - Encoder/Decoder:8×8 下采样 - 扩散模型:12B 参数;2×2 patchify → 64×64 = 1024 个图像 token
2.10 文生视频(Text-to-Video)
1 | 文本提示 → 文本编码器 → 文本嵌入 |
示例:Meta MovieGen:文本编码器 UL2/ByT5/MetaCLIP;Encoder/Decoder 8×8×8 下采样;30B 参数 DiT;1×2×2 patchify → 76K tokens
📌 视频扩散模型时代(2024–2025):Sora、MovieGen、HunyuanVideo、Veo 2、Wan、Kling 2.0、Cosmos(NVIDIA)等
2.11 扩散蒸馏(Diffusion Distillation)
问题:采样时需要运行扩散模型很多次(Rectified Flow 约 30–50 步)——太慢了!
解决方案:蒸馏算法减少步数(有时降到 1 步),还可以把 CFG 也烘进去。
📚 Salimans and Ho (ICLR 2022) Progressive Distillation;Song et al. (ICML 2023) Consistency Models;Sauer et al. (ECCV 2024) Adversarial Diffusion Distillation 等
2.12 广义扩散框架(Generalized Diffusion)
几乎所有扩散变体都是同一框架的特例:
| 步骤 | Rectified Flow | Generalized Diffusion |
|---|---|---|
| 采样 | x ∼ pdata, z ∼ pnoise | x ∼ pdata, z ∼ pnoise |
| 时间 | t ∼ pt | t ∼ pt |
| 加噪 | xt = (1 − t)x + tz | xt = a(t)x + b(t)z |
| 目标 | vgt = z − x | ygt = c(t)x + d(t)z |
| 预测 | vpred = fθ(xt, t) | ypred = fθ(xt, t) |
| 损失 | ‖vgt − vpred‖22 | ‖ygt − ypred‖22 |
常见特例:
| 变体 | a(t) | b(t) | 目标 ygt |
|---|---|---|---|
| Rectified Flow | 1 − t | t | v = z − x(c = −1, d = 1) |
| Variance Preserving (VP) | σ(t) | $\sqrt{1-\sigma(t)}$ | 若 x, z 独立且方差为 1,xt 方差也为 1 |
| Variance Exploding (VE) | 1 | σ(t) | σ(1) 要大到淹没 x 中所有信号 |
| x-prediction | — | — | ygt = x(c = 1, d = 0) |
| ε-prediction | — | — | ygt = z(c = 0, d = 1) |
| v-prediction | — | — | ygt = b(t)z − a(t)x(c = b, d = −a) |
💡 函数 a, b, c, d 通常由某种数学形式体系(如 SDE)推导而来。
2.13 扩散模型的三个视角
视角一:扩散是潜变量模型 - 已知前向过程:加高斯噪声 - 学习网络近似反向过程 - 优化变分下界(和 VAE 一样!)
视角二:扩散学习评分函数(Score Function) 对 ℝN 上的任意分布 p(x),评分函数 $$s(x) = \frac{\partial}{\partial x}\log p(x)$$ 是指向高概率密度区域的向量场。 > 扩散 = 训练神经网络近似 pdata 的评分函数。
视角三:扩散求解随机微分方程(SDE) 连续加噪过程可写成 SDE: dx = f(x, t) dt + g(t) dw > 扩散 = 训练神经网络近似求解这个 SDE。
📚 推荐阅读:Sander Dieleman 的博客 “Perspectives on Diffusion”(https://sander.ai/2023/07/20/perspectives.html)
2.14 自回归模型卷土重来(Autoregressive Models Strike Back)
回想自回归模型:在原始像素上太慢 → 但它们在(离散)潜变量上表现极好!
1 | 图像 → Encoder → 离散潜变量(整数!) → 自回归模型建模序列 |
📚 VQ-VAE (van den Oord et al., NeurIPS 2017);VQ-VAE-2 (Razavi et al., NeurIPS 2019);VQGAN (Esser et al., CVPR 2021);Parti (Yu et al., 2022)
$\large\star$ 三、总结
| 模型 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| GAN | G 骗 D 的 minimax 博弈:minGmaxD𝔼[log D(x)] + 𝔼[log (1 − D(G(z)))] | 公式简单、图像质量高 | 无损失曲线、训练不稳定、难扩展 |
| Rectified Flow | 学速度场 v = z − x,从噪声迭代走回数据:L = ‖fθ(xt, t) − v‖22 | 简单可扩展、训练稳定 | 采样需 30–50 步(可蒸馏) |
| CFG | vcfg = (1 + w)vy − wv∅ | 可控条件强度、质量高 | 采样成本翻倍 |
| LDM | 在潜空间(VAE+GAN 编码器)做扩散 | 支持高分辨率 | 解码器可能模糊(用 GAN 缓解) |
| DiT | 用 Transformer 做扩散骨干 | 可扩展到大模型 | — |
| 广义扩散 | xt = a(t)x + b(t)z,预测 ygt = c(t)x + d(t)z | 统一 RF/VP/VE、x/ε/v 预测 | 术语混乱 |
三种视角:潜变量模型(变分下界)· 评分函数(s(x) = ∇xlog p(x))· SDE(dx = fdt + gdw)
下一讲:CS231n(拾伍)——3D视觉
