本讲主题:生成模型(第二部分)。上一讲的分类学中,今天覆盖剩余两类: - GAN(生成对抗网络)——隐式密度、直接采样 - 扩散模型(Diffusion Models)——隐式密度、迭代采样(本讲以 Rectified Flow 为代表) - 以及现代扩展:Latent Diffusion、DiT、文生图/文生视频、扩散蒸馏


$\large\star$ 回顾:生成模型分类学

1
2
3
4
5
6
7
8
9
                       Generative models
│
┌────────────────────┴────────────────────┐
Explicit density(显式) Implicit density(隐式)
│ │
┌─────┴──────┐ ┌───────┴───────┐
Tractable Approximate Direct Indirect
Autoregressive VAE GAN Diffusion
(上一讲) (本讲) (本讲)

已有模型回顾:

模型 思想
自回归模型 直接最大化训练数据的似然: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
2
z ~ p(z) → Generator G → 生成图像 x
真实图像(来自 p_data)→ Discriminator D → 真/假 判断
  • 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
2
3
4
# 不是最小化任何整体损失!没有训练曲线可看!
while True:
D = D + α_D * dV/dD # 最大化 V:判别器变强
G = G - α_G * dV/dG # 最小化 V:生成器骗过判别器

⚠️ 训练初期的梯度消失问题:开始时生成器很差,判别器一眼识破真假,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 直觉

  1. 选一个噪声分布 z ∼ pnoise(通常为单位高斯)
  2. 考虑数据 x 在不同噪声水平 t 下被破坏得到带噪数据 xt:
    • t = 0:无噪声(就是原始数据 x)
    • t = 1:纯噪声
  3. 训练一个神经网络去除一点点噪声:fθ(xt, t)
  4. 推理(采样)时:采样 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)

  1. 选择步数 T(通常 T = 50)
  2. 采样 x ∼ pnoise(即 x1)
  3. 对 $t \in [1,\ 1-\frac{1}{T},\ 1-\frac{2}{T},\ \dots,\ 0]$:
    • 计算 vt = fθ(xt, t)
    • 更新 x = x − vt/T(沿速度走一步)
  4. 返回 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──> 图像
  1. 训练 Encoder + Decoder 把图像转换为潜变量(常见:D = 8, C = 16;256 × 256 × 3 ⇒ 32 × 32 × 16;Encoder/Decoder 是带注意力的 CNN)
  2. 冻结 Encoder,训练扩散模型去除潜变量上的噪声
  3. 训练完成后采样:采样随机潜变量 → 迭代应用扩散模型去噪 → 过 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
2
文本提示 → 预训练文本编码器(T5, CLIP) → 文本嵌入 D×L
带噪潜变量 h×w×c → Diffusion Transformer(时间步注入) → 干净潜变量 → Decoder → 输出图像 H×W×3

示例:FLUX.1 [dev] - 文本编码器:T5 + CLIP - Encoder/Decoder:8×8 下采样 - 扩散模型:12B 参数;2×2 patchify → 64×64 = 1024 个图像 token

2.10 文生视频(Text-to-Video)

1
2
文本提示 → 文本编码器 → 文本嵌入
带噪视频潜变量 t×h×w×c → Diffusion Transformer → 干净潜变量 → Decoder → 视频 T×H×W×3

示例: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
2
图像 → Encoder → 离散潜变量(整数!) → 自回归模型建模序列
采样离散潜变量 → Decoder → 图像

📚 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视觉