CS231n(拾叁)——生成模型
本讲主题:生成模型(第一部分)。核心内容包括: - 回顾:自监督学习(SimCLR、MoCo、DINO) - 监督 vs 无监督、生成 vs 判别模型 - 生成模型分类学:自回归模型(Autoregressive)、变分自编码器(VAE) - 下一讲:GAN 与扩散模型(Generative Models Part 2)
$\large\star$ 回顾:自监督学习(Self-Supervised Learning)
核心思想:数据无标签,但可以从数据本身自动构造标签/输出,训练 Encoder 学得表示:
1 | Dataset(无标签) → Encoder → 表示 → Decoder/Classifier/Regressor |
Pretext tasks(代理任务)
| 类型 | 思想 |
|---|---|
| 变换类 | 旋转(rotation)、修复(inpainting)、重排(rearrangement)、上色(coloring) |
| 重建类 | 基于重建的学习,如 MAE(Masked Autoencoder) |
对比学习(Contrastive Learning)
核心直觉(以 SimCLR 为例):
- 同一张图的不同随机变换 → 特征应该相似
- 不同图片 → 特征应该不相似
- 训练目标:拉近正对、推远负对
⚠️ SimCLR 的问题:需要很大的 batch size(包含大量负样本),否则负样本不够、训练效果差。
MoCo(Momentum Contrast)
| 与 SimCLR 的区别 | 说明 |
|---|---|
| 负样本队列 | 维护一个运行中的 key 队列(负样本),不依赖当前 batch |
| 只更新 query 编码器 | 梯度只通过 queries 传播 |
| 解耦 batch 与负样本数 | 可以用小 batch 支撑大量负样本 |
| 动量更新 key 编码器 | key encoder 通过动量规则缓慢推进(no_grad) |
DINO 与 DINOv2
- DINO(Caron et al., 2021):与 MoCo 思想类似,但用 KL 散度匹配特征(而非点积),使用 Vision Transformer(而非 ResNet)
- DINOv2(Oquab et al., 2023):训练数据从 ImageNet 的 1M 张扩展到 142M 张,特征极强,是实践中常用的骨干网络
$\large\star$ 一、监督 vs 无监督学习
| 监督学习(Supervised) | 无监督学习(Unsupervised) |
|---|---|
| 数据:(x, y),x 是数据、y 是标签 | 数据:只有 x,没有标签 |
| 目标:学习映射 x → y | 目标:学习数据中的隐藏结构 |
| 例子:分类、回归、目标检测、语义分割、图像描述 | 例子:聚类(K-means)、降维(PCA)、密度估计 |
无监督的核心任务之一是密度估计:建模 p(x),即数据 x 本身的概率分布。
$\large\star$ 二、生成模型 vs 判别模型
| 模型 | 学习目标 | 用途 |
|---|---|---|
| 判别模型(Discriminative) | p(y ∣ x) | 分类、回归、检测…(前几讲的所有模型) |
| 生成模型(Generative) | p(x) | 密度估计、采样生成新数据 |
| 条件生成模型(Conditional Generative) | p(x ∣ y) | 给定标签/条件生成数据,实践中最常见 |
2.1 概率密度回顾
- p(x) 为每个可能的 x 赋予一个正数,越大表示越可能
- 密度函数是归一化的:∫Xp(x) dx = 1
- 不同的 x 相互竞争概率质量
2.2 判别 vs 生成:概率的竞争对象不同
判别模型:只有同一图像内的不同标签竞争概率 P(cat ∣ 图), P(dog ∣ 图) > ⚠️ 不同图像之间没有竞争;且对任何输入都必须给出标签分布——无法处理不合理的输入(如猴子图、抽象图)。
生成模型:所有可能的图像相互竞争概率质量 P(猫图), P(狗图), P(猴图), … > ✅ 模型可以给不合理输入很小的概率质量来”拒绝”它;建模 p(x) 需要对世界的深层理解(狗更可能坐还是站?三条腿的狗比三条胳膊的猴子更常见?)。
2.3 贝叶斯公式的联系
$$P(x \mid y) = \frac{P(y \mid x)\, P(y)}{P(x)}$$
- 判别模型 P(y ∣ x) × 标签先验 P(y) ÷ 数据分布 P(x) → 条件生成模型
- 理论上可由各组件拼出条件生成模型,但实践中很少这么做
2.4 生成模型的用途
| 用途 | 说明 |
|---|---|
| 给数据打标签 | 分类 |
| 特征学习 | 有标签 / 无标签 |
| 异常检测(Outlier Detection) | 给异常数据低概率 |
| 采样生成新数据 | 无条件生成 / 给定标签生成 |
| 生成 + 异常拒绝 | 打标签时同时拒绝离群点 |
💡 讲义中 “Generative models” 通常指 p(x) 与 p(x|y) 两者;实践中条件生成模型最常用。
$\large\star$ 三、为什么需要生成模型?
建模歧义性(Modeling Ambiguity):对于一个输入 y,存在很多可能的输出 x,我们希望建模 P(x ∣ y):
| 任务 | 输入 y | 输出 x |
|---|---|---|
| 语言建模 | 指令文本 | 生成的文本(逐 token 条件采样) |
| 文生图(Text-to-Image) | 文本描述 | 图像 |
| 图生视频(Image-to-Video) | 图像 | “接下来会发生什么”的视频帧 |
例如 LLM 的回答就是从一个学到的 P 中采样:每个 token 都条件于之前的所有 token。
$\large\star$ 四、生成模型分类学(Taxonomy)
分类图改编自 Ian Goodfellow, Tutorial on GAN, 2017
1 | Generative models(生成模型) |
| 分支 | 代表模型 | 能否计算 p(x) | 能否采样 |
|---|---|---|---|
| 显式-可计算 | 自回归模型(Autoregressive) | ✅ 真的计算 P(x) | ✅(逐元素生成) |
| 显式-近似 | 变分自编码器(VAE) | ❌ 只能近似 | ✅(从先验采样) |
| 隐式-直接 | GAN | ❌ | ✅ 直接采样 |
| 隐式-间接 | 扩散模型(Diffusion) | ❌ | ✅ 迭代近似采样 |
📌 本讲(今天):自回归模型 + VAE;下一讲:GAN + 扩散模型。
$\large\star$ 五、自回归模型(Autoregressive Models)
5.1 最大似然估计(Maximum Likelihood Estimation)
目标:写出显式函数 p(x) = f(x, W)。
给定数据集 x(1), x(2), …, x(N),通过最大化训练数据的概率训练模型:
W* = arg maxW∏ip(x(i))
Log 技巧(把连乘变连加):
W* = arg maxW∑ilog p(x(i)) = arg maxW∑ilog f(x(i), W)
这就是我们的损失函数——用梯度上升(最大化)来优化。
5.2 概率的链式法则
假设 x 是序列 x = (x1, x2, …, xT):
$$p(x) = p(x_1)\, p(x_2 \mid x_1)\, p(x_3 \mid x_1, x_2) \cdots = \prod_{t=1}^{T} p(x_t \mid x_1, \dots, x_{t-1})$$
🧠 我们已经见过这个! - RNN 语言建模(Lecture 7) - LLM 就是自回归模型:用 Masked Transformer 做语言建模,每个 token 只条件于之前的 token
5.3 图像的自回归模型:PixelRNN / PixelCNN
核心思想:把图像当作一个 8-bit 子像素(subpixel)值序列(按扫描线顺序):
- 每个子像素预测为 256 个值 [0…255] 的分类问题
- 用 RNN 或 Transformer 建模整个序列
p(x) = ∏tp(xt ∣ x1, …, xt − 1)
📚 参考文献: - Van den Oord et al., “Pixel Recurrent Neural Networks”, ICML 2016 - Van den Oord et al., “Conditional Image Generation with PixelCNN Decoders”, NeurIPS 2016
⚠️ 问题:太贵了!1024 × 1024 的图像是 300 万个子像素的序列。 解决方案(预告):不建模子像素序列,而建模 tile(图块)序列。
$\large\star$ 六、变分自编码器(VAE)
6.1 (非变分)自编码器 Autoencoder
思想:无监督地从输入 x 提取特征 z(无标签)。
1 | Encoder(MLP/CNN/Transformer) |
- 损失:输入与重建之间的 L2 距离 ∥x̂ − x∥22——完全不需要标签!
- 训练完后,Encoder 可用于下游任务(接分类器等)
能否用 Decoder 生成图像? 如果能生成新的 z,就能用 Decoder 生成图像:
⚠️ 问题:生成新的 z 并不比生成新的 x 更容易! 解决方案:强制所有 z 都来自一个已知的分布。
6.2 VAE 的概率化改造
Kingma and Welling, “Auto-Encoding Variational Bayes”, ICLR 2014
概率化自编码器: 1. 从原始数据学习潜在特征 z 2. 从模型采样生成新数据
直觉:x 是图像,z 是生成 x 的潜在因子(属性、朝向等)。假设训练数据 x(i) 是由未观测到的潜在表示 z 生成的。
生成(采样)过程: z ∼ p(z) (从先验采样,如高斯) x ∼ pθ(x ∣ z) (从条件分布采样)
6.3 如何训练?——最大似然的两条死路
基本想法:最大似然。但我们观测不到 z,所以边际化:
pθ(x) = ∫pθ(x, z) dz = ∫pθ(x ∣ z) pθ(z) dz
- Decoder 能算 pθ(x|z) ✅,先验 p(z) 假设为高斯 ✅
- ⚠️ 问题:要对所有 z 积分——无法计算!
换一条路:贝叶斯公式:
$$p_\theta(x) = \frac{p_\theta(x \mid z)\, p_\theta(z)}{p_\theta(z \mid x)}$$
- ⚠️ 问题:后验 pθ(z|x) 无法计算!
解决方案:训练另一个网络学习 qϕ(z ∣ x) ≈ pθ(z ∣ x)
6.4 编码器 / 解码器网络
1 | q_φ(z|x) p_θ(x|z) |
旁注:网络如何输出概率分布? 网络输出(对角)分布的均值(和标准差):
pθ(x ∣ z) = 𝒩(μx|z, σ2), qϕ(z ∣ x) = 𝒩(μz|x, Σz|x)
解码器损失的重建含义:
$$\log p_\theta(x \mid z) = -\frac{1}{2\sigma^2} \|x - \mu\|_2^2 + C$$
💡 最大化 log pθ(x|z) 等价于最小化 x 与网络输出 μ 的 L2 距离!
6.5 ELBO:变分下界的推导
目标:log pθ(x) 不可计算 → 推导它的下界(可优化的目标)。
Step 1:贝叶斯公式 $$\log p_\theta(x) = \log \frac{p_\theta(x \mid z)\, p(z)}{p_\theta(z \mid x)}$$
Step 2:上下同乘 qϕ(z|x) $$= \log \frac{p_\theta(x \mid z)\, p(z)\, q_\phi(z\mid x)}{p_\theta(z \mid x)\, q_\phi(z\mid x)}$$
Step 3:对数拆开 $$= \log p_\theta(x \mid z) - \log \frac{q_\phi(z\mid x)}{p(z)} + \log \frac{q_\phi(z\mid x)}{p_\theta(z\mid x)}$$
Step 4:与 z 无关 → 包上期望 𝔼z ∼ qϕ(z|x)[⋅] $$\log p_\theta(x) = \mathbb{E}_z[\log p_\theta(x \mid z)] - \mathbb{E}_z \log \frac{q_\phi(z\mid x)}{p(z)} + \mathbb{E}_z \log \frac{q_\phi(z\mid x)}{p_\theta(z\mid x)}$$
Step 5:写成 KL 散度 $$\log p_\theta(x) = \underbrace{\mathbb{E}_{z \sim q_\phi(z|x)}[\log p_\theta(x \mid z)]}_{\text{重建:x → 编码器 → 解码器应重建 x}} - \underbrace{D_{KL}\big(q_\phi(z\mid x),\, p(z)\big)}_{\text{先验:编码器输出应匹配 z 的先验(高斯,可闭式求解)}} + \underbrace{D_{KL}\big(q_\phi(z\mid x),\, p_\theta(z\mid x)\big)}_{\text{后验近似:编码器输出应匹配真后验(无法计算…)}}$$
Step 6:KL 散度 ≥ 0,丢掉最后一项得到下界:
$$\boxed{\ \log p_\theta(x) \ \ge\ \mathbb{E}_{z \sim q_\phi(z|x)}[\log p_\theta(x \mid z)] - D_{KL}\big(q_\phi(z\mid x)\,\|\, p(z)\big)\ }$$
🎯 这就是 VAE 的训练目标,也叫 ELBO(Evidence Lower Bound): 联合训练编码器 q 与解码器 p,最大化数据似然的变分下界。
6.6 VAE 训练五步法
目标: max 𝔼z ∼ qϕ(z|x)[log pθ(x ∣ z)] − DKL(qϕ(z ∣ x) ∥ p(z))
- 编码:输入 x 过编码器 → 得到 z 的分布 qϕ(z|x) = 𝒩(μz|x, Σz|x)
- 先验损失:编码器输出应接近标准高斯(零均值、单位方差)→ DKL
- 采样 z:从 qϕ(z|x) 采样(重参数化技巧,见下)
- 解码:z 过解码器 → 得到预测的数据均值 μx|z
- 重建损失:预测均值与 x 做 L2 → −log pθ(x|z)
6.7 重参数化技巧(Reparameterization Trick)
问题:从 qϕ(z|x) 采样 z 的操作不可导,梯度无法回传到编码器。
解决:把随机性”外包”给独立的噪声源 ϵ:
z = μz|x + Σz|x ⊙ ϵ, ϵ ∼ 𝒩(0, I)
💡 采样变成确定性变换 + 固定分布的噪声,梯度可以沿 μ、Σ 通路回传。
6.8 两个损失项在”打架”
| 损失项 | 想要的 qϕ(zx) |
|---|---|
| 重建损失 | Σzx = 0,且每个 x 的 μzx 独一无二 → 解码器能确定性地重建 x |
| 先验损失(KL) | Σzx = I、μzx = 0 → 编码器输出恒为标准高斯 |
⚖️ 两者互相牵制:重建损失追求”确定、精确”,先验损失追求”标准、模糊”——这个张力正是 VAE 泛化能力的关键。
6.9 从 VAE 采样生成
- 从先验采样 z ∼ 𝒩(0, I)
- 过解码器生成图像 μx|z
6.10 解耦(Disentangling)
p(z) 采用对角(各维独立)先验 → z 的各维度相互独立:
- 只变化 z1 → 只改变某种属性(如姿势)
- 只变化 z2 → 只改变另一种属性(如朝向)
💡 这就是”解耦变化的因子(Disentangling factors of variation)“,是 VAE 潜空间的一个经典性质。
$\large\star$ 七、总结
| 概念 | 核心要点 |
|---|---|
| 自监督学习 | 从数据自身构造标签:变换类 pretext / 对比学习(SimCLR 需大 batch,MoCo 用队列解耦) |
| 监督 vs 无监督 | 有标签学映射 x → y;无标签学隐藏结构(聚类、降维、密度估计) |
| 生成 vs 判别 | 判别学 p(y ∣ x);生成学 p(x);条件生成 p(x ∣ y) 实践最常用 |
| 生成模型分类学 | 显式(自回归=真算 p(x),VAE=近似)/ 隐式(GAN=直接采样,扩散=迭代采样) |
| 最大似然 | W* = arg max ∑ilog f(x(i), W),log 技巧把乘积变求和 |
| 自回归模型 | 链式法则逐元素分解 p(x);PixelRNN/PixelCNN 把图像当子像素序列 |
| 普通自编码器 | Encoder 提取特征 + Decoder L2 重建,无标签;但不能直接生成新 z |
| VAE | 强制 z ∼ 𝒩(0, I);用编码器 qϕ 近似后验 |
| ELBO | log pθ(x) ≥ 𝔼[log pθ(xz)] − DKL(qϕ‖p) = 重建损失 − 先验 KL |
| 重参数化 | z = μ + Σ ⊙ ϵ,让采样可导 |
| 解耦 | 对角先验 → z 各维独立,分别控制不同变化因子 |
