对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 6 · 2023-10-16 · VAEs(slides:
cs236_lecture6.pdf,标题 Latent Variable Models,26 页);课程笔记 Variational Autoencoders。 依据说明:本讲按原课 slides 的顺序展开:回顾 VAE 与 ELBO → 后验算不出来 → 对 θ 和 φ 一起优化 → 整个数据集上的 ELBO 与每个数据点一组变分参数 → 随机变分推断(SVI)→ ELBO 的蒙特卡洛估计与梯度 → 对 φ 求梯度的困难、REINFORCE 与重参数化 → 摊销推断 → 摊销推断下的学习算法 → 自编码器视角(Alice 与 Bob)→ 隐变量模型小结 → 研究方向(编码器、解码器、目标函数)。REINFORCE 的推导和基线、近似差距与摊销差距的分解(Cremer et al. 2018)、IWAE 训练、β-VAE 与压缩率–失真、后验坍塌与 free bits 都是本讲义补充的。全部实验在像素世界上进行:d_z = 2 的 VAE 可以在隐空间的细网格上做数值积分,得到”精确的” 和后验 ——这让我们能把 ELBO 的每一份损失都算清楚。 配套代码 Code:code/lecture06/(PyTorch;1 个模块 + 4 个演示脚本;训练好的 12 个模型缓存在checkpoints/,第一次运行最长的脚本约 110 秒) 预计阅读时间:3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 写出整个数据集上的 ELBO,说明为什么每个数据点需要自己的变分参数 ,并写出随机变分推断(SVI)的内外两层算法。
- 说明对 求 ELBO 的梯度为什么容易、对 为什么难;推导 REINFORCE(得分函数估计)和重参数化两种梯度估计,解释基线的作用,以及为什么重参数化的方差通常小得多、但只适用于连续的 。
- 解释摊销推断:用一个编码器 代替每个数据点的参数;把 ELBO 的差距分解成近似差距和摊销差距。
- 写出 VAE 的自编码器视角 ,讲清 Alice 与 Bob 的故事,并能从零写出一个 VAE 的训练循环。
- 知道怎样评估 VAE:ELBO、IWAE 估计的 ,以及它们各自偏低多少。
- 了解三个研究方向:更紧的界(IWAE)及其代价、β-VAE 与压缩率–失真、强大的解码器与后验坍塌。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 5 讲:ELBO、、变分推断、重要性采样与 IWAE 下界、EM | 用可逆变换让隐变量模型的似然精确可算(第 7–8 讲);用流做更灵活的 |
| 第 3–4 讲:自回归模型、最大似然、SGD | 离散隐变量的梯度(Gumbel-softmax、VQ-VAE,第 17 讲) |
PyTorch 的自动求导、nn.Module | 层次化 VAE 与扩散模型的关系(第 16 讲) |
0.3 本讲地图 Map
§1 回顾:VAE、ELBO、后验算不出来
§2 在整个数据集上学习:每个数据点一组 φ;随机变分推断(SVI) ← 代码 03
§3 梯度:对 θ 容易,对 φ 难;REINFORCE;重参数化 ← 代码 01
§4 摊销推断:编码器 q_φ(z|x);近似差距与摊销差距;SVI 学习 vs 摊销学习 ← 代码 03
§5 自编码器视角:重构 + KL;Alice 与 Bob;在像素世界上训练 VAE;隐空间;ELBO vs 真实似然 ← 代码 02
§6 研究方向:更好的编码器 / 解码器 / 目标;IWAE;β-VAE;强大的解码器与后验坍塌 ← 代码 04
§7 VAE 的完整配方
§8 2023 年之后
§9–13 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| , | 先验 |
| 解码器(本讲的代码里是 64 个独立的伯努利,logit 由 MLP 给出) | |
| 第 个数据点的变分分布(每个数据点一组参数) | |
| 编码器(摊销的变分分布) | |
| ELBO | |
| , | 重参数化 |
| IWAE 下界 , | |
| , | 压缩率(rate);失真(distortion) |
0.5 关于数字 · About the numbers
数据与第 3–4 讲完全相同:像素世界的 10,000 张训练图、2,000 张验证图、5,000 张测试图;真实分布在测试集上平均 25.52 bit/图。“比真实多 bit”= 模型的 (或 ELBO)减去真实分布在同一批图上的平均,可以直接和第 3 讲的自回归模型排行榜(FVSBN 4.65、MADE 3.71、GRU 0.83……)比较。所有数字来自作者机器的实际输出;训练好的模型缓存在 checkpoints/,删掉后重新训练会得到逐位相同的模型。几处和预想不同的结果(d_z = 16 不如 d_z = 8、摊销差距比近似差距大得多、free bits 让 ELBO 变差但似然变好……)记录在 代码 README 的”关于实验结果”里。
1. 回顾:VAE、ELBO 与算不出来的后验 · Recap
原课第 3–8 页回顾了第 5 讲:
- VAE 是无穷多个高斯的混合:,。 很简单,边缘 却可以非常复杂。(对黑白像素,把高斯换成伯努利:。本讲的代码都用这个版本。)
- 隐变量模型的代价: 难算,所以比完全观测的自回归模型难学。
- ELBO 对任意 成立:
- 后验算不出来(slide 7):在 VAE 里, 相当于”把神经网络 反过来”——给一张图,问哪些 经过解码器能得到它。于是用一个好处理的 (例如 )去近似它, 越接近后验,ELBO 越接近 。
第 5 讲在”后验能精确算”的像素世界里把这些都验证了,EM 算法也在那里工作得很好。本讲面对的情况是:后验算不出来,EM 的 E 步做不了,M 步也没有闭式解。 怎么办?
2. 在整个数据集上学习 · Variational learning
2.1 对 θ 和 φ 一起优化
slide 9 的图: 和 都是 (作为 的函数)的下界——不同的 给出不同松紧的下界。我们想同时优化 和 : 让下界贴近 , 把下界往上推。这和 EM 的思路一样(E 步优化 、M 步优化 ),只是两步都换成了”近似地、用梯度”做。
2.2 整个数据集的 ELBO
slide 10:最大似然要最大化 。对每个数据点用 ELBO:
注意每个数据点有自己的变分参数 ,因为每张图的真实后验 都不一样——一张”左上角的横线”和一张”右下角的方框”,可能的解释完全不同。
slide 11 用第 5 讲的例子说明:上半张缺失( = 上半张的像素),。对一张”9”来说, 只放在 9 的上半部分的像素上是好的近似;对一张”1”,好的 完全不同。slide 11 还加了一句重要的提醒:这只在 接近 时成立,在学习刚开始时不成立——那时模型还很差,它的”后验”未必有意义。 和 是互相追赶着一起变好的。
2.3 随机变分推断(SVI)
slide 12 的算法:
- 初始化 ;
- 随机抽一个数据点 ;
- 把 作为 的函数优化:重复 ,直到收敛到 ;
- 计算 ;
- 沿梯度方向更新 ,回到第 2 步。
这就是”随机梯度版的变分 EM”:第 3 步是近似的 E 步(在 的族里找最接近后验的),第 4–5 步是一步随机梯度的 M 步。
内层循环要多少步? 代码 03 第 1 部分固定一个训练好的解码器(d_z = 2 的 VAE),对 300 张测试图,每张图单独用 Adam 优化 (每步 16 个样本的重参数化梯度,§3.3):
| 优化步数 | 从先验 出发:ELBO | 差距 | 从编码器的输出出发:ELBO | 差距 |
|---|---|---|---|---|
| 0 | −50.45 | 20.92 | −30.91 | 1.38 |
| 10 | −45.95 | 16.42 | −30.03 | 0.50 |
| 30 | −39.98 | 10.45 | −29.86 | 0.33 |
| 100 | −31.70 | 2.17 | −29.81 | 0.28 |
| 300 | −30.15 | 0.62 | −29.81 | 0.28 |
| 1000 | −30.15 | 0.62 | −29.81 | 0.28 |
(bit/图;“差距” = 精确的 (−29.53,网格积分)减 ELBO。“编码器”是 §4 的内容,这里先用作对照。)
从先验出发,每张图要优化约 300 步才能赶上编码器一次前向给出的答案。如果训练时每个外层步都要这样做,代价极高——这正是 §4 摊销推断要解决的问题。表里还藏着一个细节:从不同起点出发,终点不同(0.62 vs 0.28 bit)。ELBO 对 也是非凸的:后验有几个峰时(§4.3),不同的起点落到不同的峰。
“怎样计算梯度?期望可能没有闭式解,所以用蒙特卡洛采样。“——这是下一节。
3. 梯度 · Gradients of the ELBO
3.1 ELBO 的蒙特卡洛估计;对 θ 的梯度很容易
slide 13(为简洁去掉了上标 ):
关键假设: 好处理——容易采样、容易计算 。
对 的梯度很容易,因为期望所依据的分布 不依赖 ,梯度可以直接搬进期望里:
3.2 对 φ 的梯度:为什么难;REINFORCE
slide 14:对 的梯度复杂,因为期望本身依赖 —— 不能简单地写成”抽样再求导”,因为改变 改变的是”抽到哪些 “,而抽样这一步不可导。
REINFORCE(也叫得分函数估计、似然比估计;Williams 1992,来自强化学习)的推导只用一个恒等式 :
右边是一个普通的期望,可以抽样估计。它的直觉是”试探”:抽一个 ,如果 比较大,就沿 把 往 那边推(让这个 更可能被抽到)。它只需要 的值,不需要 可导, 也可以是离散的——非常通用。
代价是方差大。一个关键的改进是基线(baseline):因为 ,减去任何不依赖 的常数 都不改变期望:
好的 (接近 )能大幅降低方差。对 ELBO, 本身还依赖 ,多出来的一项 ,所以 REINFORCE 形式不变。
3.3 重参数化
slide 15:一个”更好但不那么通用”的办法,只对连续的 (和某些分布)有效。设 ,。下面两种采样方式等价:
- 直接抽 ;
- 先抽 ,再令 —— 是确定性的!
于是期望可以用两种方式写:
随机性被”挪到了外面”( 的分布不依赖 ),梯度可以穿过 直接用反向传播算出来。要求: 和 对 可导, 容易采样。slide 15 的结论:“通常方差比 REINFORCE 低得多。”
slide 16:ELBO 的情形稍复杂一点——被积函数 本身也依赖 。照样重参数化:,再用链式法则求梯度(自动求导会处理好两条路径)。
为什么重参数化方差小? REINFORCE 只用 的值,靠随机试探摸索方向;重参数化用 的导数—— 直接告诉我们往哪边走 会变大。它利用了更多的信息。
3.4 实验:方差差多少
一维玩具(代码 01 第 1 部分):,、,。真实梯度 。20 万个单样本估计:
| 估计量 | 均值 | 标准差 | 相对误差降到 10% 要几个样本 | |
|---|---|---|---|---|
| REINFORCE | −3.996 | 9.33 | 545 | |
| REINFORCE + 基线 | −3.998 | 6.49 | 263 | |
| 重参数化 | −3.999 | 2.00 | 25 | |
| REINFORCE | −3.717 | 1006.65 | 约 633 万 | |
| REINFORCE + 基线 | −3.998 | 6.49 | 263 | |
| 重参数化 | −3.999 | 2.00 | 25 |
(标准差 9.33、6.49、2.00 都可以精确算出来,练习 4。)三者都无偏,差别全在方差。给 加一个常数,梯度不变,REINFORCE 的标准差却涨了一百倍——每个样本都把 往自己那边推 ,正负抵消只在平均意义上成立。基线消掉了这个问题;重参数化根本不受影响(常数的导数是 0)。
真实的 VAE(第 2 部分):d_z = 8 的 VAE,64 张测试图,编码器的 86,544 个参数,ELBO 梯度的单样本估计:
| 估计量 | 单样本相对误差 | 与真实梯度的平均余弦 | 相对误差降到 10% 要几个样本 |
|---|---|---|---|
| REINFORCE | 33.07 | 0.002 | 109,354 |
| REINFORCE + 基线(每张图另抽 20 个样本估计 ) | 3.05 | 0.324 | 932 |
| 重参数化 | 1.82 | 0.467 | 331 |
不加基线的 REINFORCE 几乎是纯噪声: 本身在几十 nat 上下,就像”加了常数”的 。好的基线把所需样本降到只比重参数化多约 3 倍——但这个基线本身要额外抽 20 个样本、算 20 次解码器(实践中要么训练一个网络去预测基线,如 Mnih & Gregor 2014 的 NVIL,要么每张图抽几个样本互为基线)。重参数化不需要任何花样:每张图抽一个 、一次反向传播,方向就大体可靠,小批量 SGD 平均掉剩下的噪声。这就是 VAE 能像普通神经网络一样训练的原因。
离散的 (第 3 部分):像素世界, 是 177 个配置上的分布。“把采样写成确定性函数”仍然可以做到—— 恰好服从 ——但 是整数, 稍微变一点 不变,,梯度被切断了。REINFORCE 照样适用:
| 估计量 | 单次估计的相对误差 | 2000 次平均后的相对误差 |
|---|---|---|
| REINFORCE,每张图 2 个样本 | 41.3 | 0.90 |
| REINFORCE + 留一法基线,2 个样本 | 11.7 | 0.27 |
| REINFORCE,20 个样本 | 13.1 | 0.29 |
| REINFORCE + 留一法基线,20 个样本 | 2.7 | 0.06 |
最后一列恰好 ≈ 单次误差 / :剩下的全是方差,没有偏差。留一法基线(用同一批的其他样本估计 )不需要额外计算,效果却很大:2 个样本加基线比 20 个样本不加基线还准。离散隐变量模型(第 17 讲)只能用这类估计量,或者用连续的”松弛”(Gumbel-softmax)。
4. 摊销推断 · Amortized inference
4.1 每个数据点一组参数,不适合大数据集
slide 17:到目前为止,每个数据点 有自己的变分参数 。 个数据点就有 组参数,每组都要优化几百步(§2.3),不适合大数据集;遇到一张新图,还要从头优化。
摊销(amortization):学习一个参数化的函数 ,把每个 直接映射到一组好的变分参数——“就像在做回归 “。例如 是均值为 的高斯,我们学一个神经网络 把 映射到 。slide 18 的说法:” 学会了替你解那个优化问题”。文献里 通常写成 —— 现在是编码器网络的参数,不再是每张图一组。
“摊销”是一个会计用语:一次性的大投入(训练编码器)分摊到以后的每一次使用上(每张图的推断只要一次前向)。
4.2 摊销推断下的学习
slide 19 的算法:
- 初始化 ;
- 随机抽一个数据点 ;
- 计算 和 ;
- 沿梯度方向更新 。
其中
梯度怎么算?用重参数化(§3.3)。内层循环消失了: 和 一起走一步梯度。这就是变分自编码器(VAE,Kingma & Welling 2014;Rezende, Mohamed & Wierstra 2014)。
4.3 摊销的代价:近似差距与摊销差距
编码器给出的 离真实后验有多远?它可以拆成两部分(Cremer, Li & Duvenaud 2018):
其中 是”这张图在高斯族里最好的 “(用 SVI 单独优化出来)。代码 03 第 2 部分(300 张测试图,bit):
| 模型 | ELBO() | ELBO(编码器) | 近似差距 | 摊销差距 | 总差距 | |
|---|---|---|---|---|---|---|
| d_z = 2(网格积分,精确) | −29.53 | −29.83 | −30.91 | 0.31 | 1.08 | 1.38 |
| d_z = 8(IWAE k = 5000 估计) | −27.84 | −28.37 | −29.47 | 0.53 | 1.10 | 1.63 |
摊销差距是大头:编码器离”每张图最好的高斯”还很远,而高斯族本身的局限只占 0.3–0.5 bit。Cremer et al. 在 MNIST 等数据上也发现摊销差距常常是主要来源。这有实际意义:想缩小差距,与其先换更灵活的 族(§6),不如先改进编码器,或者在测试时从编码器的输出出发做几步 SVI(“半摊销”,Kim et al. 2018;§2.3 的表里 10 步就超过了编码器)。两点说明: 是从编码器出发的局部最优,全局最好的高斯只会更好,所以近似差距是上界;d_z = 8 时 是 IWAE 估计,本身略偏低。
真实后验长什么样?(第 3 部分)在 d_z = 2 的网格上可以把后验画出来。典型的图(近似差距是中位数 0.19 bit):后验是一个小而集中的”团”,高斯近似得不错。近似差距最大的图(一条带很多噪声像素的竖线,4.61 bit):后验分成相距很远的几块——隐空间里几个不同的位置都能”解释”这张图。一个高斯只能盖住其中一块(第 5 讲 §6.1 的模式寻找在真实的 VAE 里同样发生);而且从编码器出发的 SVI 落到了一个较弱的峰上,后验质量最大的那块谁也没盖住;编码器的高斯夹在几块之间,差距高达 11.7 bit。好在这样的图是少数(90% 的图近似差距不到 0.53 bit),但它们决定了 IWAE 估计收敛得多慢(§5.5)。
4.4 SVI 学习 vs 摊销学习
代码 03 第 4 部分把 slide 12 和 slide 19 的两种算法放在一起:2,000 张训练图、d_z = 2、外层 3,000 步,SVI 每个外层步先做 5 步内层优化。因为 d_z = 2,学到的解码器本身的 可以精确算出来,和推断方式无关:
| 学习方式 | 训练用时 | 训练集 ELBO | 测试集 ELBO | 测试时推断 500 张图 | 训练集 | 测试集 |
|---|---|---|---|---|---|---|
| SVI(每张图一组 ) | 5.7 秒 | −31.17 | −31.57 | 1.9 秒(300 步优化) | −31.00 | −31.36 |
| 摊销(VAE 编码器) | 1.9 秒 | −30.09 | −32.40 | 0.2 毫秒(一次前向) | −30.23 | −31.03 |
| 摊销 + 测试时 300 步 SVI 微调 | — | — | −31.21 | 编码器 + 优化 | — | — |
- SVI 慢:训练慢 3 倍,每个 平均只被访问 192 次、远没优化好;测试时每张新图都要重新优化,比编码器慢约一万倍。
- 同样的外层步数,VAE 学到的解码器更好(测试集 :−31.03 vs −31.36):SVI 的 不准, 的梯度也就不准。
- 但 VAE 的编码器过拟合了:训练集 ELBO −30.09、测试集 −32.40,差 2.3 bit,而解码器本身只差 0.8 bit——摊销差距在新数据上变大了。所以只看测试集 ELBO,测试时重新优化的 SVI 反而更好;编码器 + 测试时微调两者兼得。
- slide 24 提到摊销对解码器有正则化作用(Shu et al. 2018)。在这个小实验里看不到:SVI 解码器的训练–测试差距(0.36 bit)反而比 VAE 的(0.80)小——不过 SVI 的解码器也训练得更不充分,两者不能简单比较。
5. 自编码器视角 · The autoencoder perspective
5.1 重构 + KL
slide 20:把 代进 ELBO,
(第 5 讲 §5.6 已经在像素世界里验证过这个恒等式。)读成一个自编码器:
- 取一个数据点 ,从 采样得到 ——编码器:用 给出的高斯采样;
- 从 采样得到重构 ——解码器。
训练目标做什么?第一项鼓励 ( 在 下概率高)——这就是自编码损失;第二项鼓励 的分布接近先验 。
和普通自编码器相比,VAE 多了两样东西:编码是随机的(加了噪声 ),以及 KL 项。正是它们让 VAE 成为一个生成模型:没有 KL 项,编码器可以把不同的图放在隐空间里任意遥远、任意分散的地方,从 采样会落进”空洞”里;KL 项把所有图的编码挤进先验的形状里,让”从先验采样再解码”变得有意义。
5.2 Alice 与 Bob
slide 21 的故事:
- Alice 执行太空任务,要把图像发给 Bob。给定一张图 ,她(随机地)压缩它:,把消息 发给 Bob;
- Bob 收到 ,用 重构图像。
- 如果 大,这个方案就好用。
- KL 项迫使”消息的分布”具有特定的形状 。如果 Bob 知道 ,他就能自己造出逼真的消息 和对应的图像,就好像收到了 Alice 的消息一样!
这个故事还有一层信息论的含义(第 4 讲的压缩):KL 项是 Alice 发消息的平均”码长”(压缩率,rate),重构项是 Bob 重构的”失真”(distortion)。§6.4 的 β-VAE 就是在这两者之间调节。
5.3 在像素世界上训练 VAE
代码 02:编码器、解码器都是两层 256 宽的 MLP,解码器输出 64 个伯努利 logit,15,000 步 Adam(每个约 10 秒)。
| ELBO:比真实多 | 重构项(bit) | KL(bit) | IWAE :比真实多 | 活跃维度 | 样本的真实 | |
|---|---|---|---|---|---|---|
| 1 | 7.30 | 29.40 | 3.42 | 6.59 | 1 / 1 | 36.86 |
| 2 | 5.17 | 25.04 | 5.65 | 3.97 | 2 / 2 | 33.55 |
| 4 | 4.23 | 22.33 | 7.41 | 2.47 | 3 / 4 | 31.67 |
| 8 | 3.71 | 21.31 | 7.92 | 2.19 | 4 / 8 | 31.77 |
| 16 | 4.30 | 23.03 | 6.79 | 2.84 | 3 / 16 | 32.11 |
| 真实世界 | 0 | 18.33 = | 7.19 = | 0 | — | 25.52 |
(对照:第 3 讲的 FVSBN 4.65、NADE 3.89、MADE 3.71、Transformer 1.56、RNN 0.91、PixelCNN 0.84、GRU 0.83。)
几个值得细看的地方:
- KL 自动找到了”配置的信息量”。 时 KL 在 6.8–7.9 bit,和真实世界的 bit 很接近——这是像素世界”配置”携带的信息。没有人告诉 VAE 世界里有 177 个配置,它自己发现了”大约需要 7 bit 来描述一张图的结构”。
- 重构项最好也比真实噪声多约 3 bit(21.3 vs 18.3):从 抽出的 有时解码成稍有不同的配置,解码器也画不准模板。
- 活跃维度只有 3–4 个。 时 13 个维度没被使用:编码器对所有 都输出 、(就是先验),这一维不携带任何信息。多用一维要付 KL 的代价,信息不需要时 VAE 就把它”关掉”。而且 反而比 差——维度多了,优化更难,并不自动变好。
- 最好的 VAE(2.19 bit)介于 MADE(3.71)和 GRU(0.83)之间。 一个像素独立的解码器加上隐变量,比许多自回归模型强,但比最好的自回归模型差得多。ELBO 比 IWAE 高 1–1.5 bit:ELBO 本身比 松了这么多(§5.5)。
- 样本质量的”真相”指标(最后一列):样本若像真实数据,它们在真实分布下的平均 应接近 25.5。 仍高约 6 bit——样本里有不少模糊的、两种形状叠在一起的图。似然最好的()和样本最”典型”的()不是同一个(差别很小):似然和样本质量相关,但不是一回事(slide 26;第 15 讲)。
重构与采样(第 2 部分,):重构的概率图清晰地画出了原图的形状和位置,但不包括噪声——原图里随机翻转的像素在重构里消失了。编码器只传”配置”,不传”哪几个像素碰巧翻转了”,噪声留给解码器的伯努利分布去解释。这正是第 5 讲 §1.4 希望隐变量做的事: 吸收结构, 只管独立的细节。Bob 从先验造的消息解码出来,一部分是清晰的形状,也有不少是模糊的”折中”。编码器给出的 在活跃维度上平均 0.27,在不活跃维度上恰好 1.000。
5.4 隐空间
第 3 部分把 4,000 张图的编码均值 ()画在平面上,每个格子标出最多的形状。隐空间按形状组织,但不是整齐的四块:横线占据左右两侧,竖线占据上下两端,方框多在中间一圈,十字挤在中心;每块里面再按位置排列。每种形状都分成对称的两块,所以各形状编码的平均值都在原点附近——平均值看不出结构,画出来才看得到。和第 5 讲 K = 4 的聚类(按位置分、完全看不出形状)不同,连续的二维 有足够的”地方”同时编码形状和位置。
编码均值落在半径 2 以内的比例是 85.9%,先验 下是 86.5%:KL 项真的把”消息的分布”压成了先验的样子。
沿直线插值(从一条横线的编码走到一个方框的编码),中间帧是模糊的、经过别的配置的图。隐空间是连续的,但这个世界的数据(177 个离散配置)不是;在 MNIST、人脸这样变化更连续的数据上,插值看起来平滑得多。
5.5 ELBO、IWAE 与精确的
第 4 部分(,1,000 张测试图):
| 估计 | 平均 | 比真实多 | 比精确值低 |
|---|---|---|---|
| 精确(400×400 网格积分) | 29.229 | 3.844 | 0 |
| ELBO | 30.586 | 5.202 | 1.358 |
| IWAE, | 30.609 | 5.224 | 1.380 |
| IWAE, | 29.780 | 4.395 | 0.551 |
| IWAE, | 29.526 | 4.142 | 0.297 |
| IWAE, | 29.428 | 4.044 | 0.199 |
| IWAE, | 29.383 | 3.999 | 0.154 |
- ELBO 比精确值平均低 1.36 bit,但分布极不均匀:中位数 0.55 bit,90% 分位 3.31,最大 30.9 bit——少数图的后验和高斯差得很远(§4.3)。
- IWAE 随 单调逼近精确值(第 5 讲 §4.3), 时就是 ELBO。但收敛很慢: 仍低 0.15 bit。那些”后验分成几块”的图,重要性权重的 极大(第 5 讲 §4.2)。
论文里报告的”测试集 log-likelihood”通常就是 = 几千的 IWAE 估计——它是一个下界的估计,会低估模型。在这里可以直接看到低估了多少。比较 VAE 和自回归模型时(后者的似然是精确的),要记住这一点。
6. 研究方向 · Research directions
6.1 隐变量模型小结(原课 slide 22)
- 把简单模型组合成更灵活的模型(例如混合高斯);
- 有向模型允许祖先采样(高效生成):,;
- 但对数似然一般算不出来,所以学习困难;
- 联合学习一个模型()和一个摊销的推断部件(),通过优化 ELBO 获得可处理性;
- 任何 的隐表示都可以通过 推断出来。
slide 23:改进变分学习的三个方向——更好的优化技术、更有表达力的近似族、不同的损失函数。
slide 24(编码器):摊销(Gershman & Goodman、Kingma、Rezende……)带来可扩展性,也可能隐式地正则化模型(Shu et al. 2018);增强变分后验:蒙特卡洛方法(重要性采样即 IWAE、MCMC、序贯蒙特卡洛、拒绝采样),以及归一化流(Rezende & Mohamed 2015、Kingma et al. 2016,第 7–8 讲)。
slide 25(解码器):强大的解码器(DRAW、PixelCNN 作为解码器,§6.5);参数化的、学习的先验;层次化模型——多个 VAE 叠在一起(slide 括号里写着:扩散模型,第 16 讲)。
slide 26(目标函数):更紧的 ELBO 并不意味着更好的样本(样本质量和似然不相关,Theis et al. 2016),也不意味着有信息量的隐变量(强大的解码器会忽略隐变量);KL 散度的替代:Rényi α-散度、MMD、Wasserstein 距离等积分概率度量。
下面三个实验分别对应”更紧的界""不同的目标""强大的解码器”。
6.2 更紧的界:IWAE 训练
第 5 讲证明了 随 单调变紧。直接最大化 训练(Burda et al. 2016)会怎样?代码 04 第 1 部分(,可以精确算):
| 训练目标 | 训练用时 | 精确 :比真实多 | ELBO:比真实多 | 编码器的平均 | |
|---|---|---|---|---|---|
| ELBO() | 9 秒 | 3.84 | 5.21 | 1.36 | 0.147 |
| IWAE() | 22 秒 | 2.48 | 7.30 | 4.82 | 0.174 |
模型变好了(精确的 好了 1.4 bit): 更接近 ,最大化它更接近最大似然,解码器不再被迫迁就一个高斯后验近似。编码器作为后验近似却变差了(KL 从 1.36 升到 4.82):IWAE 只要求”10 个样本里有一两个落在后验上”,编码器就可以变宽、去覆盖后验。这正是第 5 讲 §4.2 的结论:重要性采样喜欢偏宽的 ,ELBO(反向 KL)喜欢偏窄的 。 Rainforth et al. 2018 的论文标题概括了这一点:更紧的变分下界不一定更好(对推断网络而言)。代价还有 倍的解码器计算。
6.3 不同的目标:β-VAE 与压缩率–失真
在 KL 前面乘一个系数 (Higgins et al. 2017):
这正是压缩率–失真(rate–distortion)问题的拉格朗日形式(Alemi et al. 2018): 是 Alice 的平均码长, 是 Bob 的失真, 是两者的汇率。只有 时 才是 的下界。代码 04 第 2 部分():
| 压缩率 (bit) | 失真 (bit) | ELBO():比真实多 | IWAE:比真实多 | 活跃维度 | 样本的真实 | |
|---|---|---|---|---|---|---|
| 0.25 | 20.27 | 18.75 | 13.50 | 8.03 | 7 | 35.18 |
| 0.5 | 13.00 | 18.68 | 6.16 | 3.10 | 6 | 32.72 |
| 1 | 7.92 | 21.32 | 3.72 | 2.20 | 4 | 31.98 |
| 2 | 2.07 | 30.14 | 6.69 | 6.13 | 2 | 38.33 |
| 4 | 0.00 | 35.50 | 9.98 | 9.98 | 0 | 42.50 |
| 真实世界 | 7.19 | 18.33 | 0 | 0 | — | 25.52 |
- 越大, 越小、 越大。 时 :后验完全坍塌,模型退化成”像素独立”(9.98 bit,第 5 讲 的伯努利混合是 9.88)。
- 似然、ELBO、样本质量都在 最好。
- 时 远超真实的 ,失真接近真实噪声 18.33 但没有低于它:编码器没有去记噪声翻转,而是用比必要多得多的 bit 描述配置( 很窄、不同图的 离得很远)。这些 bit 对 没有好处,“消息的分布”和先验对不上,从先验采样常常落进空洞,样本变差。
- β-VAE 的原始动机是” 让隐变量更解耦”(每一维对应一个独立的变化因素)。这个说法后来受到很多质疑:Locatello et al. 2019 证明了没有归纳偏置的无监督解耦在理论上不可能,实验上也很依赖随机种子和超参数——和第 5 讲 §2.2 “无监督学习是不适定的”一脉相承。
6.4 强大的解码器与后验坍塌
如果解码器本身就很强——比如一个以 为条件的自回归模型 ——会发生什么?代码 04 第 3 部分把解码器换成 GRU(第 3 讲的 GRU 不用任何隐变量就能做到只比真实多 0.83 bit), 在每一步都直接喂给 GRU:
| 模型 | KL(bit) | ELBO:比真实多 | IWAE :比真实多 |
|---|---|---|---|
| 普通 VAE(像素独立的解码器) | 7.920 | 3.76 | 2.39 |
| GRU 解码器 | 0.003 | 1.12 | 1.13 |
| GRU 解码器 + free bits(每维 0.25 nat) | 2.887 | 2.00 | 1.02 |
| 对照:第 3 讲的 GRU(没有隐变量) | — | 0.83 | 0.83 |
KL 只有 0.003 bit:编码器对所有图都输出(几乎)同一个先验, 不携带任何信息。这叫后验坍塌(posterior collapse;Bowman et al. 2015 在用 LSTM 解码器做句子 VAE 时发现)。模型的似然却很好——GRU 自己就能把 建模好。给定一张图的编码 让解码器采样,得到的是各种随机的形状,和原图毫无关系。
为什么”不用 “是最优的?如果解码器不依赖 ,那么后验 = 先验, = 先验就让 ELBO 精确等于 ,差距为 0;而一旦用了 ,就要付”高斯后验近似不完美”的差距(§4.3、练习 6)。当解码器不靠 也能做得很好时,ELBO 的最优解就是彻底放弃 。
free bits(Kingma et al. 2016)把 KL 换成 :每一维的前 nat 信息”免费”。KL 升到 2.89 bit,采样结果开始和原图有关——大多出现在原图所在的区域,但形状不一定对(2.9 bit 不够从 177 个配置里挑出一个)。有意思的是:ELBO 变差了(2.00 vs 1.12),IWAE 估计的似然却略好(1.02 vs 1.13)——ELBO 变差主要是因为下界变松了,模型本身并没有变差。只看 ELBO 会错怪 free bits。
这就是 slide 26 的要点:更紧的 ELBO / 更高的似然并不保证隐变量有信息量。 想要有用的表示,就要在目标或结构上做文章:free bits、KL 退火(训练初期把 KL 的系数从 0 慢慢加到 1)、弱化解码器(只让它看到局部的上下文,如 PixelVAE / VLAE 的设计),或者换一条路——第 9–10 讲的 GAN 和 BiGAN。
7. VAE 的完整配方 · The full recipe
把本讲的内容合起来,一个 VAE 的训练循环只有几行(vae.py 的 VAE.elbo 和 train_vae):
mu, logvar = encoder(x) # q_φ(z|x) = N(μ, diag(e^logvar))
eps = torch.randn_like(mu) # 重参数化:随机性在 ε 里
z = mu + torch.exp(0.5 * logvar) * eps
logits = decoder(z) # p_θ(x|z) 的 64 个伯努利 logit
rec = -F.binary_cross_entropy_with_logits(logits, x, reduction="none").sum(-1)
kl = 0.5 * (mu**2 + logvar.exp() - 1 - logvar).sum(-1) # KL(N(μ,σ²) ‖ N(0,1)) 的闭式解
loss = -(rec - kl).mean() # 负 ELBO
loss.backward(); optimizer.step() # θ 和 φ 一起更新
几个实践要点:
- 编码器输出 而不是 :网络的输出可以是任意实数, 之后自动为正。
- KL 用闭式解(练习 3):没有采样噪声;重构项通常每张图只抽 1 个 。
- 评估用 IWAE(大 ),不要只报告 ELBO;报告时说明 。
- 生成:,解码;伯努利解码器可以展示像素概率(“均值图”)或采样。
- 连续数据用高斯解码器时要小心:如果允许 任意小,似然可以在训练点上趋于无穷(练习 10)。
8. 2023 年之后 · Since 2023
- VAE 成了潜空间生成的”压缩器”。 主流的图像和视频生成模型先用一个带 KL 正则的自编码器把数据压到潜空间,再在潜空间里训练扩散或流匹配模型(第 5 讲 §9)。视频模型(如 2024–2025 年开源的 HunyuanVideo、Wan 2.1)用的是三维因果 VAE,把时间和空间一起压缩。这些自编码器的 KL 系数通常很小——用 §6.3 的语言,它们是 的 β-VAE:重构几乎完美、 很大;生成不靠”从先验采样再解码”,而是交给潜空间里的扩散模型。KL 项只是让潜空间保持规整。
- 扩散模型就是很深的层次化 VAE。 slide 25 括号里的”Diffusion models”不是随口一提:DDPM 的训练目标是一个固定编码器(逐步加噪)、可学习解码器(逐步去噪)的层次化隐变量模型的 ELBO。Kingma & Gao(NeurIPS 2023)进一步证明,扩散模型常用的各种加权损失都可以理解成”在数据增强下的 ELBO”。第 16 讲会推导。
- 摊销推断走出了 VAE。 “训练一个网络,一次前向给出后验的近似”在科学计算里叫基于模拟的推断(simulation-based inference)或神经后验估计:用模拟器生成大量 (参数, 观测) 对,训练网络直接输出 ,在天体物理、粒子物理、流行病学等领域被广泛使用。§4.3 的摊销差距、§4.4 的”编码器在新数据上变差”在那里同样是核心问题。
- 离散的瓶颈。 很多现代 tokenizer 用离散的隐变量(VQ、FSQ),用直通估计(straight-through)而不是 KL 训练,也就绕开了 §6.4 的后验坍塌;代价是”概率模型”的解释变弱。第 17 讲讨论。
9. 小结 · Summary
- 整个数据集的 ELBO 给每个数据点一组变分参数;SVI 交替地内层优化 、外层更新 。内层要几百步(从先验出发 300 步才赶上编码器),而且 ELBO 对 非凸、终点依赖起点。
- 对 的梯度容易;对 的梯度难,因为期望依赖 。REINFORCE 通用、无偏、方差大,基线很关键;重参数化 用 的导数,方差小得多(VAE 编码器:要达到同样精度,REINFORCE 需要 330 倍的样本),但只适用于连续的 。
- 摊销推断用一个编码器 代替所有 ,一次前向完成推断。总差距 = 近似差距 + 摊销差距;在像素世界里摊销差距(约 1.1 bit)是大头。编码器会过拟合;测试时从编码器出发做几步 SVI 能两者兼得。
- 自编码器视角:——重构 + “编码要像先验”。KL 是压缩率,重构是失真;KL 让”从先验采样再解码”有意义。
- 像素世界上的 VAE:KL 自动接近真实的 (约 7–8 bit vs 7.19);只用 3–4 个活跃维度;重构去掉了噪声;最好的 VAE 比真实多 2.19 bit,介于 MADE 和 GRU 之间;隐空间按形状组织。
- 评估:ELBO 比精确的 低 1.36 bit,IWAE 随 逼近但很慢( 仍低 0.15 bit)。报告的 “log-likelihood” 通常是 IWAE 下界的估计。
- IWAE 训练让模型更好、编码器更差;β-VAE 在压缩率与失真之间取舍, 才是似然的下界;强大的解码器导致后验坍塌(KL ≈ 0),free bits 等方法可以逼模型使用 。更紧的界不等于更好的样本或更有用的表示。
10. 常见误区 · Common pitfalls
- “编码器给出的就是后验。” 它是后验的近似,而且有两层误差:高斯族的局限(近似差距)和编码器本身不完美(摊销差距)。在像素世界里后者更大(§4.3)。
- “重参数化总是比 REINFORCE 好。” 对连续的、可导的情形通常如此;离散的 根本用不了重参数化(argmax 切断梯度,§3.4)。而带好基线的 REINFORCE 差距没有想象的那么大(3 倍 vs 330 倍)。
- “REINFORCE 的方差大,是因为样本不够多。” 很大一部分来自 的”常数部分”(§3.4:加 1000,方差涨一百倍)。基线不需要额外样本就能消掉它。
- “VAE 的 ELBO 就是它的测试似然。” ELBO 是下界,这里低了 1.36 bit;IWAE(大 )才是常用的似然估计,而它也偏低(§5.5)。和自回归模型比较时要注意。
- “隐变量维数越大越好。” 多余的维度会被关掉(KL 的作用),而且 比 还差(§5.3)。
- “KL 项只是一个正则化项,可以随便调小。” 调小()会让”消息的分布”偏离先验,从先验采样落进空洞,样本变差; 之外的目标也不再是似然的下界(§6.3)。(潜空间扩散用小 β 是因为生成不靠先验采样,§8。)
- “更紧的下界一定更好。” IWAE 训练让解码器更好、编码器更差(§6.2)。
- “VAE 的似然很好,所以它学到了有用的隐变量。” 强大的解码器可以完全不用 ,似然照样很好(后验坍塌,§6.4)。
- “只看 ELBO 就能比较两个模型。” free bits 的模型 ELBO 更差、似然却更好(§6.4);ELBO 混合了”模型好不好”和”推断好不好”两件事。
- “测试时用编码器就够了。” 编码器会在新数据上变差(§4.4:训练集与测试集 ELBO 差 2.3 bit,而解码器本身只差 0.8)。测试时做几步 SVI 微调常常有效。
11. 练习 · Exercises
练习 1(哪些分布能重参数化?) (a) 指数分布 ():写出一个重参数化 。(提示:逆 CDF。)(b) 伯努利分布 :能写成可导的 吗?为什么?(c) 一般地,一维连续分布总能用逆 CDF 重参数化,为什么实践中仍然偏爱”位置–尺度”族(高斯、拉普拉斯……)?
参考答案
(a) ,令 ,(或等价地 ),对 可导。(b) 可以写成 ,但它对 是阶跃函数,导数几乎处处为 0——和 §3.4 的 argmax 一样,梯度被切断。(c) 逆 CDF 要求 有闭式解且对参数可导,很多分布(如 Gamma、Beta)没有;多维时还要处理相关性。位置–尺度族 简单、多维直接推广(),而且梯度的形式最干净。
练习 2(基线不改变期望) 证明 ,并由此证明对任何不依赖 的 (可以依赖 ),。如果 依赖于这次抽到的 本身,还成立吗?留一法基线为什么没问题?
参考答案
。所以 。若 依赖 , 一般不为 0,估计会有偏。留一法里,第 个样本的基线是其他样本的平均,和 独立,所以对每个 都满足” 不依赖 “,仍然无偏(代码 01 第 3 部分的”2000 次平均后的相对误差”≈ 单次误差 / ,没有偏差)。
练习 3(两个高斯之间的 KL) 证明 。对角高斯的 KL 为什么是各维之和?KL 什么时候为 0?
参考答案
(用了 、)。对角高斯和标准正态都是各维独立的乘积, 变成求和,KL 就是各维 KL 之和。、 时为 0——这就是代码里”不活跃的维度”(§5.3:)。
练习 4(一维玩具的方差,精确计算) ,。(a) 重参数化估计 的方差。(b) REINFORCE 估计 的方差(提示:,)。(c) 加基线 后呢?和代码 01 的 2.00、9.33、6.49 核对。
参考答案
(a) ,标准差 2。(b) ,均值 ,方差 ,标准差 。(c) ,,方差 ,标准差 。基线 并不是方差最小的基线(最优基线是 , 是得分函数),但已经有明显改善。
练习 5(摊销差距为什么在测试集上更大) §4.4 里 VAE 的编码器在训练集和测试集上的 ELBO 差 2.3 bit,而解码器本身只差 0.8 bit。用”编码器在做回归 “的观点解释。给出两种缓解办法。
参考答案
编码器是一个从 2,000 个训练样本学出来的回归器,它在训练集上把 映射到接近 的地方,在没见过的 上则会有泛化误差——和任何监督学习一样会过拟合。解码器的过拟合只影响 ;编码器的过拟合额外加大了测试集上的摊销差距。缓解:(1) 测试时从编码器的输出出发做几步 SVI(§4.4 的最后一行);(2) 更多数据、对编码器加正则化或早停;也有人用更大的编码器配合更多数据。
练习 6(为什么后验坍塌是 ELBO 的最优解) 设解码器族里存在一个不依赖 的 。证明:此时取 ,ELBO 恰好等于 。再说明:一个依赖 的解码器要在 ELBO 上胜过它,需要满足什么条件?
参考答案
,后验 。取 ,,所以 ELBO 。一个依赖 的模型 的 ELBO 是 。要胜过前者,需要 :用 带来的似然提升,必须超过近似后验的误差。GRU 解码器不用 已经很好(0.83 bit),用 的提升很小,而高斯近似的误差(§4.3:总差距 1 bit 以上)更大,于是坍塌。
练习 7(β-VAE 与下界) 证明 ,且当 时 不是 的下界(举一个方向)。 时 和 谁大?
参考答案
由定义 。 时 ,它可以超过 (只要 大于 ELBO 的差距),所以不是下界;例如 β = 0.25 的模型 bit, bit,远大于它的差距。 时 ,仍是下界,但更松,最大化它并不等价于最大化似然。
练习 8(动手:更多的 free bits)
在 04_objectives.py 里把 free bits 从 0.25 改成 0.5(get_gru_vae(0.25, …) 两处,以及 part3_collapse 里的列表),删掉 checkpoints/gruvae_fb0.5.pt(如果有),重新运行(多约 20 秒)。预测 KL、ELBO、IWAE 怎样变化,给定 的采样会不会更像原图。
参考答案(预测的思路)
每维至少 0.5 nat,8 维共 4 nat ≈ 5.8 bit:KL 大约会升到 5–6 bit 附近,接近”配置的信息量”(7 bit)。给定 的采样应该更像原图(位置更准,形状也开始对)。ELBO 可能进一步变差(下界更松),IWAE 似然可能持平或略好——取决于解码器能否真正利用这些信息。具体数字以你的运行为准。
练习 9(动手:SVI 的学习率)
在 03_amortization.py 第 1 部分把 svi 的学习率从 0.05 改成 0.2。预测”从先验出发”那一列:收敛更快还是更慢?终点会不会不同?
参考答案(预测的思路)
更大的步长让前几十步上升更快,但 可能震荡;ELBO 对 非凸,步子大了可能跳到不同的峰,终点可能更好也可能更差(从先验出发本来就停在了一个比编码器出发更差的局部最优)。Adam 的步长大致就是每步参数的变化量,0.2 对一个标准差约 0.15 的后验来说已经很大。具体结果以你的运行为准。
练习 10(高斯解码器的退化) 连续数据用高斯解码器 。假设 可以任意小。说明对一个固定的训练集,ELBO(乃至 )可以趋于 。实践中怎么避免?
参考答案
让某个 附近的解码器输出 (一个训练点)、,则 ,而只要编码器把 编到 附近,ELBO 也趋于无穷(Mattei & Frellsen 2018 讨论了这种退化)。实践中:给 设下限,或者固定一个全局的 ;图像数据常把像素当作离散值(伯努利、离散化的 logistic 混合,PixelCNN++),似然天然有上界(概率 ≤ 1)。第 8 讲的”去量化”讨论的也是这个问题。
12. 延伸阅读 · Further reading
原课材料
- CS236 Fall 2023 Lecture 6 slides:https://deepgenerativemodels.github.io/assets/slides/cs236_lecture6.pdf
- 课程笔记 Variational Autoencoders:https://deepgenerativemodels.github.io/notes/vae/
VAE 与梯度估计
- Kingma & Welling, Auto-Encoding Variational Bayes, ICLR 2014;Rezende, Mohamed & Wierstra, Stochastic Backpropagation and Approximate Inference in Deep Generative Models, ICML 2014
- Kingma & Welling, An Introduction to Variational Autoencoders, Foundations and Trends in ML 2019(最好的综述)
- Williams, Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning, 1992(REINFORCE);Mnih & Gregor, Neural Variational Inference and Learning in Belief Networks, ICML 2014(NVIL,学习的基线)
- Mohamed, Rosca, Figurnov & Mnih, Monte Carlo Gradient Estimation in Machine Learning, JMLR 2020
- Hoffman, Blei, Wang & Paisley, Stochastic Variational Inference, JMLR 2013
摊销与差距
- Cremer, Li & Duvenaud, Inference Suboptimality in Variational Autoencoders, ICML 2018
- Kim, Wiseman, Miller, Sontag & Rush, Semi-Amortized Variational Autoencoders, ICML 2018
- Shu, Bui, Zhao, Kochenderfer & Ermon, Amortized Inference Regularization, NeurIPS 2018
目标函数与后验坍塌
- Burda, Grosse & Salakhutdinov, Importance Weighted Autoencoders, ICLR 2016;Rainforth et al., Tighter Variational Bounds are Not Necessarily Better, ICML 2018
- Higgins et al., β-VAE, ICLR 2017;Alemi et al., Fixing a Broken ELBO, ICML 2018;Locatello et al., Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations, ICML 2019
- Bowman et al., Generating Sentences from a Continuous Space, CoNLL 2016;Kingma et al., Improved Variational Inference with Inverse Autoregressive Flow, NeurIPS 2016(free bits、IAF);Chen et al., Variational Lossy Autoencoder, ICLR 2017
- Theis, van den Oord & Bethge, A Note on the Evaluation of Generative Models, ICLR 2016
2023 年之后
- Kingma & Gao, Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation, NeurIPS 2023
- Cranmer, Brehmer & Louppe, The Frontier of Simulation-Based Inference, PNAS 2020(摊销推断在科学中的应用)
13. 下一讲预告 · Next lecture
VAE 能学到隐变量,但似然算不出来——只能用 ELBO 训练、用 IWAE 估计,而且像 §5.5 看到的那样,两者都有误差;后验坍塌也来自”近似后验不完美”这件事。第 7 讲(原课 Lecture 7,Normalizing Flows)问一个直接的问题:
能不能设计一个隐变量模型,让似然精确可算?
答案是:让 成为 的确定性、可逆的函数。这样对每个 恰好有一个 ,后验不需要推断, 由变量替换公式给出:
我们会从一维的例子出发(为什么 时 ),讲清行列式为什么是”体积的缩放”,再看怎样设计既可逆、雅可比行列式又好算的变换。