对应 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
学完这一讲,你应该能够:
- 说明普通自编码器为什么不能当生成模型,VAE 怎样解决这个问题。
- 用 slides 的三个例子解释 KL(q ‖ p) 作为目标函数的行为(寻模、低估方差);说明为什么变分推断最大化 ELBO 而不是直接最小化 KL。
- 证明 ELBO ≤ log p(x),说出 ELBO 两项(重建与 KL / 期望与熵)的含义。
- 解释蒙特卡洛估计的误差率,以及得分函数估计为什么方差大、重参数化为什么方差小。
- 按 slides 的六步推导并实现 VAE;解释 VAE “模糊”的来源(解码器方差 σ 与 β-VAE 的取舍)。
- 描述 VQ-VAE:码本、直通估计、为什么需要一个”强先验”;把它和语言模型联系起来。
- 比较 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 讲的表格再写一遍,这次把”最大似然”写成公式:
| 模型 | 最大似然? | 学习 | |
|---|---|---|---|
| GAN | ; = 在 上的点质量 | 不行(第 6 讲 §7.2) | 极小极大博弈 |
| VAE | ;;编码器 | 不行:积分算不出来 | |
| 扩散模型 | 层隐变量,编码器固定 | 不行 | ELBO(第 8 讲 §2) |
slides 给出的 VAE 解码器是一个一层隐藏层的 MLP:
以及它的实现(slides 的”第 6 步”,下面 §6 会一步步推出来):给定训练图 ,取 :
- ;
- 编码器 MLP 算出 、;
- 隐变量 ;
- (一个样本的 ELBO 估计);
- 反向传播,更新 。(slides 把 叫作 “Loss”,又写成 ; 是要最大化的 ELBO,所以要么做梯度上升,要么把损失取成 再做梯度下降——代码里用的是后者。)
要读懂这五行,需要七件事:自编码器、KL 散度、变分推断、蒙特卡洛估计、(得分函数技巧)、重参数化技巧、随机梯度变分贝叶斯(SGVB)。下面一件件来。
2. 自编码器(不是变分的那种)· Autoencoders
slides 的定义:
- 数据:只有无标签的样本 。
- 模型:两个函数,,,。
- 训练:最小化重建误差 。
- 目标:学一个低维的表示(slides 的图来自 Hinton & Salakhutdinov 2006 发表在 Science 上的论文——第 4 讲 §2.1 提过的”预训练”的起点)。
问题:自编码器不定义概率分布,所以”从隐空间采样”实际上只是在采训练图的重建。03 在形状世界上训练了一个 AE(784 → 512 → 16 → 512 → 784,tanh,82 万参数):
- 重建很准:500 张没见过的图,每像素均方误差 0.0025。
- 直接从 采 解码:FD 3956、像形状的比例 0.00——完全不行。原因看编码本身:各维标准差在 2.2–4.9 之间,均值的绝对值最大 6.9,根本不在 附近。 的大部分 落在解码器从没见过的地方。
slides 的总结:“自编码器学到了输入的低维表示,但很难当生成模型用——它的一个关键局限是没有办法从它采样。VAE 则学到一个连续的、容易采样的隐空间。”
3. KL 散度作为目标函数 · KL divergence
定义:(连续时换成积分)。性质:衡量 和 有多接近;不对称;当且仅当 时取最小值 0。
slides 用三个例子讲”把 KL 当目标函数时会发生什么”(01 第 1、2 部分):
例 1:单个 的贡献 。
| 贡献(以 10 为底,slides 的数字) | 贡献(nat) | 对 KL 的影响 | |||
|---|---|---|---|---|---|
| 1 | 0.4 | 0.4 | 0 | 0 | 不变 |
| 2 | 0.4 | 0.1 | +0.24 | +0.555 | 大幅增加 |
| 3 | 0.1 | 0.4 | −0.06 | −0.139 | 略减 |
| 4 | 0.1 | 0.1 | 0 | 0 | 不变 |
(slides 表里的 0.24、−0.06 是以 10 为底的对数。)KL(q ‖ p) 坚持在 概率大的地方近似得好,对 概率小的地方不太在乎。
例 2:,哪个 让 KL 最小? 给出 +0.324; 给出 0; 算出来是 −0.264。slides:“为什么不返回 ?因为它不是一个分布!“KL ≥ 0 只对两个归一化的分布成立。
例 3:平均场。 是相关的二维高斯(相关系数 0.9,边缘标准差 1), 两维独立。
| 最小化 | 的标准差 | 最小的 KL |
|---|---|---|
| KL(q ‖ p) | 0.436 / 0.436 | 0.830 |
| KL(p ‖ q) | 1.000 / 1.000 | 0.830 |
最小化 KL(q ‖ p) 时 ( 是精度矩阵): 是一个”缩在 里面”的小圆,宁可漏掉沿对角线伸出去的部分,也不肯把概率放到 很小的地方。反方向 KL(p ‖ q) 匹配边缘方差,是一个”盖住 “的大圆。(两个方向的最小 KL 恰好相等,都是 ,但最优的 完全不同。)这就是前置讲 P2 §3.5 的”反向 KL 寻模、前向 KL 覆盖”,也是第 6 讲 §3.7 里 GAN”宁可漏”的同一个道理。
4. 变分推断与 ELBO · Variational inference
4.1 问题
slides 的四步框架:
- 目标:估计一个分布 (后验),假设它算不出来;
- 变分近似:用另一个分布 去近似,比如平均场:,各变量独立;
- 优化问题:;
- 优化算法:比如对一个替代目标 ELBO 做梯度下降。
4.2 为什么不能直接最小化 KL
最后一项 正是我们算不出来的东西——“糟了,连这个 KL 都算不了”。但它不依赖 !所以
“我们不需要算这个 KL,只要最大化 ELBO(证据下界)。”
ELBO 的两项(slides):第一项 高,说明 把概率放在 也放概率的地方;第二项 是 的熵, 越摊开越高。两者的平衡点就是最优的 。
定理:对任何 ,。证明:,KL ≥ 0。slides 的三条要点:(1) 变分推断找的是让归一化常数()的下界最紧的 ;(2) 最大化 ELBO 等价于最小化 KL;(3) 最大化 ELBO 就是在最大化似然 的一个下界。
4.3 一个后验有两个峰的例子
01 的第 3 部分:,,观测到 。因为平方抹掉了符号(第 7 讲 §2 第 4 条),后验在 有两个对称的峰。数值积分得 。用高斯 、重参数化的随机梯度(§5)最大化 ELBO 3000 步:
| 起点 μ | 最终 μ | 最终 s | ELBO | |||
|---|---|---|---|---|---|---|
| +0.8 | +0.936 | 0.164 | −1.669 | −0.390 | −2.058 | 0.724 |
| −0.8 | −0.924 | 0.170 | −1.711 | −0.352 | −2.062 | 0.728 |
- 两次都有 ELBO ≤ log p(x),差距就是 KL(q ‖ 后验)。我们从没算过 KL 本身,只是最大化 ELBO,KL 就跟着变小。
- 高斯的 只有一个峰,各自停在离起点近的那个峰上,完全忽略另一个。两个峰各占后验的一半,所以差距约为 ——又一次”寻模”。
5. 蒙特卡洛估计与重参数化 · Monte Carlo and the reparameterization trick
5.1 蒙特卡洛估计
目标:估计 。做法:采 个样本,。性质:无偏;方差 (标准误差 )。
slides 的”笨办法估计 π”:在单位正方形里撒点,落在四分之一圆里的比例乘 4。02 的第 1 部分: 万时 3.1464(误差 0.0048)、100 万时 3.1398、1000 万时 3.1418(误差 0.0002),实际误差在理论值 附近上下跳。(slides 里同一个实验 时得到 3.3333。)
slides 的两个”实践中的挑战”:收敛速度和维数无关——这是蒙特卡洛相对于网格积分(要 个点)的巨大优势;但方差的常数 在高维问题里可能大得没法用。02 的第 2 部分:估计 (真值永远是 1),每次 10 万个样本。 时估计 0.92、 时 0.66, 时一个样本都”落不进去”,估计是 0——单个样本的标准差 随维数指数增长。
5.2 对期望求梯度:得分函数 vs 重参数化
VAE 要对 ( 是重建项)关于 求梯度。难点是: 出现在”对谁求期望”里。两种办法(前置讲 P2 §5.3–5.4):
- 得分函数(score function,又叫 REINFORCE):。只要能算 的值,不需要 可导。
- 重参数化(reparameterization):把采样写成 ,,于是 。随机性全挪到了不依赖参数的 上, 成了参数的可导函数。
slides 画了两张计算图:不用重参数化时,“从 采样 “是一个不可导的节点,梯度到这里就断了;用了之后,采样节点挪到了旁边的 上,梯度沿着 流回 和 。Doersch (2016) 的图 4 也是同一个意思:“两个网络的前向行为完全一样,但只有右边那个能做反向传播。”
02 的第 3 部分:对 求 (真值 −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 |
(均值 ± 单个样本的标准差。)三种都无偏,但得分函数把整个 ( 维的总和)乘到一个方向的”得分”上,其他维度的波动全变成噪声,标准差随 增长;基线去掉了 的平均水平,但去不掉”其他维度的波动”。重参数化只用 ,和其他维度无关。
在训练好的 VAE 上(02 第 4 部分,一张测试图、编码器输出 的 16 维梯度、各 4000 个单样本估计):得分函数的单样本标准差是重参数化的约 193 倍( 本身在 −200 附近,这个”平均水平”全部变成了噪声),加上基线后仍是约 3.6 倍。要达到同样的精度,分别需要多约 37,000 倍和 13 倍的样本。slides 的实现每张图只取 个样本,重参数化最划算。( 不可导时——比如第 11–12 讲 RLHF 里的奖励——只能用得分函数加基线。)
6. 推导并实现 VAE · Deriving the VAE
6.1 slides 的六步
- 问题:自编码器不能采样。办法:定义一个能采样的解码器:,,、 是神经网络。
- 问题:用这个解码器做最大似然 算不出来。办法:引入编码器 ,改为最大化下界:,。
- 问题:直觉上应该交替进行——先调 让 尽量贴近当前的 (变分推断),再调 尽量提高似然(学习)——但这样太慢。办法:用随机梯度上升同时更新 和 。
- 问题:ELBO 的第一项算不出来:。办法:蒙特卡洛估计,,。
- 问题:对 求梯度时,这个近似(得分函数形式)方差非常大。办法:先重参数化,再做蒙特卡洛:。
- 实现:每张训练图取 ,见 §1 的五行。
ELBO 在这里写成了”重建项 − KL 项”:把 代进 §4 的 ELBO 即得。第二项 KL 在两个高斯之间有闭式解,不需要采样:
6.2 两个视角
- 图模型视角(slides):VAE 由两个图模型组成,各自由一个神经网络定义——编码器 和解码器 ;解码器其实是 和 上的联合模型 。、 是神经网络的参数,不是变分参数——这和 §4 的经典变分推断不同:经典 VI 对每个数据点单独优化一个 ;VAE 用一个网络 直接”算出”每个数据点的 ,这叫摊销推断(amortized inference)。
- 神经网络视角:编码器 → 采样(重参数化)→ 解码器,损失 = 重建误差 + KL。和普通自编码器相比,多了”采样”和”KL”两样东西:采样让编码器不能只给一个点,KL 把所有编码拉向 。
vae_lab.VAE 就是 slides 的结构(Kingma & Welling 2014 也是这样:编码器、解码器都是一层隐藏层的 MLP)。解码器的方差:slides 写的是由网络输出 ;我们的代码两种都支持,但默认把 固定成一个超参数——下一节会看到,这个数决定了 VAE 的性格。
7. VAE 的结果 · VAE results
7.1 slides 里的结果
- Kingma & Welling (2014) 提出 VAE,用在图像生成上:; 是多维高斯,均值和方差由一层隐藏层的全连接网络算出; 是对角协方差的高斯。slides 展示了 MNIST 和人脸(Frey Face)的隐空间:二维隐变量的网格上,数字和表情连续地变化。
- Bowman et al. (2015) 把 VAE 用在离散的文本上:编码器是一个读入句子的 LSTM,解码器是一个 LSTM 语言模型(第 2 讲), 仍是高斯。在两个句子的编码之间插值,可以得到”语法通顺、意思渐变”的一串句子。
7.2 形状世界上的 VAE
03 用和 AE 同样大小的网络(隐变量 16 维、隐藏层 512、tanh),解码器 ,训练 5000 步:
| 从隐空间采 500 个 z | FD↓ | 像形状的比例 | 边缘宽度 | 像素噪声 |
|---|---|---|---|---|
| 真实新图 | 0.48 | 1.00 | 0.61 | 0.030 |
| AE, | 3956 | 0.00 | 2.91 | 0.041 |
| AE, 拟合编码的高斯 | 45.8 | 0.19 | 0.94 | 0.016 |
| VAE, | 116.2 | 0.38 | 1.04 | 0.018 |
(边缘宽度:拟合形状时最合适的边缘模糊程度;像素噪声:远离边缘的平坦区域里的噪声。见第 6 讲的 shape_metrics。)
- VAE 能采样:从 直接采,就能解码出形状(像形状的比例 0.38),而 AE 完全不行。KL 项把所有编码挤向 ,先验里随便一个 都落在”解码器见过”的区域。这就是 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
解码器 时,重建项是
决定了”重建误差”和”KL”谁更重要。03 的第 2 部分把 从 0.05 扫到 0.5:
| 解码器 σ | 重建的均方误差 | KL(nat) | 用上的隐变量维数 | 样本的 FD↓ | 像形状的比例 | 边缘宽度 | 像素噪声 |
|---|---|---|---|---|---|---|---|
| 0.05 | 0.0026 | 58.9 | 16/16 | 2267 | 0.00 | 2.40 | 0.050 |
| 0.1 | 0.0027 | 40.7 | 16/16 | 765 | 0.03 | 1.86 | 0.039 |
| 0.2 | 0.0030 | 24.6 | 16/16 | 122 | 0.18 | 1.14 | 0.024 |
| 0.3 | 0.0035 | 16.8 | 15/16 | 120 | 0.36 | 1.04 | 0.022 |
| 0.5 | 0.0052 | 9.3 | 10/16 | 171 | 0.73 | 0.95 | 0.012 |
- σ 小:重建误差的权重 很大,KL 相对不重要——VAE 越来越像 AE:重建最准,KL 最大(编码散开),隐空间出现空洞,从先验采样得到垃圾(FD 2267)。(slides 那种”方差也由网络学”的写法,在我们的实验里学到 ,正好是真实的像素噪声,于是落在这一端:重建好、样本差。)
- σ 大:KL 更重要,编码被挤向 ,隐空间连续了,但每个 只能携带更少的信息( 时只用上 10 维),解码出的是更多图的”平均”——更平滑、更模糊。
- 这就是 β-VAE(Higgins et al., 2017)的那个 β:固定 等价于给 KL 项乘一个系数 (以 为基准)。“VAE 的图很模糊”在很大程度上是这个取舍,加上”只展示解码器的均值”的习惯——均值就是”在这个 下所有可能图像的平均”,平均自然是平滑的。
7.4 隐空间插值
在两张测试图(一个圆、一个三角形)的编码之间走直线(03 第 3 部分):中间帧最差的拟合残差 AE 0.0066、VAE 0.0062,差不多。我原以为 AE 的路径会穿过”空洞”。实际上,在两张真实图的编码之间走,AE 不一定穿过空洞——空洞主要在远离所有训练编码的地方(从 采样时才暴露出来)。
8. VQ-VAE 与 VQ-VAE-2
8.1 离散的隐变量
slides:“VQ-VAE(Vector Quantized VAE)学一个连续的码本,但编码器输出的是离散的编号;解码器拿着编号生成样本。”
vae_lab.VQVAE:卷积编码器把 28×28 的图变成 7×7 个 16 维向量 ;每个向量换成码本(64 个可学习的向量)里最近的那个 ;卷积解码器从 重建图像。一张图于是变成 49 个 0–63 之间的编号——和一句话变成 49 个词元一样。
两个技术细节:
- “取最近”不可导,怎么训练编码器?直通估计(straight-through):前向用 ,反向传播时假装 ,把解码器的梯度原封不动交给编码器。代码写成
z_q = z_e + (e_k − z_e).detach()。 - 码本怎么学?损失里加两项: 把码本向量拉向编码器的输出;(“承诺”损失)让编码器别离码本太远。sg = stop gradient。
8.2 实验
04 训练 3000 步(3.7 万参数,单线程约 1 分钟):
- 重建:每像素均方误差 0.0031,重建图的 FD 51.4(AE 18.9、VAE 79.5);整张图只用 比特(原图 784 个 32 位浮点数是 25,088 比特)。
- 码本用上了 28/64 个,有效个数(困惑度)只有 14——“死码”是 VQ-VAE 的常见问题。
- 重建图被形状拟合认回原来类别的比例:圆 0.99、方 0.96、三角 1.00、十字 0.24——细细的横竖两条在 7×7 的网格、十几个有效码本向量里表示不出来。
VQ-VAE 自己不会生成:它没有”从哪里采编号”的答案。三种先验:
| 编号的来源 | FD↓ | 像形状的比例 | 十字的比例(裁判 / 拟合) |
|---|---|---|---|
| (a) 每个位置均匀随机 | 3186 | 0.00 | — |
| (b) 每个位置按训练集的频率独立采 | 499 | 0.01 | — |
| (c) GPT 自回归先验 | 63.8 | 0.89 | 0.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.48 | 1.00 | 0.61 | 0.030 | 0.26/0.24/0.26/0.24 | 0.074 |
| DCGAN(第 6 讲) | 143,137 | 0.03 ms | 33.85 | 0.03 | 0.88 | 0.032 | 0.35/0.27/0.35/0.03 | 0.128 |
| 扩散 U-Net,DDIM 50 步(第 8 讲) | 192,140 | 16 ms | 12.83 | 0.10 | 0.95 | 0.030 | 0.29/0.39/0.26/0.06 | 0.109 |
| 扩散 U-Net,DDPM 100 步(第 8 讲) | 192,140 | 32 ms | 40.45 | 0.27 | 0.85 | 0.021 | 0.36/0.35/0.26/0.03 | 0.094 |
| VAE,σ = 0.3(本讲) | 829,232 | < 0.01 ms | 133.71 | 0.38 | 1.03 | 0.019 | 0.18/0.29/0.43/0.10 | 0.095 |
| VQ-VAE + GPT 先验(本讲) | 148,884 | 2.5 ms | 69.32 | 0.91 | 0.77 | 0.012 | 0.40/0.38/0.21/0.01 | 0.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 只有一层、编码器要学;扩散模型有 层、编码器是固定的加噪(第 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):
- 语言模型被训练成最大化训练序列的似然;大多数根据前面的词元生成后面的词元。自回归语言模型定义 。
- 提示的核心想法:给模型一个前缀字符串,让它”最可能的续写”恰好就是你想要的答案。
- 条件采样:要采一个样本,先喂进一个提示(上下文),再从”以提示为条件”的模型里采样(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
- 自编码器能压缩、能重建,但它的隐空间没有概率结构,不能采样;VAE 用”编码器给出分布 + KL 拉向先验”解决这个问题。
- KL(q ‖ p) 作为目标会寻模、低估方差;变分推断因为 算不出来而改为最大化 ELBO,ELBO ≤ log p(x),差距正是 KL。
- 蒙特卡洛估计的误差率和维数无关,但方差的常数可能随维数爆炸;得分函数估计的方差随维数增长,重参数化不会——这是 VAE 能训练的关键。
- VAE = 摊销的变分推断 + 重参数化 + 随机梯度:损失 = 重建项 + KL。解码器方差 σ(等价于 β)在”重建准”和”能采样”之间取舍;VAE 的模糊大多来自这个取舍和”展示均值”的习惯。
- VQ-VAE 把图变成离散的编号,重建不模糊,但自己不会生成;需要一个强先验(GPT / PixelCNN)。生成能力的上限是码本能表示什么。
- 同一套尺子下,扩散模型的 FD 最好,VQ-VAE + GPT 的”像形状”最好,没有一个模型全赢。
- 零样本、少样本、提示:把任务写成语言模型的续写——第 11 讲展开。
12. 常见误区 · Common pitfalls
- “VAE 就是加了噪声的自编码器。” 关键不在噪声,而在 KL 项把编码的分布拉向先验,这样从先验采样才有意义。
- “变分推断在最小化 KL,所以要先算 KL。” KL 里有算不出的 ;我们最大化 ELBO,KL 自动变小。
- “ELBO 越大,模型越好。” ELBO 是下界,它的大小同时取决于模型和下界的松紧;而且 σ 这样的超参数会改变”重建项”的量级。
- “重参数化技巧是为了让采样可导。” 更准确地说:它把随机性挪到不依赖参数的 上,让梯度能穿过 ;它的好处是方差小(§5.2),得分函数估计也是无偏的。
- “VAE 一定比 GAN 糊。” 模糊主要来自解码器方差的选择和”展示均值”;σ 小时 VAE 的重建很清楚,只是不能采样。
- “VQ-VAE 是生成模型。” 它是一个离散的自编码器;生成要靠另一个模型学编号的分布。
- “用一个分类器数一数,就知道生成的图缺了哪类。” 见第 6 讲 §4.2:在画得不标准的图上,分类器和形状拟合经常意见不一致。VQ-VAE 缺十字这件事,两把尺子都同意,而且重建也表示不了十字,所以可信。
- “零样本 = 模型没见过这个任务的任何信息。” 它见过任务的描述(标签的描述、提示里的说明),只是没见过带标签的例子。
13. 练习 · Exercises
练习 1(KL 的方向)。 用 slides 例 1 的数字解释:为什么 KL(q ‖ p) 在 大而 小的地方惩罚重、在 小而 大的地方惩罚轻?如果把目标换成 KL(p ‖ q) 会怎样?
参考答案
贡献是 : 是权重, 是”多估了多少倍”。、:权重大、比值大(log 4),贡献 +0.555;、:权重小,贡献只有 −0.139。换成 KL(p ‖ q) 时权重变成 : 大而 小的地方惩罚重,于是 必须”盖住”所有 大的地方——前向 KL 覆盖(例 3 的大圆)。
练习 2(平均场的方差)。 ,。证明最小化 KL(q ‖ p) 的平均场高斯有 。 时 是多少?
参考答案
,最优 。:(01 的输出)。直觉: 是”给定另一维时这一维的条件方差”,平均场 只能捕捉条件方差,捕捉不了相关性带来的额外伸展。
练习 3(ELBO ≤ log p)。 用 Jensen 不等式证明 ,并说明等号何时成立。
参考答案
(log 是凹函数)。等号当且仅当 对 几乎处处是常数,即 。
练习 4(VAE 的 KL 项)。 编码器对某张图输出 、。求 KL(q ‖ N(0, I))。哪一维”在用”、哪一维”没在用”?
参考答案
第 1 维:;第 2 维:。合计 0.818 nat。第 2 维的后验就是先验,不携带关于这张图的任何信息——“没在用”的维度(03 用”KL > 0.1”来数用上的维数;σ = 0.5 时只用了 10/16 维)。
练习 5(σ 与 β)。 证明:解码器 的负 ELBO,乘以 后等于 。所以固定 σ 的 VAE 等价于哪种 β-VAE?
参考答案
负 ELBO ,乘 得 常数。等价于”均方误差 + β·KL”的 β-VAE,。σ = 0.05 → β = 0.005(几乎不管 KL,像 AE);σ = 0.5 → β = 0.5。
练习 6(得分函数的方差)。 ,。计算得分函数估计 的方差在 很大时的主导项(取 )。
参考答案
,每项均值 、方差 (,)。; 很大时 与 近似独立,方差 ——标准差约 。 时约 1250(02 实测 1261)。(所以严格说是随 线性增长;减去平均值作基线后剩下 ,标准差约 ,02 实测 55.6。)
练习 7(直通估计)。 z_q = z_e + (e_k − z_e).detach() 的前向值是多少? 是多少?如果直接写 z_q = e_k,编码器会得到什么梯度?
参考答案
前向值 ;.detach() 的部分对梯度是常数,所以 。直接写 z_q = e_k 时, 来自 argmin 和查表,和 之间没有可导的路径,编码器从重建损失得到的梯度是 0,只能靠承诺损失学习。
练习 8(VQ-VAE 的信息量)。 7×7 个编号、码本 64 个向量,一张图最多能有多少种不同的编码?为什么”每个位置按频率独立采”的先验(§8.2 的 (b))画不出形状?
参考答案
种。真实图像的编码只占其中极小一部分,而且位置之间强相关(形状的边缘必须连起来)。独立采样相当于假设 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 讲会把这条线索展开。