本讲主题:生成模型(第一部分)。核心内容包括: - 回顾:自监督学习(SimCLR、MoCo、DINO) - 监督 vs 无监督、生成 vs 判别模型 - 生成模型分类学:自回归模型(Autoregressive)、变分自编码器(VAE) - 下一讲:GAN 与扩散模型(Generative Models Part 2)


$\large\star$ 回顾:自监督学习(Self-Supervised Learning)

核心思想:数据无标签,但可以从数据本身自动构造标签/输出,训练 Encoder 学得表示:

1
2
3
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
2
3
4
5
6
7
8
9
10
11
12
                        Generative models(生成模型)
│
┌────────────────────┴────────────────────┐
Explicit density(显式密度) Implicit density(隐式密度)
可以计算 P(x) 不能算 p(x),但可以从 P(x) 采样
│ │
┌─────┴──────┐ ┌───────┴───────┐
Tractable Approximate Direct Indirect
(可计算) (近似密度) (直接采样) (间接采样)
│ │ │ │
Autoregressive VAE GAN Diffusion
(真的计算 P(x))(近似 P(x)) (直接采样)(迭代过程近似采样)
分支 代表模型 能否计算 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
2
3
4
5
Encoder(MLP/CNN/Transformer)
x ──────────────────────────→ z(特征:物体身份、外观、场景类型…)
│
Decoder(MLP/CNN/Transformer) │
x̂(重建)←──────────────────────────┘
  • 损失:输入与重建之间的 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
2
3
4
  q_φ(z|x)                       p_θ(x|z)
Encoder(输入 x, Decoder(输入 z,
输出 z 的分布) 输出 x 的分布)
x ──→ μ_{z|x}, Σ_{z|x} z ──→ μ_{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))

  1. 编码:输入 x 过编码器 → 得到 z 的分布 qϕ(z|x) = 𝒩(μz|x, Σz|x)
  2. 先验损失:编码器输出应接近标准高斯(零均值、单位方差)→ DKL
  3. 采样 z:从 qϕ(z|x) 采样(重参数化技巧,见下)
  4. 解码:z 过解码器 → 得到预测的数据均值 μx|z
  5. 重建损失:预测均值与 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 采样生成

  1. 从先验采样 z ∼ 𝒩(0, I)
  2. 过解码器生成图像 μ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 各维独立,分别控制不同变化因子

下一讲:CS231n(拾肆)——生成模型(下)