第 9 讲 · 变分自编码器(VAE)+ 零样本与少样本 · Variational Autoencoders + Zero-shot vs. Few-shot

Generative AI · Lecture 09。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Spring 2026;Matt Gormley),Lecture 9 · Wed 11-Feb · Variational Autoencoders(slides:lecture9-vae-icl)。 阅读材料:Kingma & Welling (2014), Auto-Encoding Variational Bayes;Doersch (2016), Tutorial on Variational Autoencoders;van den Oord, Vinyals & Kavukcuoglu (2017), VQ-VAE;Razavi, van den Oord & Vinyals (2019), VQ-VAE-2。 依据说明:本讲以原课第 9 讲公开的 slides 为主线:GAN → VAE → 扩散模型(“五分钟版”);VAE 的模型与实现;讲 VAE 之前的七件事——自编码器、KL 散度(三个例子)、变分推断与 ELBO、蒙特卡洛估计(“笨办法估计 π”)、得分函数技巧、重参数化技巧、随机梯度变分贝叶斯;VAE 的图模型视角和神经网络视角;推导 VAE 的六步;VAE 的结果(Kingma & Welling 的图像、Bowman et al. 的文本);VQ-VAE 与 VQ-VAE-2;VAE 和扩散模型的联系;最后是零样本学习、少样本学习与提示(slides 注明 Quiz 只考 VAE 部分)。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture09/(5 个脚本 + 1 个模块;01、02 几秒,03、05 约 1.5 分钟,04 约 2 分钟) 预计阅读时间:4 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说明普通自编码器为什么不能当生成模型,VAE 怎样解决这个问题。
  2. 用 slides 的三个例子解释 KL(q ‖ p) 作为目标函数的行为(寻模、低估方差);说明为什么变分推断最大化 ELBO 而不是直接最小化 KL。
  3. 证明 ELBO ≤ log p(x),说出 ELBO 两项(重建与 KL / 期望与熵)的含义。
  4. 解释蒙特卡洛估计的误差率,以及得分函数估计为什么方差大、重参数化为什么方差小。
  5. 按 slides 的六步推导并实现 VAE;解释 VAE “模糊”的来源(解码器方差 σ 与 β-VAE 的取舍)。
  6. 描述 VQ-VAE:码本、直通估计、为什么需要一个”强先验”;把它和语言模型联系起来。
  7. 比较 GAN、扩散模型、VAE、VQ-VAE 的优缺点;区分零样本、少样本学习,说明提示是什么。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面再展开 Previewed only
前置讲 P2 §3–5:KL、前向 / 反向 KL、ELBO、蒙特卡洛与梯度估计器上下文学习、提示工程、指令微调(第 11 讲)
第 6–8 讲:GAN、扩散模型、形状世界和四把尺子潜空间扩散里的 VAE(第 12、14 讲)
第 2 讲:GPT(本讲用它当 VQ-VAE 的先验)把图像变成 token 的多模态模型(第 13 讲)

0.3 本讲地图 Map

§1  GAN → VAE → 扩散模型(五分钟版)
§2  自编码器:为什么不能采样                                          ← 代码 03(第 1 部分)
§3  KL 散度作为目标函数                                              ← 代码 01(第 1–2 部分)
§4  变分推断与 ELBO                                                  ← 代码 01(第 3 部分)
§5  蒙特卡洛估计与重参数化                                            ← 代码 02
§6  推导并实现 VAE
§7  VAE 的结果:形状世界上的 VAE,为什么模糊                           ← 代码 03
§8  VQ-VAE 与 VQ-VAE-2                                              ← 代码 04
§9  第二单元总对比                                                   ← 代码 05
§10 零样本、少样本与提示
§11–15  小结、误区、练习、延伸阅读、下一讲

1. GAN → VAE → 扩散模型(五分钟版)

slides 把第 7 讲的表格再写一遍,这次把”最大似然”写成公式:

θ^=arg⁡max⁡θ∑i=1Nlog⁡p(x(i)),p(x)=∫zp(x∣z) p(z) dz.\hat\theta = \arg\max_\theta \sum_{i=1}^N \log p(x^{(i)}),\qquad p(x) = \int_z p(x \mid z)\, p(z)\, dz .
模型最大似然?学习
GANp(z)=N(0,I)p(z) = \mathcal N(0, I);pθ(x∣z)p_\theta(x \mid z) = 在 Gθ(z)G_\theta(z) 上的点质量不行(第 6 讲 §7.2)极小极大博弈
VAEp(z)=N(0,I)p(z) = \mathcal N(0, I);pθ(x∣z)=N(μθ(z),Σθ(z))p_\theta(x \mid z) = \mathcal N(\mu_\theta(z), \Sigma_\theta(z));编码器 qϕ(z∣x)=N(μϕ(x),Σϕ(x))q_\phi(z \mid x) = \mathcal N(\mu_\phi(x), \Sigma_\phi(x))不行:积分算不出来θ,ϕ=arg⁡min⁡KL(qϕ(z∣x) ∥ pθ(z∣x))\theta, \phi = \arg\min\mathrm{KL}(q_\phi(z \mid x) \,\|\, p_\theta(z \mid x))
扩散模型TT 层隐变量,编码器固定不行ELBO(第 8 讲 §2)

slides 给出的 VAE 解码器是一个一层隐藏层的 MLP:

h=tanh⁡(W1z+b1),μθ(z)=W2h+b2,Σθ(z)=(W3h+b3) I.h = \tanh(W_1 z + b_1),\qquad \mu_\theta(z) = W_2 h + b_2,\qquad \Sigma_\theta(z) = (W_3 h + b_3)\, I .

以及它的实现(slides 的”第 6 步”,下面 §6 会一步步推出来):给定训练图 x(i)x^{(i)},取 S=1S = 1:

  1. ε(1)∼N(0,I)\varepsilon^{(1)} \sim \mathcal N(0, I);
  2. 编码器 MLP 算出 μϕ(x)\mu_\phi(x)、σϕ(x)\sigma_\phi(x);
  3. 隐变量 z(1)=μϕ(x)+σϕ(x)⊙ε(1)z^{(1)} = \mu_\phi(x) + \sigma_\phi(x) \odot \varepsilon^{(1)};
  4. ℓ(θ,ϕ)=log⁡pθ(x(i)∣z(1))−KL(qϕ(z∣x(i)) ∥ p(z))\ell(\theta, \phi) = \log p_\theta(x^{(i)} \mid z^{(1)}) - \mathrm{KL}(q_\phi(z \mid x^{(i)}) \,\|\, p(z))(一个样本的 ELBO 估计);
  5. 反向传播,更新 θ,ϕ\theta, \phi。(slides 把 ℓ\ell 叫作 “Loss”,又写成 θ,ϕ←θ,ϕ−γ∇ℓ\theta, \phi \leftarrow \theta, \phi - \gamma\nabla\ell;ℓ\ell 是要最大化的 ELBO,所以要么做梯度上升,要么把损失取成 −ℓ-\ell 再做梯度下降——代码里用的是后者。)

要读懂这五行,需要七件事:自编码器、KL 散度、变分推断、蒙特卡洛估计、(得分函数技巧)、重参数化技巧、随机梯度变分贝叶斯(SGVB)。下面一件件来。


2. 自编码器(不是变分的那种)· Autoencoders

slides 的定义:

  • 数据:只有无标签的样本 xx。
  • 模型:两个函数,z=ENCODER(x)z = \text{ENCODER}(x),x′=DECODER(z)x' = \text{DECODER}(z),∣x∣=∣x′∣|x| = |x'|。
  • 训练:最小化重建误差 ∥x−DECODER(ENCODER(x))∥2\lVert x - \text{DECODER}(\text{ENCODER}(x))\rVert^2。
  • 目标:学一个低维的表示(slides 的图来自 Hinton & Salakhutdinov 2006 发表在 Science 上的论文——第 4 讲 §2.1 提过的”预训练”的起点)。

问题:自编码器不定义概率分布,所以”从隐空间采样”实际上只是在采训练图的重建。03 在形状世界上训练了一个 AE(784 → 512 → 16 → 512 → 784,tanh,82 万参数):

  • 重建很准:500 张没见过的图,每像素均方误差 0.0025。
  • 直接从 N(0,I)\mathcal N(0, I) 采 zz 解码:FD 3956、像形状的比例 0.00——完全不行。原因看编码本身:各维标准差在 2.2–4.9 之间,均值的绝对值最大 6.9,根本不在 N(0,I)\mathcal N(0, I) 附近。N(0,I)\mathcal N(0, I) 的大部分 zz 落在解码器从没见过的地方。

slides 的总结:“自编码器学到了输入的低维表示,但很难当生成模型用——它的一个关键局限是没有办法从它采样。VAE 则学到一个连续的、容易采样的隐空间。”


3. KL 散度作为目标函数 · KL divergence

定义:KL(q ∥ p)=Eq(x)[log⁡q(x)p(x)]=∑xq(x)log⁡q(x)p(x)\mathrm{KL}(q \,\|\, p) = \mathbb E_{q(x)}\left[\log\frac{q(x)}{p(x)}\right] = \sum_x q(x)\log\frac{q(x)}{p(x)}(连续时换成积分)。性质:衡量 qq 和 pp 有多接近;不对称;当且仅当 q=pq = p 时取最小值 0。

slides 用三个例子讲”把 KL 当目标函数时会发生什么”(01 第 1、2 部分):

例 1:单个 x′x' 的贡献 q(x′)log⁡(q(x′)/p(x′))q(x')\log(q(x')/p(x'))。

x′x'q(x′)q(x')p(x′)p(x')贡献(以 10 为底,slides 的数字)贡献(nat)对 KL 的影响
10.40.400不变
20.40.1+0.24+0.555大幅增加
30.10.4−0.06−0.139略减
40.10.100不变

(slides 表里的 0.24、−0.06 是以 10 为底的对数。)KL(q ‖ p) 坚持在 qq 概率大的地方近似得好,对 qq 概率小的地方不太在乎。

例 2:p=[0.7,0.2,0.1]p = [0.7, 0.2, 0.1],哪个 qq 让 KL 最小? q(1)=[1/3,1/3,1/3]q^{(1)} = [1/3, 1/3, 1/3] 给出 +0.324;q(2)=pq^{(2)} = p 给出 0;q(3)=[0.1,0.1,0.1]q^{(3)} = [0.1, 0.1, 0.1] 算出来是 −0.264。slides:“为什么不返回 q(3)q^{(3)}?因为它不是一个分布!“KL ≥ 0 只对两个归一化的分布成立。

例 3:平均场。 pp 是相关的二维高斯(相关系数 0.9,边缘标准差 1),q(x1,x2)=N(x1)N(x2)q(x_1, x_2) = \mathcal N(x_1)\mathcal N(x_2) 两维独立。

最小化qq 的标准差最小的 KL
KL(q ‖ p)0.436 / 0.4360.830
KL(p ‖ q)1.000 / 1.0000.830

最小化 KL(q ‖ p) 时 σi2=1/Λii\sigma_i^2 = 1/\Lambda_{ii}(Λ=Σ−1\Lambda = \Sigma^{-1} 是精度矩阵):qq 是一个”缩在 pp 里面”的小圆,宁可漏掉沿对角线伸出去的部分,也不肯把概率放到 pp 很小的地方。反方向 KL(p ‖ q) 匹配边缘方差,是一个”盖住 pp“的大圆。(两个方向的最小 KL 恰好相等,都是 −12log⁡(1−ρ2)-\tfrac12\log(1-\rho^2),但最优的 qq 完全不同。)这就是前置讲 P2 §3.5 的”反向 KL 寻模、前向 KL 覆盖”,也是第 6 讲 §3.7 里 GAN”宁可漏”的同一个道理。


4. 变分推断与 ELBO · Variational inference

4.1 问题

slides 的四步框架:

  1. 目标:估计一个分布 pα(z∣x)p_\alpha(z \mid x)(后验),假设它算不出来;
  2. 变分近似:用另一个分布 qθ(z∣x)≈pα(z∣x)q_\theta(z \mid x) \approx p_\alpha(z \mid x) 去近似,比如平均场:qθ(z∣x)=∏tqt(zt∣x;θt)q_\theta(z \mid x) = \prod_t q_t(z_t \mid x; \theta_t),各变量独立;
  3. 优化问题:θ^=arg⁡min⁡θKL(qθ(z∣x) ∥ pα(z∣x))\hat\theta = \arg\min_\theta \mathrm{KL}(q_\theta(z \mid x) \,\|\, p_\alpha(z \mid x));
  4. 优化算法:比如对一个替代目标 ELBO 做梯度下降。

4.2 为什么不能直接最小化 KL

KL(q ∥ p(z∣x))=Eq[log⁡q(z∣x)]−Eq[log⁡p(x,z)]+log⁡p(x).\mathrm{KL}(q \,\|\, p(z \mid x)) = \mathbb E_q[\log q(z \mid x)] - \mathbb E_q[\log p(x, z)] + \log p(x).

最后一项 log⁡p(x)\log p(x) 正是我们算不出来的东西——“糟了,连这个 KL 都算不了”。但它不依赖 qq!所以

arg⁡min⁡qKL=arg⁡max⁡qEq[log⁡p(x,z)]−Eq[log⁡q(z∣x)]⏟ELBO(q).\arg\min_q \mathrm{KL} = \arg\max_q \underbrace{\mathbb E_q[\log p(x, z)] - \mathbb E_q[\log q(z \mid x)]}_{\text{ELBO}(q)} .

“我们不需要算这个 KL,只要最大化 ELBO(证据下界)。”

ELBO 的两项(slides):第一项 Eq[log⁡p(x,z)]\mathbb E_q[\log p(x, z)] 高,说明 qq 把概率放在 pp 也放概率的地方;第二项 −Eq[log⁡q]=H(q)-\mathbb E_q[\log q] = H(q) 是 qq 的熵,qq 越摊开越高。两者的平衡点就是最优的 qq。

定理:对任何 qq,log⁡p(x)≥ELBO(q)\log p(x) \ge \text{ELBO}(q)。证明:log⁡p(x)=ELBO(q)+KL(q ∥ p(z∣x))\log p(x) = \text{ELBO}(q) + \mathrm{KL}(q \,\|\, p(z \mid x)),KL ≥ 0。slides 的三条要点:(1) 变分推断找的是让归一化常数(p(x)p(x))的下界最紧的 qq;(2) 最大化 ELBO 等价于最小化 KL;(3) 最大化 ELBO 就是在最大化似然 p(x)p(x) 的一个下界。

4.3 一个后验有两个峰的例子

01 的第 3 部分:z∼N(0,1)z \sim \mathcal N(0, 1),x∣z∼N(z2,0.32)x \mid z \sim \mathcal N(z^2, 0.3^2),观测到 x=1x = 1。因为平方抹掉了符号(第 7 讲 §2 第 4 条),后验在 z≈±1z \approx \pm 1 有两个对称的峰。数值积分得 log⁡p(x=1)=−1.3346\log p(x = 1) = -1.3346。用高斯 q(z)=N(μ,s2)q(z) = \mathcal N(\mu, s^2)、重参数化的随机梯度(§5)最大化 ELBO 3000 步:

起点 μ最终 μ最终 sEq[log⁡p(x,z)]\mathbb E_q[\log p(x, z)]H(q)H(q)ELBOlog⁡p(x)−ELBO\log p(x) - \text{ELBO}
+0.8+0.9360.164−1.669−0.390−2.0580.724
−0.8−0.9240.170−1.711−0.352−2.0620.728
  • 两次都有 ELBO ≤ log p(x),差距就是 KL(q ‖ 后验)。我们从没算过 KL 本身,只是最大化 ELBO,KL 就跟着变小。
  • 高斯的 qq 只有一个峰,各自停在离起点近的那个峰上,完全忽略另一个。两个峰各占后验的一半,所以差距约为 ln⁡2=0.693\ln 2 = 0.693——又一次”寻模”。

5. 蒙特卡洛估计与重参数化 · Monte Carlo and the reparameterization trick

5.1 蒙特卡洛估计

目标:估计 φ=Ex∼p[f(x)]\varphi = \mathbb E_{x \sim p}[f(x)]。做法:采 SS 个样本,φ^=1S∑sf(x(s))\hat\varphi = \frac1S\sum_s f(x^{(s)})。性质:无偏;方差 σ2/S\sigma^2/S(标准误差 σ/S\sigma/\sqrt S)。

slides 的”笨办法估计 π”:在单位正方形里撒点,落在四分之一圆里的比例乘 4。02 的第 1 部分:S=1S = 1 万时 3.1464(误差 0.0048)、100 万时 3.1398、1000 万时 3.1418(误差 0.0002),实际误差在理论值 1.64/S1.64/\sqrt S 附近上下跳。(slides 里同一个实验 S=12S = 12 时得到 3.3333。)

slides 的两个”实践中的挑战”:收敛速度和维数无关——这是蒙特卡洛相对于网格积分(要 kdk^d 个点)的巨大优势;但方差的常数 σ2\sigma^2 在高维问题里可能大得没法用。02 的第 2 部分:估计 E[2d⋅1[x 的每一维都>0]]\mathbb E[2^d\cdot 1[x \text{ 的每一维都} > 0]](真值永远是 1),每次 10 万个样本。d=10d = 10 时估计 0.92、d=15d = 15 时 0.66,d≥20d \ge 20 时一个样本都”落不进去”,估计是 0——单个样本的标准差 2d−1\sqrt{2^d - 1} 随维数指数增长。

5.2 对期望求梯度:得分函数 vs 重参数化

VAE 要对 Eqϕ(z∣x)[f(z)]\mathbb E_{q_\phi(z \mid x)}[f(z)](ff 是重建项)关于 ϕ\phi 求梯度。难点是:ϕ\phi 出现在”对谁求期望”里。两种办法(前置讲 P2 §5.3–5.4):

  • 得分函数(score function,又叫 REINFORCE):∇ϕEqϕ[f(z)]=Eqϕ[f(z)∇ϕlog⁡qϕ(z)]\nabla_\phi\mathbb E_{q_\phi}[f(z)] = \mathbb E_{q_\phi}[f(z)\nabla_\phi\log q_\phi(z)]。只要能算 ff 的值,不需要 ff 可导。
  • 重参数化(reparameterization):把采样写成 z=μϕ(x)+σϕ(x)⊙εz = \mu_\phi(x) + \sigma_\phi(x)\odot\varepsilon,ε∼N(0,I)\varepsilon \sim \mathcal N(0, I),于是 ∇ϕEqϕ[f(z)]=Eε[∇ϕf(μϕ+σϕ⊙ε)]\nabla_\phi\mathbb E_{q_\phi}[f(z)] = \mathbb E_\varepsilon[\nabla_\phi f(\mu_\phi + \sigma_\phi\odot\varepsilon)]。随机性全挪到了不依赖参数的 ε\varepsilon 上,zz 成了参数的可导函数。

slides 画了两张计算图:不用重参数化时,“从 N(μ,σ2)\mathcal N(\mu, \sigma^2) 采样 zz“是一个不可导的节点,梯度到这里就断了;用了之后,采样节点挪到了旁边的 ε\varepsilon 上,梯度沿着 z=μ+σεz = \mu + \sigma\varepsilon 流回 μ\mu 和 σ\sigma。Doersch (2016) 的图 4 也是同一个意思:“两个网络的前向行为完全一样,但只有右边那个能做反向传播。”

02 的第 3 部分:对 Ez∼N(μ,Id)[∥z−1∥2]\mathbb E_{z \sim \mathcal N(\mu, I_d)}[\lVert z - 1\rVert^2] 求 ∂/∂μ1\partial/\partial\mu_1(真值 −1),各取 2 万个单样本估计:

维数 d得分函数得分函数 + 基线重参数化
1−0.99 ± 4.3−1.00 ± 3.4−0.99 ± 2.00
10−1.16 ± 15.5−1.08 ± 6.2−1.01 ± 1.99
100−1.79 ± 127.5−1.08 ± 17.3−1.01 ± 1.99
1000−9.83 ± 1261−1.27 ± 55.6−1.01 ± 2.01

(均值 ± 单个样本的标准差。)三种都无偏,但得分函数把整个 f(z)f(z)(dd 维的总和)乘到一个方向的”得分”上,其他维度的波动全变成噪声,标准差随 d\sqrt d 增长;基线去掉了 ff 的平均水平,但去不掉”其他维度的波动”。重参数化只用 ∂f/∂z1\partial f/\partial z_1,和其他维度无关。

在训练好的 VAE 上(02 第 4 部分,一张测试图、编码器输出 μ\mu 的 16 维梯度、各 4000 个单样本估计):得分函数的单样本标准差是重参数化的约 193 倍(−log⁡p(x∣z)-\log p(x \mid z) 本身在 −200 附近,这个”平均水平”全部变成了噪声),加上基线后仍是约 3.6 倍。要达到同样的精度,分别需要多约 37,000 倍和 13 倍的样本。slides 的实现每张图只取 S=1S = 1 个样本,重参数化最划算。(ff 不可导时——比如第 11–12 讲 RLHF 里的奖励——只能用得分函数加基线。)


6. 推导并实现 VAE · Deriving the VAE

6.1 slides 的六步

  1. 问题:自编码器不能采样。办法:定义一个能采样的解码器:p(z)=N(0,I)p(z) = \mathcal N(0, I),pθ(x∣z)=N(μθ(z),Σθ(z))p_\theta(x \mid z) = \mathcal N(\mu_\theta(z), \Sigma_\theta(z)),μθ\mu_\theta、Σθ\Sigma_\theta 是神经网络。
  2. 问题:用这个解码器做最大似然 arg⁡max⁡θlog⁡∫pθ(x∣z)p(z) dz\arg\max_\theta\log\int p_\theta(x \mid z)p(z)\,dz 算不出来。办法:引入编码器 qϕ(z∣x)=N(μϕ(x),Σϕ(x))q_\phi(z \mid x) = \mathcal N(\mu_\phi(x), \Sigma_\phi(x)),改为最大化下界:θ^,ϕ^=arg⁡max⁡ELBO(qϕ,pθ)\hat\theta, \hat\phi = \arg\max\text{ELBO}(q_\phi, p_\theta),log⁡pθ(x)≥ELBO\log p_\theta(x) \ge \text{ELBO}。
  3. 问题:直觉上应该交替进行——先调 ϕ\phi 让 qϕq_\phi 尽量贴近当前的 pθp_\theta(变分推断),再调 θ\theta 尽量提高似然(学习)——但这样太慢。办法:用随机梯度上升同时更新 θ\theta 和 ϕ\phi。
  4. 问题:ELBO 的第一项算不出来:ELBO=Eqϕ(z∣x)[log⁡pθ(x∣z)]−KL(qϕ(z∣x) ∥ p(z))\text{ELBO} = \mathbb E_{q_\phi(z \mid x)}[\log p_\theta(x \mid z)] - \mathrm{KL}(q_\phi(z \mid x) \,\|\, p(z))。办法:蒙特卡洛估计,≈1S∑slog⁡pθ(x∣z(s))\approx\frac1S\sum_s\log p_\theta(x \mid z^{(s)}),z(s)∼qϕz^{(s)} \sim q_\phi。
  5. 问题:对 ϕ\phi 求梯度时,这个近似(得分函数形式)方差非常大。办法:先重参数化,再做蒙特卡洛:z(s)=μϕ(x)+σϕ(x)⊙ε(s)z^{(s)} = \mu_\phi(x) + \sigma_\phi(x)\odot\varepsilon^{(s)}。
  6. 实现:每张训练图取 S=1S = 1,见 §1 的五行。

ELBO 在这里写成了”重建项 − KL 项”:把 log⁡p(x,z)=log⁡p(x∣z)+log⁡p(z)\log p(x, z) = \log p(x \mid z) + \log p(z) 代进 §4 的 ELBO 即得。第二项 KL 在两个高斯之间有闭式解,不需要采样:

KL(N(μ,diag σ2) ∥ N(0,I))=12∑j(μj2+σj2−1−log⁡σj2).\mathrm{KL}(\mathcal N(\mu, \mathrm{diag}\,\sigma^2) \,\|\, \mathcal N(0, I)) = \tfrac12\sum_j(\mu_j^2 + \sigma_j^2 - 1 - \log\sigma_j^2).

6.2 两个视角

  • 图模型视角(slides):VAE 由两个图模型组成,各自由一个神经网络定义——编码器 qϕ(z∣x)q_\phi(z \mid x) 和解码器 pθ(x∣z)p_\theta(x \mid z);解码器其实是 xx 和 zz 上的联合模型 pθ(x,z)=pθ(x∣z)p(z)p_\theta(x, z) = p_\theta(x \mid z)p(z)。θ\theta、ϕ\phi 是神经网络的参数,不是变分参数——这和 §4 的经典变分推断不同:经典 VI 对每个数据点单独优化一个 qq;VAE 用一个网络 μϕ(x)\mu_\phi(x) 直接”算出”每个数据点的 qq,这叫摊销推断(amortized inference)。
  • 神经网络视角:编码器 → 采样(重参数化)→ 解码器,损失 = 重建误差 + KL。和普通自编码器相比,多了”采样”和”KL”两样东西:采样让编码器不能只给一个点,KL 把所有编码拉向 N(0,I)\mathcal N(0, I)。

vae_lab.VAE 就是 slides 的结构(Kingma & Welling 2014 也是这样:编码器、解码器都是一层隐藏层的 MLP)。解码器的方差:slides 写的是由网络输出 Σθ(z)=(W3h+b3)I\Sigma_\theta(z) = (W_3h + b_3)I;我们的代码两种都支持,但默认把 σ\sigma 固定成一个超参数——下一节会看到,这个数决定了 VAE 的性格。


7. VAE 的结果 · VAE results

7.1 slides 里的结果

  • Kingma & Welling (2014) 提出 VAE,用在图像生成上:p(z)=N(0,I)p(z) = \mathcal N(0, I);pθ(x∣z)p_\theta(x \mid z) 是多维高斯,均值和方差由一层隐藏层的全连接网络算出;qϕ(z∣x)q_\phi(z \mid x) 是对角协方差的高斯。slides 展示了 MNIST 和人脸(Frey Face)的隐空间:二维隐变量的网格上,数字和表情连续地变化。
  • Bowman et al. (2015) 把 VAE 用在离散的文本上:编码器是一个读入句子的 LSTM,解码器是一个 LSTM 语言模型(第 2 讲),qϕ(z∣x)q_\phi(z \mid x) 仍是高斯。在两个句子的编码之间插值,可以得到”语法通顺、意思渐变”的一串句子。

7.2 形状世界上的 VAE

03 用和 AE 同样大小的网络(隐变量 16 维、隐藏层 512、tanh),解码器 σ=0.3\sigma = 0.3,训练 5000 步:

从隐空间采 500 个 zFD↓像形状的比例边缘宽度像素噪声
真实新图0.481.000.610.030
AE,z∼N(0,I)z \sim \mathcal N(0, I)39560.002.910.041
AE,z∼z \sim 拟合编码的高斯45.80.190.940.016
VAE,z∼N(0,I)z \sim \mathcal N(0, I)116.20.381.040.018

(边缘宽度:拟合形状时最合适的边缘模糊程度;像素噪声:远离边缘的平坦区域里的噪声。见第 6 讲的 shape_metrics。)

  • VAE 能采样:从 N(0,I)\mathcal N(0, I) 直接采,就能解码出形状(像形状的比例 0.38),而 AE 完全不行。KL 项把所有编码挤向 N(0,I)\mathcal N(0, I),先验里随便一个 zz 都落在”解码器见过”的区域。这就是 slides 说的”VAE 能采样、AE 不能”。
  • 一个出乎意料的对照:给 AE 的编码事后拟合一个高斯再采样,FD 是 45.8,反而比 VAE 好;不过像形状的比例 0.19 低于 VAE 的 0.38——两把尺子又一次给出不同的排序。在 16 维这么小的隐空间里,“事后拟合一个分布”就是一个简单有效的补救(Ghosh et al., 2020 把这类方法叫”正则化的确定性自编码器”)。VAE 的好处是不需要这一步,而且它是一个有严格定义的概率模型(有 ELBO 可以算),代价是图更糊。
  • VAE 的图是糊的:边缘宽度 1.04(真图 0.61),平坦区域几乎没有噪声(0.018 vs 0.030)。重建也一样:VAE 每像素均方误差 0.0035(重建图的 FD 79.5),AE 0.0025(FD 18.9)。

7.3 为什么模糊:σ 与 β-VAE

解码器 pθ(x∣z)=N(μθ(z),σ2I)p_\theta(x \mid z) = \mathcal N(\mu_\theta(z), \sigma^2 I) 时,重建项是

−log⁡pθ(x∣z)=∥x−μθ(z)∥22σ2+常数.-\log p_\theta(x \mid z) = \frac{\lVert x - \mu_\theta(z)\rVert^2}{2\sigma^2} + \text{常数}.

σ\sigma 决定了”重建误差”和”KL”谁更重要。03 的第 2 部分把 σ\sigma 从 0.05 扫到 0.5:

解码器 σ重建的均方误差KL(nat)用上的隐变量维数样本的 FD↓像形状的比例边缘宽度像素噪声
0.050.002658.916/1622670.002.400.050
0.10.002740.716/167650.031.860.039
0.20.003024.616/161220.181.140.024
0.30.003516.815/161200.361.040.022
0.50.00529.310/161710.730.950.012
  • σ 小:重建误差的权重 1/(2σ2)1/(2\sigma^2) 很大,KL 相对不重要——VAE 越来越像 AE:重建最准,KL 最大(编码散开),隐空间出现空洞,从先验采样得到垃圾(FD 2267)。(slides 那种”方差也由网络学”的写法,在我们的实验里学到 σ≈0.05\sigma \approx 0.05,正好是真实的像素噪声,于是落在这一端:重建好、样本差。)
  • σ 大:KL 更重要,编码被挤向 N(0,I)\mathcal N(0, I),隐空间连续了,但每个 zz 只能携带更少的信息(σ=0.5\sigma = 0.5 时只用上 10 维),解码出的是更多图的”平均”——更平滑、更模糊。
  • 这就是 β-VAE(Higgins et al., 2017)的那个 β:固定 σ\sigma 等价于给 KL 项乘一个系数 β=2σ2\beta = 2\sigma^2(以 σ=1/2\sigma = 1/\sqrt2 为基准)。“VAE 的图很模糊”在很大程度上是这个取舍,加上”只展示解码器的均值”的习惯——均值就是”在这个 zz 下所有可能图像的平均”,平均自然是平滑的。

7.4 隐空间插值

在两张测试图(一个圆、一个三角形)的编码之间走直线(03 第 3 部分):中间帧最差的拟合残差 AE 0.0066、VAE 0.0062,差不多。我原以为 AE 的路径会穿过”空洞”。实际上,在两张真实图的编码之间走,AE 不一定穿过空洞——空洞主要在远离所有训练编码的地方(从 N(0,I)\mathcal N(0, I) 采样时才暴露出来)。


8. VQ-VAE 与 VQ-VAE-2

8.1 离散的隐变量

slides:“VQ-VAE(Vector Quantized VAE)学一个连续的码本,但编码器输出的是离散的编号;解码器拿着编号生成样本。”

vae_lab.VQVAE:卷积编码器把 28×28 的图变成 7×7 个 16 维向量 zez_e;每个向量换成码本(64 个可学习的向量)里最近的那个 eke_k;卷积解码器从 eke_k 重建图像。一张图于是变成 49 个 0–63 之间的编号——和一句话变成 49 个词元一样。

两个技术细节:

  • “取最近”不可导,怎么训练编码器?直通估计(straight-through):前向用 zq=ekz_q = e_k,反向传播时假装 zq=zez_q = z_e,把解码器的梯度原封不动交给编码器。代码写成 z_q = z_e + (e_k − z_e).detach()。
  • 码本怎么学?损失里加两项:∥sg[ze]−ek∥2\lVert\text{sg}[z_e] - e_k\rVert^2 把码本向量拉向编码器的输出;β∥ze−sg[ek]∥2\beta\lVert z_e - \text{sg}[e_k]\rVert^2(“承诺”损失)让编码器别离码本太远。sg = stop gradient。

8.2 实验

04 训练 3000 步(3.7 万参数,单线程约 1 分钟):

  • 重建:每像素均方误差 0.0031,重建图的 FD 51.4(AE 18.9、VAE 79.5);整张图只用 49×6=29449 \times 6 = 294 比特(原图 784 个 32 位浮点数是 25,088 比特)。
  • 码本用上了 28/64 个,有效个数(困惑度)只有 14——“死码”是 VQ-VAE 的常见问题。
  • 重建图被形状拟合认回原来类别的比例:圆 0.99、方 0.96、三角 1.00、十字 0.24——细细的横竖两条在 7×7 的网格、十几个有效码本向量里表示不出来。

VQ-VAE 自己不会生成:它没有”从哪里采编号”的答案。三种先验:

编号的来源FD↓像形状的比例十字的比例(裁判 / 拟合)
(a) 每个位置均匀随机31860.00—
(b) 每个位置按训练集的频率独立采4990.01—
(c) GPT 自回归先验63.80.890.01 / 0.01

(b) 每个位置单独看都”合理”,合起来却拼不成一个形状——位置之间的依赖全丢了。(c) 把 49 个编号排成一句”话”(前面加一个开头符号),用第 2 讲的小 GPT(11 万参数)学它们的联合分布,再一个一个采(第 3 讲的祖先采样):GPT 每个编号的交叉熵 0.816 nat(均匀随机是 ln 64 = 4.16),样本 FD 降到 63.8、像形状的比例 0.89。

这就是 slides 说的 VQ-VAE-2:“学两层(底层和顶层)的编号,再加上隐空间上的一个强先验,样本在高分辨率下也很逼真。“VQ-VAE-2 用 PixelCNN 当先验,DALL·E(第 1 版)用 Transformer。“把图像变成离散 token,再用语言模型生成”是多模态模型的一条重要路线(第 13 讲)。slides 还提到 VQ-VAE 也能生成音频(第 24 讲)。

两个要警惕的地方:

  • 十字几乎没有(两把尺子都只有 0.01):问题不在先验,而在码本——自编码器表示不了的东西,生成器也画不出来。潜空间扩散(第 12 讲)同样受它的 VAE 限制。
  • 它在背训练集吗? GPT 采出的 500 个编号序列和训练集没有一个相同,500 个互不相同——没有背。最近邻距离(0.072)比真实新图(0.074)还小,是因为生成的图几乎没有像素噪声(0.011 vs 0.030),少了噪声带来的那部分距离——最近邻距离也会被”平滑”骗到。

9. 第二单元总对比 · GANs vs. diffusion vs. VAEs

05 把第 6–9 讲的模型放在一起:同一份训练数据、同一套尺子,各采 500 张:

模型参数⏱ 每张图FD↓像形状的比例边缘宽度像素噪声四类比例·拟合(圆/方/三角/十)最近邻距离
真实新图——0.481.000.610.0300.26/0.24/0.26/0.240.074
DCGAN(第 6 讲)143,1370.03 ms33.850.030.880.0320.35/0.27/0.35/0.030.128
扩散 U-Net,DDIM 50 步(第 8 讲)192,14016 ms12.830.100.950.0300.29/0.39/0.26/0.060.109
扩散 U-Net,DDPM 100 步(第 8 讲)192,14032 ms40.450.270.850.0210.36/0.35/0.26/0.030.094
VAE,σ = 0.3(本讲)829,232< 0.01 ms133.710.381.030.0190.18/0.29/0.43/0.100.095
VQ-VAE + GPT 先验(本讲)148,8842.5 ms69.320.910.770.0120.40/0.38/0.21/0.010.072

(⏱ 是单线程 CPU 上 500 张一起生成的平均时间,每次运行略有不同。VAE 的 FD 和 §7.2 的 116.2 不同、VQ-VAE 的和 §8.2 的 63.8 不同,是因为这里用了另一个随机种子采样——500 张图的 FD 本身就有这么大的抽样波动。)

  • 按 FD 最好的是 DDIM 50 步的扩散模型(12.8),按”像形状的比例”最好的是 VQ-VAE + GPT(0.91)。两把尺子给出的排序不一样:FD 惩罚”和真图的统计不一样”(包括缺少像素噪声、边缘太糊),形状拟合只问”是不是一个干净的形状”,它喜欢平滑的图。
  • 像素噪声明显低于真图的是 DDPM 跳步 100 步、VAE 和 VQ-VAE:它们画的是”平均的”图(VAE 显示解码器的均值;VQ-VAE 的解码器同样用均方误差训练;DDPM 跳步时高斯近似把纹理平均掉了)。DCGAN 和 DDIM 的像素噪声和真图相当——它们连噪声纹理也学着画了出来。
  • 没有一个模型在所有尺子上都赢。这正是生成模型评估的现实:FID、人工打分、下游任务……各看一个侧面。
  • 训练上:GAN 要两个网络博弈,对学习率、种子极其敏感(第 6 讲);VAE、VQ-VAE、扩散模型都是普通的回归 / 似然目标,一次就训练成功。扩散模型训练和采样都最贵(每张图几十到上千次网络调用);VAE 和 GAN 一步出图;VQ-VAE 需要第二个模型(GPT)当先验,而且生成能力的上限是码本能表示什么。

slides 用一张图展示了 VAE 和扩散模型的联系:两者都是”编码器把数据变成隐变量、解码器变回来”,都用 ELBO 训练;VAE 只有一层、编码器要学;扩散模型有 TT 层、编码器是固定的加噪(第 8 讲 §6)。这两条路线后来合到了一起:Stable Diffusion 先用一个 VAE 把图像压缩到一个小的潜空间,再在潜空间里做扩散(第 12、14 讲)。


10. 零样本、少样本与提示 · Zero-shot, few-shot, and prompting

slides 的最后一部分(不在这次 Quiz 的范围内)为第 11 讲的”上下文学习”做铺垫。

零样本学习(zero-shot learning):训练数据里没有任何测试时会出现的标签的样本。“连一个例子都没有,怎么学?“slides 的回答:“作弊!“——利用”对标签的描述”。例子(Larochelle et al., AAAI 2008):要识别从没见过的类别,就给模型这个类别的文字描述或属性。

少样本学习(few-shot learning):训练数据里每个标签只有一小把(两三个、四五个)例子。

提示(prompting):

  • 语言模型被训练成最大化训练序列的似然;大多数根据前面的词元生成后面的词元。自回归语言模型定义 p(x1:T)=∏tp(xt∣x1,…,xt−1)p(x_{1:T}) = \prod_t p(x_t \mid x_1, \ldots, x_{t-1})。
  • 提示的核心想法:给模型一个前缀字符串,让它”最可能的续写”恰好就是你想要的答案。
  • 条件采样:要采一个样本,先喂进一个提示(上下文),再从”以提示为条件”的模型里采样(slides 用 GPT-3 论文里续写诗歌的例子)。
  • 用提示的想法,一个语言模型可以去做各种 NLP 任务(slides 的 GPT-3 例子):回答事实性问题、合乎逻辑地补全句子、完成类比、阅读理解……在零样本设置下,只是把上下文喂给模型、看它怎样续写——不做任何额外训练。

这和我们前面做过的几个实验是同一回事:

  • 第 4 讲 §2.8:农场语言 GPT 做”主语单复数”判断,零样本(比较两种动词形式的概率)就是 1.000;
  • 第 5 讲 §5.4:BERT 和 GPT 判断语法,零样本都是 1.000;
  • 本讲 §8:VQ-VAE 的 GPT 先验”以开头符号为提示”续写 49 个编号,就生成了一张图。

少样本提示(把几个”问题–答案”的例子放进上下文,再问新问题)是 GPT-3 最让人惊讶的能力:模型的参数完全不变,只看了上下文里的几个例子就”学会”了新任务。为什么会这样、什么时候会失败,是第 11 讲的主题。(我们也试过让第 3 讲那个只有两层、在独立句子上训练的农场语言 GPT 做少样本:在上下文里示范同一个”反常”的句子 5 遍,它续写这个句子的概率并没有提高——上下文学习不是免费的,它依赖模型规模和训练数据的结构。这个探索没有放进脚本,第 11 讲会用更合适的设置再做。)


11. 小结 · Summary

  1. 自编码器能压缩、能重建,但它的隐空间没有概率结构,不能采样;VAE 用”编码器给出分布 + KL 拉向先验”解决这个问题。
  2. KL(q ‖ p) 作为目标会寻模、低估方差;变分推断因为 log⁡p(x)\log p(x) 算不出来而改为最大化 ELBO,ELBO ≤ log p(x),差距正是 KL。
  3. 蒙特卡洛估计的误差率和维数无关,但方差的常数可能随维数爆炸;得分函数估计的方差随维数增长,重参数化不会——这是 VAE 能训练的关键。
  4. VAE = 摊销的变分推断 + 重参数化 + 随机梯度:损失 = 重建项 + KL。解码器方差 σ(等价于 β)在”重建准”和”能采样”之间取舍;VAE 的模糊大多来自这个取舍和”展示均值”的习惯。
  5. VQ-VAE 把图变成离散的编号,重建不模糊,但自己不会生成;需要一个强先验(GPT / PixelCNN)。生成能力的上限是码本能表示什么。
  6. 同一套尺子下,扩散模型的 FD 最好,VQ-VAE + GPT 的”像形状”最好,没有一个模型全赢。
  7. 零样本、少样本、提示:把任务写成语言模型的续写——第 11 讲展开。

12. 常见误区 · Common pitfalls

  • “VAE 就是加了噪声的自编码器。” 关键不在噪声,而在 KL 项把编码的分布拉向先验,这样从先验采样才有意义。
  • “变分推断在最小化 KL,所以要先算 KL。” KL 里有算不出的 log⁡p(x)\log p(x);我们最大化 ELBO,KL 自动变小。
  • “ELBO 越大,模型越好。” ELBO 是下界,它的大小同时取决于模型和下界的松紧;而且 σ 这样的超参数会改变”重建项”的量级。
  • “重参数化技巧是为了让采样可导。” 更准确地说:它把随机性挪到不依赖参数的 ε\varepsilon 上,让梯度能穿过 zz;它的好处是方差小(§5.2),得分函数估计也是无偏的。
  • “VAE 一定比 GAN 糊。” 模糊主要来自解码器方差的选择和”展示均值”;σ 小时 VAE 的重建很清楚,只是不能采样。
  • “VQ-VAE 是生成模型。” 它是一个离散的自编码器;生成要靠另一个模型学编号的分布。
  • “用一个分类器数一数,就知道生成的图缺了哪类。” 见第 6 讲 §4.2:在画得不标准的图上,分类器和形状拟合经常意见不一致。VQ-VAE 缺十字这件事,两把尺子都同意,而且重建也表示不了十字,所以可信。
  • “零样本 = 模型没见过这个任务的任何信息。” 它见过任务的描述(标签的描述、提示里的说明),只是没见过带标签的例子。

13. 练习 · Exercises

练习 1(KL 的方向)。 用 slides 例 1 的数字解释:为什么 KL(q ‖ p) 在 q(x′)q(x') 大而 p(x′)p(x') 小的地方惩罚重、在 q(x′)q(x') 小而 p(x′)p(x') 大的地方惩罚轻?如果把目标换成 KL(p ‖ q) 会怎样?

参考答案

贡献是 qlog⁡(q/p)q\log(q/p):qq 是权重,log⁡(q/p)\log(q/p) 是”多估了多少倍”。q=0.4q = 0.4、p=0.1p = 0.1:权重大、比值大(log 4),贡献 +0.555;q=0.1q = 0.1、p=0.4p = 0.4:权重小,贡献只有 −0.139。换成 KL(p ‖ q) 时权重变成 pp:pp 大而 qq 小的地方惩罚重,于是 qq 必须”盖住”所有 pp 大的地方——前向 KL 覆盖(例 3 的大圆)。

练习 2(平均场的方差)。 p=N(0,Σ)p = \mathcal N(0, \Sigma),Σ=[1ρρ1]\Sigma = \begin{bmatrix}1 & \rho\\ \rho & 1\end{bmatrix}。证明最小化 KL(q ‖ p) 的平均场高斯有 σi2=1−ρ2\sigma_i^2 = 1 - \rho^2。ρ=0.9\rho = 0.9 时 σi\sigma_i 是多少?

参考答案

Λ=Σ−1=11−ρ2[1−ρ−ρ1]\Lambda = \Sigma^{-1} = \frac{1}{1-\rho^2}\begin{bmatrix}1 & -\rho\\ -\rho & 1\end{bmatrix},最优 σi2=1/Λii=1−ρ2\sigma_i^2 = 1/\Lambda_{ii} = 1 - \rho^2。ρ=0.9\rho = 0.9:σi=0.19=0.436\sigma_i = \sqrt{0.19} = 0.436(01 的输出)。直觉:1/Λii1/\Lambda_{ii} 是”给定另一维时这一维的条件方差”,平均场 qq 只能捕捉条件方差,捕捉不了相关性带来的额外伸展。

练习 3(ELBO ≤ log p)。 用 Jensen 不等式证明 log⁡p(x)≥Eq[log⁡p(x,z)−log⁡q(z)]\log p(x) \ge \mathbb E_q[\log p(x, z) - \log q(z)],并说明等号何时成立。

参考答案

log⁡p(x)=log⁡∫q(z)p(x,z)q(z)dz=log⁡Eq[p(x,z)q(z)]≥Eq[log⁡p(x,z)q(z)]\log p(x) = \log\int q(z)\frac{p(x, z)}{q(z)}dz = \log\mathbb E_q\left[\frac{p(x, z)}{q(z)}\right] \ge \mathbb E_q\left[\log\frac{p(x, z)}{q(z)}\right](log 是凹函数)。等号当且仅当 p(x,z)/q(z)p(x, z)/q(z) 对 qq 几乎处处是常数,即 q(z)=p(z∣x)q(z) = p(z \mid x)。

练习 4(VAE 的 KL 项)。 编码器对某张图输出 μ=(1,0)\mu = (1, 0)、σ2=(0.25,1)\sigma^2 = (0.25, 1)。求 KL(q ‖ N(0, I))。哪一维”在用”、哪一维”没在用”?

参考答案

第 1 维:12(1+0.25−1−ln⁡0.25)=12(0.25+1.386)=0.818\tfrac12(1 + 0.25 - 1 - \ln 0.25) = \tfrac12(0.25 + 1.386) = 0.818;第 2 维:12(0+1−1−0)=0\tfrac12(0 + 1 - 1 - 0) = 0。合计 0.818 nat。第 2 维的后验就是先验,不携带关于这张图的任何信息——“没在用”的维度(03 用”KL > 0.1”来数用上的维数;σ = 0.5 时只用了 10/16 维)。

练习 5(σ 与 β)。 证明:解码器 N(μθ(z),σ2I)\mathcal N(\mu_\theta(z), \sigma^2 I) 的负 ELBO,乘以 2σ22\sigma^2 后等于 ∥x−μθ(z)∥2+2σ2 KL+常数\lVert x - \mu_\theta(z)\rVert^2 + 2\sigma^2\,\mathrm{KL} + \text{常数}。所以固定 σ 的 VAE 等价于哪种 β-VAE?

参考答案

负 ELBO =∥x−μ∥22σ2+d2log⁡(2πσ2)+KL= \frac{\lVert x-\mu\rVert^2}{2\sigma^2} + \frac{d}{2}\log(2\pi\sigma^2) + \mathrm{KL},乘 2σ22\sigma^2 得 ∥x−μ∥2+2σ2KL+\lVert x-\mu\rVert^2 + 2\sigma^2\mathrm{KL} + 常数。等价于”均方误差 + β·KL”的 β-VAE,β=2σ2\beta = 2\sigma^2。σ = 0.05 → β = 0.005(几乎不管 KL,像 AE);σ = 0.5 → β = 0.5。

练习 6(得分函数的方差)。 z∼N(μ,Id)z \sim \mathcal N(\mu, I_d),f(z)=∥z−1∥2f(z) = \lVert z - 1\rVert^2。计算得分函数估计 f(z)(z1−μ1)f(z)(z_1 - \mu_1) 的方差在 dd 很大时的主导项(取 μ=0.5⋅1\mu = 0.5\cdot\mathbf 1)。

参考答案

f=∑j(zj−1)2f = \sum_j(z_j - 1)^2,每项均值 1.251.25、方差 2+4×0.25=32 + 4\times0.25 = 3((zj−1)∼N(−0.5,1)(z_j - 1) \sim \mathcal N(-0.5, 1),Var[(a+ε)2]=2+4a2\mathrm{Var}[(a+\varepsilon)^2] = 2 + 4a^2)。f(z1−μ1)=fε1f(z_1 - \mu_1) = f\varepsilon_1;dd 很大时 f≈1.25df \approx 1.25d 与 ε1\varepsilon_1 近似独立,方差 ≈E[f2]≈(1.25d)2\approx\mathbb E[f^2] \approx (1.25d)^2——标准差约 1.25d1.25d。d=1000d = 1000 时约 1250(02 实测 1261)。(所以严格说是随 dd 线性增长;减去平均值作基线后剩下 Var(f)≈3d\mathrm{Var}(f) \approx 3d,标准差约 3d=55\sqrt{3d} = 55,02 实测 55.6。)

练习 7(直通估计)。 z_q = z_e + (e_k − z_e).detach() 的前向值是多少?∂zq/∂ze\partial z_q/\partial z_e 是多少?如果直接写 z_q = e_k,编码器会得到什么梯度?

参考答案

前向值 ze+ek−ze=ekz_e + e_k - z_e = e_k;.detach() 的部分对梯度是常数,所以 ∂zq/∂ze=I\partial z_q/\partial z_e = I。直接写 z_q = e_k 时,eke_k 来自 argmin 和查表,和 zez_e 之间没有可导的路径,编码器从重建损失得到的梯度是 0,只能靠承诺损失学习。

练习 8(VQ-VAE 的信息量)。 7×7 个编号、码本 64 个向量,一张图最多能有多少种不同的编码?为什么”每个位置按频率独立采”的先验(§8.2 的 (b))画不出形状?

参考答案

6449=229464^{49} = 2^{294} 种。真实图像的编码只占其中极小一部分,而且位置之间强相关(形状的边缘必须连起来)。独立采样相当于假设 49 个位置互相独立(第 6 讲的图模型语言:没有任何边),每个位置的边缘分布对,联合分布却完全错了。GPT 用自回归把所有依赖都建模了进去。

练习 9(零样本与少样本)。 用一句话分别说明零样本学习和少样本学习”用了什么信息”;第 4 讲的”零样本判断主语单复数”属于哪一种?

参考答案

零样本:没有带标签的例子,只用了”对任务 / 标签的描述”(或者把任务改写成模型本来就会做的事);少样本:每个标签有一小把带标签的例子。第 4 讲属于零样本:没有给任何”这句是单数 / 复数”的标注,而是把判断改写成”比较两种动词形式的概率”——语言模型本来就会做的事。

14. 延伸阅读 · Further reading

  • VAE:Kingma & Welling (2014);Rezende, Mohamed & Wierstra (2014)(同时独立提出);Doersch (2016) 教程;Kingma & Welling (2019), An Introduction to Variational Autoencoders。
  • 模糊与先验:Higgins et al. (2017), β-VAE;Bowman et al. (2016), Generating Sentences from a Continuous Space(文本 VAE 与”后验坍塌”);Ghosh et al. (2020), From Variational to Deterministic Autoencoders;Vahdat & Kautz (2020), NVAE。
  • 离散隐变量:van den Oord et al. (2017), VQ-VAE;Razavi et al. (2019), VQ-VAE-2;Ramesh et al. (2021), DALL·E;Esser, Rombach & Ommer (2021), VQGAN。
  • 变分推断与梯度估计:Blei, Kucukelbir & McAuliffe (2017);Mohamed et al. (2020), Monte Carlo Gradient Estimation in Machine Learning。
  • 零样本与少样本:Larochelle, Erhan & Bengio (2008), Zero-data Learning of New Tasks;Brown et al. (2020), Language Models are Few-Shot Learners(GPT-3)。

15. 下一讲预告 · Next lecture

第二单元(图像生成模型)到这里结束。第 10 讲进入第三单元”应用与适配基础模型”:模型越来越大,全量微调越来越贵——参数高效微调(PEFT):只训练一小部分参数(适配器、前缀、LoRA),能做到多好?第 4 讲已经看到”只训练一个线性探针”有时比全量微调还好,第 10 讲会把这条线索展开。

← 返回课程目录