对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 8 · 2023-10-23 · Normalizing Flow Models(slides:
cs236_lecture8.pdf,35 页)。 依据说明:本讲按原课 slides 的顺序展开:回顾(变量替换、一串变换、平面流、学习与推断、设计要求、三角雅可比)→ 设计可逆变换 → NICE 的加性耦合层与缩放层 → RealNVP 的仿射耦合层 → 隐空间插值 → 连续自回归模型就是流 → MAF → IAF → IAF 是 MAF 的逆 → 两者的计算取舍 → Parallel WaveNet 的概率密度蒸馏 → MintNet → 高斯化流 → 密度估计实验 → 小结。“体积不变”的理论下限、蒸馏出的学生”缩水”、贪心高斯化流的过拟合、离散数据的去量化(slides 没有讲,但任何在图像上用流的人都会遇到)是本讲义补充的。二维实验的真实密度已知;高维实验用”玩具音频”(真实密度已知)和 64 维的像素世界。 配套代码 Code:code/lecture08/(PyTorch;1 个模块 + 5 个演示脚本,最长的约 65 秒) 预计阅读时间:3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 写出 NICE 的加性耦合层和缩放层,证明加性耦合的行列式为 1,说明”体积不变”带来的限制;写出 RealNVP 的仿射耦合层及其 log det;知道掩码怎样分组、为什么要交替。
- 说明连续自回归模型就是流;写出 MAF 和 IAF 的正向、反向公式,解释为什么 MAF 求密度快、采样慢,IAF 正好相反,以及”IAF 是 MAF 的逆”。
- 讲清 Parallel WaveNet 的概率密度蒸馏:为什么用 MAF 当老师、IAF 当学生,为什么蒸馏目标是 ,它的代价是什么。
- 理解高斯化流:一维的 ,逐维高斯化 + 旋转,以及”最大似然训练流 = 让变换后的数据接近高斯”。
- 知道怎样用连续的流给离散数据建模:均匀去量化、变分去量化,以及它们给出的是 的下界。
- 把自回归模型、VAE、流放在一张表里比较:似然、采样、隐表示、维数的取舍。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 7 讲:变量替换、一串变换、三角雅可比、平面流 | 不用似然的生成模型(GAN,第 9–10 讲) |
| 第 3 讲:MADE(掩码让输出 只依赖前面的输入)、WaveNet | 连续时间的流、流匹配(第 16 讲、MIT6.S184) |
| 第 4–6 讲:前向 / 反向 KL、重要性采样下界(IWAE) |
0.3 本讲地图 Map
§1 回顾与本讲计划
§2 NICE:加性耦合(体积不变)与缩放层;"体积不变"的代价 ← 代码 01
§3 RealNVP:仿射耦合;掩码;二维与高维;隐空间插值 ← 代码 01、05
§4 自回归模型就是流:MAF 与 IAF;互为逆;计算取舍 ← 代码 02
§5 Parallel WaveNet:概率密度蒸馏;学生的“缩水” ← 代码 03
§6 MintNet 与高斯化流:逆 CDF、逐维高斯化 + 旋转 ← 代码 04
§7 离散数据:去量化(均匀 / 变分),像素世界上的 RealNVP ← 代码 05
§8 流模型小结;三个家族的比较
§9 2023 年之后
§10–14 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| ,(或 A、B 两组) | 耦合层里不变的一组(条件)、被变换的一组 |
| ,, | 耦合层里的平移网络、平移和对数缩放网络 |
| , | 自回归流里第 维的平移和对数缩放(由 MADE 一次算出) |
| , | Parallel WaveNet 的学生(IAF)和老师(MAF) |
| , | 数据的 CDF,标准正态的 CDF |
| 去量化噪声, |
0.5 关于数字 · About the numbers
二维实验(01、02 的第 3 部分、04)用 float64,真实密度已知,KL 是真正的 KL(nat)。“玩具音频”(03)是一个长度 32 的非线性自回归序列,真实密度可以精确计算,所以 和 两个方向都能算。像素世界(05)的数字是”比真实多 bit”,可以和第 3 讲的自回归模型、第 6 讲的 VAE 排行榜直接比较。计时依机器而定。几处和预想不同的结果(学生”缩水”的程度、高斯化流的过拟合、像素世界上流的表现很差)记录在 代码 README 的”关于实验结果”里。
1. 回顾与本讲计划 · Recap and plan
原课第 2–7 页回顾了第 7 讲:
- 归一化流: 确定、可逆,;、 必须连续、维数相同。
- 可逆变换可以复合,行列式相乘;平面流用 10 层就能把简单分布变复杂。
- 学习用精确的最大似然;采样走正向;隐表示走反向,不需要推断网络。
- 设计要求:先验简单;两个方向都好算;雅可比行列式好算——让雅可比是三角的,行列式 。
slide 8 列出本讲的计划:对角 / 三角雅可比的可逆变换(NICE、RealNVP);自回归模型作为流;可逆 CNN(MintNet);高斯化流;案例:Parallel WaveNet 里用概率密度蒸馏实现高效的学习和推断。 slide 9 列出了这个领域的一长串模型:NICE(Dinh et al. 2014)、Real-NVP(Dinh et al. 2017)、IAF(Kingma et al. 2016)、MAF(Papamakarios et al. 2017)、i-ResNet(Behrmann et al. 2018)、Glow(Kingma & Dhariwal 2018)、MintNet(Song et al. 2019)……它们的共同目标都是第 7 讲那张”设计图纸”。
2. NICE:加性耦合层 · Additive coupling (NICE)
2.1 定义
slide 10:把变量 分成两个不相交的子集,比如 和 ()。
- 正向 : 是一个神经网络, 个输入、 个输出。
- 反向 :
- 正向的雅可比:
体积不变(volume preserving):行列式为 1。
这个设计妙在哪里? 可以是任意复杂的神经网络,却永远不需要求它的逆——它只出现在”加一个偏移”里,求逆时减掉就行;因为 ,反向时 的输入就是已知的 。雅可比是下三角的(左下角那块再复杂也不影响行列式),对角线全是 1。可逆、两个方向一次前向、行列式免费——第 7 讲的三条要求一次全部满足。
2.2 缩放层
slide 11:加性耦合层组合在一起(每层用不同的分组),NICE 的最后一层是一个缩放变换:
为什么需要它?代码 01 第 1 部分做了一个直接的实验:用只有加性耦合层的流去拟合一个很窄的高斯 。
| 模型 | (nat) | |
|---|---|---|
| NICE,4 个加性耦合层,没有缩放层 | 3.626 | −1.838 |
| NICE,4 个加性耦合层 + 缩放层 | 0.000 | 2.785 |
| RealNVP,4 个仿射耦合层 | 0.002 | 2.789 |
(真实的 。)没有缩放层时, 停在 ——恰好是标准高斯先验的最大对数密度 。 意味着 :变换只能把概率”搬来搬去”,不能把它压缩到更小的体积里,所以 的密度永远不超过先验密度的最大值。下限可以算出来: nat,而它的 3.626 几乎正好碰到这个下限——在体积不变的约束下,它已经做到最好了。加一个缩放层就解决了问题。
slides 12–13 展示了 NICE 在 MNIST、TFD、SVHN、CIFAR-10 上的样本。
3. RealNVP:仿射耦合层 · Affine coupling (RealNVP)
3.1 定义
slide 14:NICE 的”体积可变”(non-volume preserving)扩展。
- 正向:,;
- 反向:,;
- 雅可比:
、 都是神经网络( 个输入、 个输出)。行列式一般不等于 1:每一层都能按条件拉伸或压缩。代码里 用 限制在一个范围内,避免训练初期 爆炸;网络的最后一层初始化为 0,让每一层一开始都是恒等变换。
3.2 二维实验:NICE vs RealNVP
代码 01 第 2 部分(5,000 个训练点,3,000 步):
| 数据 | 模型 | 层数 | (nat) |
|---|---|---|---|
| 双月牙 | NICE | 4 / 8 | 0.303 / 0.162 |
| 双月牙 | RealNVP | 4 / 8 | 0.255 / 0.037 |
| 八高斯圆环 | NICE | 4 / 8 | 0.740 / 1.026 |
| 八高斯圆环 | RealNVP | 4 / 8 | 0.250 / 0.113 |
- RealNVP 明显好于 NICE:加性耦合只能”平移”,体积变化只能靠最后那个全局的缩放层;仿射耦合每一层都能在不同位置按需要拉伸或压缩。
- NICE 在圆环上从 4 层加到 8 层反而变差:层数多了,同样的训练步数不一定收敛到更好的解。
- 圆环最难:8 个分开的团。和第 7 讲 §7.5 一样,连续可逆的变换不能把一个连通的高斯撕成 8 块,团与团之间总有被拉成细缝的残留质量。
- 在二维里,仿射耦合层和第 7 讲的二维三角变换是同一个东西(一个坐标不变,另一个按它做仿射变换)。耦合层真正的价值在高维:一半坐标做条件、另一半一次全部变换,正反两个方向都只要一次网络前向。
3.3 掩码:高维时怎样分组
每个耦合层只变换 B 组,所以必须交替使用互补的掩码(或者在层间做置换),否则 A 组永远不会被变换。掩码决定了”谁以谁为条件”。代码 01 第 3 部分在 8×8 的画布上画了三种分法:按列交错、上下一半、棋盘格。棋盘格让每个被变换的像素看到它上下左右的邻居(RealNVP 用于图像的空间掩码);“一半一半”让下半张以上半张为条件,条件信息离得远。RealNVP 在图像上还会把空间维度”挤”进通道维度(squeeze),再做按通道分组的掩码;Glow 把固定的置换换成可学习的 1×1 可逆卷积(第 7 讲的 LinearLU 就是这种参数化)。
3.4 隐空间插值
slide 15 展示了 RealNVP 在 CelebA、ImageNet 等数据上的样本;slide 16 展示了隐空间插值:用四个验证样本的隐表示 ,定义
由 参数化一个二维”流形”。为什么用 cos / sin 而不是直线插值?高维标准高斯的样本几乎都落在半径 的球壳上(第 1 讲的”典型集”),直线的中点会掉进球壳”里面”,那里的 很少被数据用到;cos / sin 的组合让插值点的长度保持在球壳附近。代码 05 第 4 部分在像素世界上画了这个 5×5 的网格:四个角恰好还原了四张测试图(流是可逆的);中间的格子有些接近合法的形状,更多是两张图的混合——像素世界只有 177 个离散的配置,连续的隐空间里大部分地方都”不对应”任何合法的图。
4. 自回归模型就是流 · Autoregressive models as flows
4.1 高斯自回归模型的采样器是一个可逆变换
slide 17:考虑一个高斯自回归模型
、 对 是神经网络,对 是常数。它的采样器:
- 抽 ,;
- 令 ,算出 、;
- 令 ,算出 、;
- ……
流的解读:这个采样器把标准高斯的样本 通过可逆变换(由 、 参数化)变成模型的样本 。 只依赖 ——雅可比是下三角的,正是第 7 讲 §7.3 的结构。连续的自回归模型就是流。
4.2 MAF:掩码自回归流
slides 18–19(Papamakarios et al. 2017;图改编自 Eric Jang 的博客):
- 正向 (采样):,算 、;,……采样是顺序的、慢的(和自回归模型一样), 次网络计算。
- 反向 (求密度):用 MADE(第 3 讲)并行地算出所有 、—— 全部已知;然后 ,逐元素地缩放平移。
- 雅可比是下三角的,行列式高效:。
- 求似然容易、可并行(和 MADE 一样);不同变量顺序的层可以叠起来。
4.3 IAF:逆自回归流
slide 20(Kingma et al. 2016):
- 正向 (采样,并行):抽 ;并行地算出所有 、(它们是 的自回归函数);。
- 反向 (顺序):,算 、;
- 采样快,给数据点求似然慢(训练要用)。
- 注意:给自己生成的点求似然很快——把 缓存下来就行。
4.4 IAF 是 MAF 的逆
slide 21:把 MAF 反向变换里的 和 对调,就得到 IAF 的正向变换;类似地,MAF 的正向变换就是 IAF 的反向变换。代码 02 第 1 部分用同一个 MADE 搭出一个 MAF 层和一个 IAF 层(令 IAF 的 、):MAF.inverse(u) 和 IAF.forward(u) 的输出最大差 (float32),MAF.forward(u) 和 IAF.inverse(u) 差 。
同一个函数,换个名字。 哪个方向是并行的,取决于 MADE 的输入是 还是 :MADE 只能对已知的整个向量一次算出所有 。MAF 的 是 的函数——给定 (求密度)一次算完,采样时 还不知道,只能一个一个算;IAF 正好反过来。
4.5 计算取舍
slide 22:**MAF 求似然快、采样慢;IAF 采样快、求似然慢。MAF 更适合基于 MLE 的训练和密度估计;IAF 更适合实时生成。**代码 02 第 2 部分(一个 MAF / IAF 层,MADE 两层 256 宽,1,000 个样本):
| MAF 求密度 | MAF 采样 | IAF 采样 | IAF 给外来数据求密度 | IAF 给自己的样本求密度 | |
|---|---|---|---|---|---|
| 16 | 0.27 ms | 4.5 ms | 0.26 ms | 4.4 ms | 0.26 ms |
| 64 | 0.47 ms | 27.4 ms | 0.47 ms | 27.4 ms | 0.47 ms |
| 256 | 1.54 ms | 291.6 ms | 1.27 ms | 277.3 ms | 1.29 ms |
顺序的两个方向随 线性增长; 时比并行方向慢近 200 倍。一段 1 秒的 16 kHz 音频有 16,000 个样本点,差距就是上万倍——这正是 WaveNet(第 3 讲)的痛点。用最大似然训练 IAF 时,每一步都要顺序求逆: 时一步 19.3 ms,MAF 只要 0.3 ms。所以 IAF 很少直接用最大似然训练,而是用在”只需要正向”的场合:VAE 的近似后验(Kingma et al. 2016 提出 IAF 时就是为了这个,也就是第 6 讲 slide 24 的”用流增强变分后验”),或者下一节的蒸馏。
在二维上(第 3 部分),8 层 MAF 和 8 层 RealNVP 参数几乎一样多,KL 也相近(双月牙 0.046 vs 0.060,圆环 0.119 vs 0.133)。在高维时,MAF 的每一维都以前面所有维为条件,比耦合层(一半以另一半为条件)更灵活,代价是采样要 步。这就是耦合层(采样、求密度都快)与自回归流(更灵活)之间的取舍。
能不能两者兼得?(slide 22)
5. Parallel WaveNet:概率密度蒸馏 · Probability density distillation
5.1 老师与学生
slide 23(van den Oord et al. 2018):两段式训练。
- 老师用 MAF 参数化,可以用 MLE 高效地训练。
- 老师训练好以后,初始化一个 IAF 参数化的学生。学生不能高效地给外来数据点求密度,但能高效地采样。
- 关键观察:IAF 也能高效地给自己生成的样本求密度(缓存噪声 )。
slide 24:概率密度蒸馏——训练学生去最小化学生 和老师 之间的 KL:
对这个目标做蒙特卡洛估计和优化,需要:学生的样本 (IAF 正向,快);学生给 的密度(缓存的 ,快);老师给 的密度(MAF 反向,快)。全部都能高效实现。
slide 25:训练分两步——第 1 步用 MLE 训练老师(MAF),第 2 步训练学生(IAF)最小化与老师的 KL;测试时只用学生。比原始的 WaveNet(普通的自回归模型)的采样效率提高了 1000 倍!
为什么蒸馏用的是 而不是 ?因为后者需要老师的样本(MAF 采样,顺序、慢)和学生给这些样本的密度(IAF 求逆,顺序、慢)——两样都慢,就失去了意义(练习 10)。可反向 KL 有它的代价,下面就看到。
5.2 实验:玩具音频
代码 03 用一个”像音频一样”的一维信号:长度 32 的非线性二阶自回归序列 ,信号上下振荡,真实密度可以精确计算。老师是一个 MAF 层(MADE 两层 256 宽),用 2 万条序列做最大似然;学生是 3 个 IAF 层,从没见过数据,只最小化 。
| 模型 | :均值 | 中位数 | 比 低 10 nat 以上 | 采样 1 万条 | |
|---|---|---|---|---|---|
| 老师(MAF,最大似然) | 1.117 | 1.005 | 0.55 | 1.4% | 86 ms(32 步顺序) |
| 学生(IAF,蒸馏) | 1.530 | 8,480 | 1.68 | 15.2% | 10 ms(3 层各一次前向) |
(nat / 序列;真实分布的熵约 12.8 nat。。)
- 按它被训练的方向衡量,学生很好:,和老师的 1.12 差不多——学生生成的序列,在真实分布看来是合理的。采样快约 8 倍(序列越长差距越大)。
- 反过来衡量,学生很糟:15% 的真实序列在学生看来概率低了 倍以上,平均 被这些序列主导,高达几千 nat。原因是学生的样本缩水了:第一个位置的标准差 0.79,真实是 1.00;第 3 个位置 0.64 vs 0.81。
- 这是反向 KL 的模式寻找(第 4 讲 §2.3、第 7 讲 §6.2):学生只需要让自己的样本”在老师看来合理”,不需要覆盖老师的全部;落在尾部的真实序列,学生给的密度可以小到几乎为 0。学生用来生成没问题,用来给真实数据打分(似然评估、异常检测)就不行。 Parallel WaveNet 在 KL 之外还加了功率谱损失、感知损失、对比损失,部分原因正在于此。
6. MintNet 与高斯化流 · MintNet and Gaussianization flows
6.1 MintNet
slides 26–28(Song et al. 2019):用掩码卷积搭可逆的神经网络。普通的卷积网络很强,但不可逆、雅可比行列式代价高。改用像 PixelCNN(第 3 讲)那样的掩码卷积来强制一个顺序:因为有顺序,雅可比矩阵是三角的,行列式容易算;如果雅可比的对角元全部(严格)为正,变换就是可逆的。slide 27 画了一个 3 个滤波器、3×3 卷积核的掩码卷积;slide 28 展示了 MNIST、CIFAR-10、ImageNet 32×32 上的样本。(MintNet 的逆没有闭式解,用不动点迭代求,迭代通常收敛得很快。本讲义没有为它写代码:它的思想和第 3 讲的 PixelCNN 掩码、本讲的 MAF 一脉相承。)
6.2 高斯化流:让变换后的数据像高斯
slide 29(Meng et al. 2020):设 是先验为高斯 的流,。流用最大似然训练,最小化 ——高斯样本经过 应该像数据。可以证明(KL 在可逆变换下不变)
**数据样本经过 应该像高斯。**怎样做到?
一维(slide 30):数据 的密度 、CDF 。逆 CDF 技巧:已知 时,( 均匀)就是 的样本。这意味着 是均匀的;再用逆 CDF 把均匀变成高斯:。可逆变换 把数据高斯化了!
代码 04 第 1 部分(): 的直方图每格都约 0.100; 的直方图和标准正态逐格吻合;反过来 (二分法求逆)的 和直接采样、精确的 一致(例如 时 0.9366)。一维的高斯化是最优的流:变换后的分布恰好是 ,雅可比就是 (练习 7)。难处在高维:多维分布没有单个 CDF 能做到这一点。
第 1 步:逐维高斯化(slide 31):对每一维分别做一维高斯化,雅可比是对角矩阵、好算。注意:即使每一维的边缘分布都是高斯,它们合起来也不一定是联合高斯。(旁注:用高斯先验近似它,就是一个叫 copula 模型的浅层流,Sklar 1959。)代码 04 第 2 部分:双月牙逐维高斯化(核密度估计的 CDF)以后,两个边缘的标准差 0.94 / 0.93(核密度估计把 CDF 平滑了一点)、两维之间的相关系数 −0.41,点云还是弯的;把它当作模型,KL = 0.79。
第 2 步:旋转(slide 32):对变换后的数据做一次旋转(雅可比是正交矩阵,)。 在旋转下不变,旋转只是把”弯”分到不同的坐标方向上。
反复做这两步(slide 33):堆叠可学习的高斯 copula,把数据变成正态分布。
6.3 实验:贪心的高斯化流
代码 04 第 3 部分实现了一个不用梯度训练的版本(类似 RBIG,Laparra et al. 2011):每一层用当前数据的核密度估计做逐维高斯化,再乘一个随机正交矩阵,贪心地逐层拟合(2,000 个训练点):
| 层数 | 训练集上的 KL | (新样本) |
|---|---|---|
| 1 | 0.777 | 0.800 |
| 2 | 0.661 | 0.686 |
| 4 | 0.488 | 0.519 |
| 8 | 0.189 | 0.533 |
| 16 | 0.070 | 1.404 |
每加一层,训练数据就更接近高斯一些,训练集上的 KL 一路下降;新样本上的 KL 却先降后升——每一层的核密度估计都以训练点为中心,层数多了,变换越来越贴合这 2,000 个点本身。“把训练数据变成高斯”和”学到一个好的密度”不是一回事,贪心的非参数方法同样会过拟合。最好的 0.52 远不如用梯度训练的流(0.03–0.04)。Meng et al. 2020 把核的位置、带宽和旋转都参数化,用最大似然一起训练,效果好得多(slide 34 展示了它在二维密度估计上的结果)。这个实验说明的是流的另一种设计思路:不必是神经网络,只要每层可逆、雅可比好算。
7. 离散数据:去量化 · Dequantization
slides 没有讲这个问题,但任何在图像上用流的人都会遇到:流定义的是连续密度,图像是离散的(像素世界每个像素只有 0 / 1,真实图像每个通道 256 个值)。
7.1 不去量化会怎样
代码 05 第 1 部分:二维的离散数据,4 个点 ,概率 0.4 / 0.3 / 0.2 / 0.1,熵 1.280 nat。直接在这些点上训练 RealNVP,“负对数似然”很快掉到熵以下、变成负数,之后忽高忽低(作者把训练延长到 8,000 步,仍在 −3.5 到 +10 之间跳动):流在试图把密度堆成 4 个无限尖的峰, 可以任意大(密度没有上限 1),这个目标没有最优解。低于熵这件事本身就说明,它不是一个合法的离散似然——第 6 讲练习 10 的同一个问题。
7.2 均匀去量化
给每个像素加一点均匀噪声 ,在连续的 上训练流。这定义了一个离散模型
(它确实是一个概率分布:对所有 求和就是 在全空间上的积分 = 1。)由 Jensen 不等式,——训练目标是离散似然的下界(Theis et al. 2016)。二维的例子去量化以后, 稳定在 1.36–1.42 之间,略高于熵 1.28——一个有意义、可以和离散模型比较的数。
7.3 变分去量化
均匀分布不一定是最好的噪声。把 当作隐变量,用一个学出来的 (第 5 讲的变分推断),
越接近”流在单位立方体里的形状”,界越紧(Flow++,Ho et al. 2019)。代码里 , 又是一次变量替换。
7.4 像素世界上的 RealNVP
代码 05 第 2–3 部分:64 维 RealNVP(8 个仿射耦合层,棋盘格掩码交替),8,000 步。用 个去量化样本的重要性加权平均可以把界收紧(第 5 讲 §4.3 的 IWAE,这里的隐变量是 ):
| RealNVP(8 个耦合层) | 参数 | :比真实多 bit | ||
|---|---|---|---|---|
| 均匀去量化 | 92 万 | 18.98 | 12.62 | 10.99 |
| 变分去量化 | 104 万 | 7.94 | 5.30 | 4.51 |
(对照:第 3 讲 FVSBN 4.65、MADE 3.71、GRU 0.83;第 6 讲最好的 VAE 2.19;独立像素 9.88。)
- 均匀去量化的 RealNVP 很差——比独立像素还差。 的真实密度在每个单位立方体里是平的,在边界上突变;光滑的可逆变换很难做出这种”台阶”,密度会漏到相邻的立方体里。 和 的差距,恰好就是”流在立方体里的形状”和均匀分布之间的 KL。
- 变分去量化让 去迁就流擅长的形状,界紧了很多(k = 128 时 4.51),但仍不如 VAE 和好的自回归模型。对这种”少量离散配置 + 独立噪声”的二值数据,连续的流不是自然的选择;在自然图像上(像素有 256 个取值,“台阶”相对小得多)流表现好得多。
- 第 4 部分:2,000 个样本(向下取整回到 0/1)在真实分布下的平均 是 34.1(真实数据约 25.5,VAE 的样本约 31.7)——有一部分合法的形状,很多带着多余或缺失的像素。
8. 流模型小结 · Summary of flows
slide 35:
- 通过变量替换,把简单分布变成更复杂的分布;
- 变换的雅可比要有好算的行列式,才能高效地学习和估计密度;
- 正向、反向变换的计算有取舍。
把到目前为止的三个似然模型家族放在一起:
| 自回归模型(第 3 讲) | VAE(第 5–6 讲) | 归一化流(第 7–8 讲) | |
|---|---|---|---|
| 似然 | 精确 | 下界(ELBO);IWAE 估计偏低 | 精确 |
| 采样 | 顺序, 步 | 一步(解码) | 一步(耦合层、IAF)或 步(MAF) |
| 隐表示 | 没有 | 有,低维、可压缩,需要编码器(近似后验) | 有,确定、精确,但维数 = 数据维数 |
| 结构限制 | 必须选顺序 | 后验近似误差;后验坍塌 | 必须可逆、雅可比便宜;不能改变拓扑;离散数据要去量化 |
| 像素世界上(比真实多 bit) | GRU 0.83 | 最好的 2.19 | 4.51(变分去量化,k = 128) |
最后一行只代表这个小世界和这些小模型:它说明的是”每个家族的假设和数据合不合拍”,不是一般意义上的排名。下一讲换一个思路:完全放弃似然。
9. 2023 年之后 · Since 2023
- 离散时间的流在图像上复兴。 2024 年以来,把 Transformer 用进流的工作(例如 Apple 的 TarFlow 用 Transformer 做 MAF 式的自回归流、并在多层间交替方向;Google 的 Jet 用 ViT 做耦合层的条件网络)报告了在 ImageNet 等数据上和扩散模型显著缩小的差距。它们沿用的正是本讲的两种积木:耦合层与自回归流,以及去量化(加噪)技巧。
- 蒸馏成了快速采样的主流手段。 Parallel WaveNet 的”慢老师 → 快学生”在扩散模型时代以新的形式回归:一致性模型、渐进式蒸馏、对抗蒸馏把几十上百步的扩散采样压缩到几步甚至一步(第 16 讲)。§5 的教训同样适用:学生往往在”生成”上很好,却未必保留了老师的完整分布(多样性、尾部),蒸馏损失的选择很关键。
- 连续时间的流:流匹配。 第 7 讲 §8 提到的流匹配 / 整流把”可逆变换”换成一个常微分方程,不再需要耦合层或三角雅可比的结构限制,训练也不用算行列式;它已经成为图像、视频、语音生成的主要训练方法之一(第 16 讲、MIT6.S184)。
- 流作为可精确求密度的组件。 在科学计算(分子、格点场论)和基于模拟的推断中,流常被用作能精确算密度的提议分布或后验近似(“神经后验估计”里常见的就是 MAF / 耦合层流)——正是 IAF 当初被提出时”增强 VAE 后验”的用法的延续。
10. 小结 · Summary
- NICE 加性耦合:, 任意、不用求逆,。体积不变是硬限制:拟合窄高斯时 KL 卡在理论下限 3.605 附近;缩放层解决它。
- RealNVP 仿射耦合:,,每层按条件缩放;8 层拟合双月牙 KL 0.037。掩码要交替;图像用棋盘格。隐空间插值用 cos / sin 保持在球壳附近。
- 连续自回归模型就是流。MAF:求密度一次(MADE),采样 步;IAF:采样一次,给外来数据求密度 步,给自己的样本求密度一次。二者互为逆(x、z 对调)。 时顺序方向慢近 200 倍。耦合层(两方向都快)vs 自回归流(更灵活)。
- Parallel WaveNet:MLE 训练 MAF 老师,最小化 蒸馏 IAF 学生,所需的三样东西都快。玩具音频上学生按反向 KL 很好(1.53),按前向 KL 很糟(15% 的真实序列几乎不可能)——样本缩水,反向 KL 的模式寻找。
- 高斯化流:最大似然 = 让 (数据) 像高斯;一维用 ;高维用”逐维高斯化 + 旋转”反复迭代。贪心的非参数版本训练集 KL 一路下降,新样本 KL 在 L = 4 最好后回升。
- 去量化:流不能直接拟合离散数据(似然无界); 是 的下界。像素世界上均匀去量化很松(19 bit),变分去量化 + 重要性加权收紧到 4.5 bit,仍不如 VAE(2.2)和 GRU(0.83)。
- 三个似然家族各有取舍:精确似然 / 快速采样 / 有用的隐表示,没有一个能全部做好。
11. 常见误区 · Common pitfalls
- “耦合层只变换一半坐标,所以表达力只有一半。” 交替掩码(或层间置换)让每个坐标都被反复变换;表达力来自层数和条件网络(§3.3)。但若所有层都用同一个掩码,A 组永远不变(练习 3)。
- “加性耦合层也能任意改变密度。” 它体积不变: 的密度不会超过先验密度的最大值(§2.2)。需要缩放层或仿射耦合。
- “MAF 和 IAF 是两种不同的模型。” 它们是同一种变换的两个方向(§4.4);区别只在”哪个方向用 MADE 并行算”。
- “IAF 不能求密度。” 能,只是给外来数据求密度要顺序算;给自己的样本求密度和采样一样快(§4.3)——这是蒸馏能成立的关键。
- “蒸馏出的学生和老师是同一个分布。” 反向 KL 蒸馏让学生”宁缺毋滥”:生成质量好,却可能把真实数据的尾部判为几乎不可能(§5.2)。
- “把训练数据变得越像高斯,模型就越好。” 贪心的高斯化流可以把训练数据变得很像高斯,同时在新数据上越来越差(§6.3)。
- “直接用流去拟合离散的像素值就行。” 似然会无界、训练不稳定(§7.1);要去量化,并且报告的是下界。
- “流的似然是精确的,所以流在像素数据上的 bits 一定比 VAE 好。” 去量化引入的界可能很松(§7.4:均匀去量化比独立像素还差)。精确的是连续密度 ,不是离散的 。
- “耦合层既然快,就总比自回归流好。” 自回归流每一维以前面所有维为条件,更灵活;选择取决于你更在乎采样速度还是密度估计的质量(§4.5)。
12. 练习 · Exercises
练习 1(加性耦合) 证明加性耦合层的雅可比是 ,行列式为 1。为什么反向变换里可以直接用 ?如果把 的输入换成 的一部分,会出什么问题?
参考答案
给出左上 、右上 0( 不依赖 ); 对 的导数是 ,对 的导数是 (左下 )。下三角、对角线全 1,行列式 1。反向时 已知,所以 可以直接算。如果 依赖被变换的那部分, 就成了一个隐式方程,求逆要迭代;雅可比的右下块也不再是 ,行列式不再免费。
练习 2(仿射耦合的 log det) 写出仿射耦合层反向变换的 。如果 不加限制,训练初期可能出什么问题?代码里怎样处理?
参考答案
,。 很大时 会数值溢出,一步梯度就可能把某个尺度推到极端,损失变成 nan。代码里用 把它限制在一个可学习的范围内,并把条件网络的最后一层初始化为 0,让每层一开始是恒等变换(RealNVP、Glow 都有类似的做法)。
练习 3(掩码必须交替) 设所有耦合层都用同一个掩码(A 组不变)。证明整个流对 A 组是恒等变换。这会让模型的边缘分布 是什么?
参考答案
每一层都保持 ,复合以后仍然 ,所以 ——无论条件网络多强,A 组的边缘分布永远是标准高斯。交替掩码(或在层间置换坐标)让每个坐标轮流”做条件”和”被变换”。
练习 4(MAF 的对数似然) 写出单层 MAF 的 ,用 、 表示。它和”高斯自回归模型”的对数似然 相同吗?
参考答案
,,这正是 。两种写法是同一个模型:流的视角给了它一个可以叠加多层、可以换顺序的框架(slide 17)。
练习 5(IAF 是 MAF 的逆) MAF 的反向变换是 。证明:若 IAF 的条件网络输出 、,则 IAF 的正向变换 恰好等于把 MAF 反向变换里的 换成 。、 还满足自回归结构吗?
参考答案
,正是 MAF 反向公式。、 是 、 的逐元素函数,而 只依赖 ,所以 也只依赖 ——仍是自回归的(代码 02 第 1 部分的 IAFFromMAF)。
练习 6(蒸馏目标的分解) 证明 。如果只最大化 (不要熵项),学生会变成什么样?这和 §5.2 的”缩水”有什么关系?
参考答案
。只最大化 ,学生会把所有样本都放到老师密度最大的那一点(坍塌成一个点,熵 )。熵项阻止坍塌,但它对”覆盖老师的全部尾部”没有强烈的要求——学生缩水一点, 会变大(样本更集中在老师的高密度区),熵变小,两者可以在一个比老师更窄的分布上取得平衡。这就是反向 KL 低估方差的来源。
练习 7(一维高斯化的雅可比) 。证明 ,并由此证明 ——一维高斯化是一个”精确”的流。
参考答案
,两边对 求导:,所以 。。流给出的密度恰好就是真实密度——前提是 精确已知。用核密度估计的 时,流的密度就是核密度估计(代码 04 的 MarginalGaussianization 里 log det = log f − log φ(z))。
练习 8(去量化的下界) 设 是 上的连续密度,,。(a) 证明 。(b) 证明 ,以及对任意 ,。等号什么时候成立?
参考答案
(a) 单位立方体 ()恰好铺满 、互不重叠,。(b) ,由 Jensen(log 凹),;均匀分布 是特例。等号当且仅当 对 是常数,即 ——” 和流在立方体里的形状一致”。均匀去量化要求流在每个立方体里是平的,所以很松(§7.4)。
练习 9(动手:换一种掩码)
在 05_dequantization.py 的 train_pixel_flow 里,把棋盘格掩码换成 [half_mask(64, True), half_mask(64, False)](上下一半)。预测均匀去量化那一行的数字会变好还是变差。
参考答案(预测的思路)
上下一半的掩码让下半张以上半张为条件、反之亦然;每层的条件信息离被变换的像素较远,局部的笔画结构(相邻像素强相关)更难利用,可能会变差。但像素世界的结构是”整个形状”,上下两半也有很强的依赖(例如方框的上边和下边),差别未必大。具体数字以你的运行为准。
练习 10(为什么不用前向 KL 蒸馏) 如果改用 训练学生,每一步需要计算什么?用 MAF 老师和 IAF 学生,哪些操作是慢的?它和”直接用老师的样本对学生做最大似然”是什么关系?
参考答案
需要老师的样本(MAF 采样:顺序, 步)和学生给这些样本的密度(IAF 给外来数据求密度:顺序, 步)——两样都慢,训练成本和直接训练一个自回归模型差不多,失去了 Parallel WaveNet 的意义。 不依赖学生,所以最小化 等价于最大化 ——就是”用老师的样本对学生做最大似然”。它会让学生覆盖老师的全部(模式覆盖),没有缩水的问题,但每一步都很慢。
13. 延伸阅读 · Further reading
原课材料
- CS236 Fall 2023 Lecture 8 slides:https://deepgenerativemodels.github.io/assets/slides/cs236_lecture8.pdf
- 课程笔记 Normalizing Flow Models:https://deepgenerativemodels.github.io/notes/flow/
- Eric Jang, Normalizing Flows Tutorial(slides 18–21 的图来自这里):https://blog.evjang.com/2018/01/nf2.html
耦合层与自回归流
- Dinh, Krueger & Bengio, NICE: Non-linear Independent Components Estimation, ICLR Workshop 2015(arXiv 2014)
- Dinh, Sohl-Dickstein & Bengio, Density Estimation using Real NVP, ICLR 2017
- Kingma & Dhariwal, Glow: Generative Flow with Invertible 1×1 Convolutions, NeurIPS 2018
- Papamakarios, Pavlakou & Murray, Masked Autoregressive Flow for Density Estimation, NeurIPS 2017
- Kingma, Salimans, Jozefowicz, Chen, Sutskever & Welling, Improved Variational Inference with Inverse Autoregressive Flow, NeurIPS 2016
- Song, Meng & Ermon, MintNet: Building Invertible Neural Networks with Masked Convolutions, NeurIPS 2019
蒸馏、高斯化、去量化
- van den Oord et al., Parallel WaveNet: Fast High-Fidelity Speech Synthesis, ICML 2018
- Meng, Song, Song & Ermon, Gaussianization Flows, AISTATS 2020;Laparra, Camps-Valls & Malo, Iterative Gaussianization: from ICA to Random Rotations, IEEE TNN 2011(RBIG)
- Theis, van den Oord & Bethge, A Note on the Evaluation of Generative Models, ICLR 2016(均匀去量化与下界)
- Ho, Chen, Srinivas, Duan & Abbeel, Flow++: Improving Flow-Based Generative Models with Variational Dequantization and Architecture Design, ICML 2019
2023 年之后
- Zhai et al., Normalizing Flows are Capable Generative Models(TarFlow, 2024)
- Papamakarios et al., Normalizing Flows for Probabilistic Modeling and Inference, JMLR 2021(综述,含神经后验估计的应用)
14. 下一讲预告 · Next lecture
到这里,我们已经有了三个基于似然的模型家族,它们都在最小化 (或它的下界)。可第 4 讲就提醒过:似然高不等于样本好;第 6 讲看到 ELBO 更紧也不保证样本更好;本讲看到流在像素世界上似然不错、样本却有不少多余的像素。第 9 讲(原课 Lecture 9,GANs)换一个思路:
- 不再要求模型能算出 ,只要求能采样(一个”隐式”模型:);
- 用两样本检验来比较两个分布:训练一个判别器去区分真实样本和生成样本(第 1 讲代码 05 的”似然 vs 判别器”);
- 生成器和判别器的极小极大博弈,最优判别器,以及它和 Jensen–Shannon 散度的关系。