Lecture 8 · 归一化流(二):耦合层、自回归流与并行 WaveNet · Normalizing Flows II

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

课程源码 ZIP ↓

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

本篇目录

对应 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

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

  1. 写出 NICE 的加性耦合层和缩放层,证明加性耦合的行列式为 1,说明”体积不变”带来的限制;写出 RealNVP 的仿射耦合层及其 log det;知道掩码怎样分组、为什么要交替。
  2. 说明连续自回归模型就是流;写出 MAF 和 IAF 的正向、反向公式,解释为什么 MAF 求密度快、采样慢,IAF 正好相反,以及”IAF 是 MAF 的逆”。
  3. 讲清 Parallel WaveNet 的概率密度蒸馏:为什么用 MAF 当老师、IAF 当学生,为什么蒸馏目标是 DKL(s∥t)D_{\mathrm{KL}}(s \Vert t),它的代价是什么。
  4. 理解高斯化流:一维的 Φ−1∘F\Phi^{-1}\circ F,逐维高斯化 + 旋转,以及”最大似然训练流 = 让变换后的数据接近高斯”。
  5. 知道怎样用连续的流给离散数据建模:均匀去量化、变分去量化,以及它们给出的是 log⁡P(x)\log P(x) 的下界。
  6. 把自回归模型、VAE、流放在一张表里比较:似然、采样、隐表示、维数的取舍。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 7 讲:变量替换、一串变换、三角雅可比、平面流不用似然的生成模型(GAN,第 9–10 讲)
第 3 讲:MADE(掩码让输出 ii 只依赖前面的输入)、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

符号含义
z1:dz_{1:d},zd+1:nz_{d+1:n}(或 A、B 两组)耦合层里不变的一组(条件)、被变换的一组
mθm_\theta,μθ\mu_\theta,αθ\alpha_\theta耦合层里的平移网络、平移和对数缩放网络
μi(⋅)\mu_i(\cdot),αi(⋅)\alpha_i(\cdot)自回归流里第 ii 维的平移和对数缩放(由 MADE 一次算出)
ss,ttParallel WaveNet 的学生(IAF)和老师(MAF)
FdataF_{\text{data}},Φ\Phi数据的 CDF,标准正态的 CDF
u∼q(u∣x)u \sim q(u \mid x)去量化噪声,u∈[0,1)Du \in [0, 1)^D

0.5 关于数字 · About the numbers

二维实验(01、02 的第 3 部分、04)用 float64,真实密度已知,KL 是真正的 KL(nat)。“玩具音频”(03)是一个长度 32 的非线性自回归序列,真实密度可以精确计算,所以 DKL(真实∥⋅)D_{\mathrm{KL}}(\text{真实} \Vert \cdot) 和 DKL(⋅∥真实)D_{\mathrm{KL}}(\cdot \Vert \text{真实}) 两个方向都能算。像素世界(05)的数字是”比真实多 bit”,可以和第 3 讲的自回归模型、第 6 讲的 VAE 排行榜直接比较。计时依机器而定。几处和预想不同的结果(学生”缩水”的程度、高斯化流的过拟合、像素世界上流的表现很差)记录在 代码 README 的”关于实验结果”里。


1. 回顾与本讲计划 · Recap and plan

原课第 2–7 页回顾了第 7 讲:

  • 归一化流:X=fθ(Z)X = f_\theta(Z) 确定、可逆,pX(x;θ)=pZ(fθ−1(x))∣det⁡∂fθ−1(x)∂x∣p_X(x; \theta) = p_Z(f_\theta^{-1}(x))\left|\det \frac{\partial f_\theta^{-1}(x)}{\partial x}\right|;xx、zz 必须连续、维数相同。
  • 可逆变换可以复合,行列式相乘;平面流用 10 层就能把简单分布变复杂。
  • 学习用精确的最大似然;采样走正向;隐表示走反向,不需要推断网络。
  • 设计要求:先验简单;两个方向都好算;雅可比行列式好算——让雅可比是三角的,行列式 O(n)O(n)。

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:把变量 zz 分成两个不相交的子集,比如 z1:dz_{1:d} 和 zd+1:nz_{d+1:n}(1≤d<n1 \leq d < n)。

  • 正向 z↦xz \mapsto x: x1:d=z1:d  (恒等),xd+1:n=zd+1:n+mθ(z1:d),x_{1:d} = z_{1:d}\;(\text{恒等}), \qquad x_{d+1:n} = z_{d+1:n} + m_\theta(z_{1:d}), mθ(⋅)m_\theta(\cdot) 是一个神经网络,dd 个输入、n−dn - d 个输出。
  • 反向 x↦zx \mapsto z: z1:d=x1:d,zd+1:n=xd+1:n−mθ(x1:d).z_{1:d} = x_{1:d}, \qquad z_{d+1:n} = x_{d+1:n} - m_\theta(x_{1:d}).
  • 正向的雅可比: J=∂x∂z=(Id0∂xd+1:n∂z1:dIn−d),det⁡J=1.J = \frac{\partial x}{\partial z} = \begin{pmatrix} I_d & 0 \\ \frac{\partial x_{d+1:n}}{\partial z_{1:d}} & I_{n-d}\end{pmatrix}, \qquad \det J = 1.

体积不变(volume preserving):行列式为 1。

这个设计妙在哪里?mθm_\theta 可以是任意复杂的神经网络,却永远不需要求它的逆——它只出现在”加一个偏移”里,求逆时减掉就行;因为 x1:d=z1:dx_{1:d} = z_{1:d},反向时 mθm_\theta 的输入就是已知的 x1:dx_{1:d}。雅可比是下三角的(左下角那块再复杂也不影响行列式),对角线全是 1。可逆、两个方向一次前向、行列式免费——第 7 讲的三条要求一次全部满足。

2.2 缩放层

slide 11:加性耦合层组合在一起(每层用不同的分组),NICE 的最后一层是一个缩放变换:

xi=sizi  (si>0),zi=xi/si,J=diag(s),det⁡J=∏i=1nsi.x_i = s_i z_i\;(s_i > 0), \qquad z_i = x_i / s_i, \qquad J = \mathrm{diag}(s), \qquad \det J = \prod_{i=1}^n s_i.

为什么需要它?代码 01 第 1 部分做了一个直接的实验:用只有加性耦合层的流去拟合一个很窄的高斯 N(0,0.12I)\mathcal{N}(0, 0.1^2 I)。

模型DKL(p∥q)D_{\mathrm{KL}}(p \Vert q)(nat)log⁡q(0)\log q(0)
NICE,4 个加性耦合层,没有缩放层3.626−1.838
NICE,4 个加性耦合层 + 缩放层0.0002.785
RealNVP,4 个仿射耦合层0.0022.789

(真实的 log⁡p(0)=2.767\log p(0) = 2.767。)没有缩放层时,log⁡q(0)\log q(0) 停在 −1.838-1.838——恰好是标准高斯先验的最大对数密度 −log⁡2π-\log 2\pi。det⁡=1\det = 1 意味着 pX(x)=pZ(f−1(x))p_X(x) = p_Z(f^{-1}(x)):变换只能把概率”搬来搬去”,不能把它压缩到更小的体积里,所以 qq 的密度永远不超过先验密度的最大值。下限可以算出来:DKL(p∥q)≥Ep[log⁡p]−max⁡log⁡pZ=1.767+1.838=3.605D_{\mathrm{KL}}(p \Vert q) \geq \mathbb{E}_p[\log p] - \max\log p_Z = 1.767 + 1.838 = 3.605 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)扩展。

  • 正向:x1:d=z1:dx_{1:d} = z_{1:d},  xd+1:n=zd+1:n⊙exp⁡(αθ(z1:d))+μθ(z1:d)\;x_{d+1:n} = z_{d+1:n} \odot \exp(\alpha_\theta(z_{1:d})) + \mu_\theta(z_{1:d});
  • 反向:z1:d=x1:dz_{1:d} = x_{1:d},  zd+1:n=(xd+1:n−μθ(x1:d))⊙exp⁡(−αθ(x1:d))\;z_{d+1:n} = (x_{d+1:n} - \mu_\theta(x_{1:d})) \odot \exp(-\alpha_\theta(x_{1:d}));
  • 雅可比: J=(Id0∂xd+1:n∂z1:ddiag(exp⁡(αθ(z1:d)))),det⁡J=∏i=d+1nexp⁡(αθ(z1:d)i)=exp⁡(∑i=d+1nαθ(z1:d)i).J = \begin{pmatrix} I_d & 0 \\ \frac{\partial x_{d+1:n}}{\partial z_{1:d}} & \mathrm{diag}(\exp(\alpha_\theta(z_{1:d})))\end{pmatrix}, \qquad \det J = \prod_{i=d+1}^n \exp(\alpha_\theta(z_{1:d})_i) = \exp\left(\sum_{i=d+1}^n \alpha_\theta(z_{1:d})_i\right).

μθ\mu_\theta、αθ\alpha_\theta 都是神经网络(dd 个输入、n−dn - d 个输出)。行列式一般不等于 1:每一层都能按条件拉伸或压缩。代码里 α\alpha 用 scale⋅tanh⁡(⋅)\text{scale}\cdot\tanh(\cdot) 限制在一个范围内,避免训练初期 eαe^\alpha 爆炸;网络的最后一层初始化为 0,让每一层一开始都是恒等变换。

3.2 二维实验:NICE vs RealNVP

代码 01 第 2 部分(5,000 个训练点,3,000 步):

数据模型层数DKL(p∥q)D_{\mathrm{KL}}(p \Vert q)(nat)
双月牙NICE4 / 80.303 / 0.162
双月牙RealNVP4 / 80.255 / 0.037
八高斯圆环NICE4 / 80.740 / 1.026
八高斯圆环RealNVP4 / 80.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 展示了隐空间插值:用四个验证样本的隐表示 z(1),…,z(4)z^{(1)}, \dots, z^{(4)},定义

z=cos⁡ϕ (z(1)cos⁡ϕ′+z(2)sin⁡ϕ′)+sin⁡ϕ (z(3)cos⁡ϕ′+z(4)sin⁡ϕ′),z = \cos\phi\,(z^{(1)}\cos\phi' + z^{(2)}\sin\phi') + \sin\phi\,(z^{(3)}\cos\phi' + z^{(4)}\sin\phi'),

由 ϕ,ϕ′\phi, \phi' 参数化一个二维”流形”。为什么用 cos / sin 而不是直线插值?高维标准高斯的样本几乎都落在半径 n\sqrt{n} 的球壳上(第 1 讲的”典型集”),直线的中点会掉进球壳”里面”,那里的 zz 很少被数据用到;cos / sin 的组合让插值点的长度保持在球壳附近。代码 05 第 4 部分在像素世界上画了这个 5×5 的网格:四个角恰好还原了四张测试图(流是可逆的);中间的格子有些接近合法的形状,更多是两张图的混合——像素世界只有 177 个离散的配置,连续的隐空间里大部分地方都”不对应”任何合法的图。


4. 自回归模型就是流 · Autoregressive models as flows

4.1 高斯自回归模型的采样器是一个可逆变换

slide 17:考虑一个高斯自回归模型

p(x)=∏i=1np(xi∣x<i),p(xi∣x<i)=N(μi(x1,…,xi−1), exp⁡(αi(x1,…,xi−1))2),p(x) = \prod_{i=1}^n p(x_i \mid x_{<i}), \qquad p(x_i \mid x_{<i}) = \mathcal{N}\big(\mu_i(x_1, \dots, x_{i-1}),\, \exp(\alpha_i(x_1, \dots, x_{i-1}))^2\big),

μi\mu_i、αi\alpha_i 对 i>1i > 1 是神经网络,对 i=1i = 1 是常数。它的采样器:

  • 抽 zi∼N(0,1)z_i \sim \mathcal{N}(0, 1),i=1,…,ni = 1, \dots, n;
  • 令 x1=exp⁡(α1)z1+μ1x_1 = \exp(\alpha_1)z_1 + \mu_1,算出 μ2(x1)\mu_2(x_1)、α2(x1)\alpha_2(x_1);
  • 令 x2=exp⁡(α2)z2+μ2x_2 = \exp(\alpha_2)z_2 + \mu_2,算出 μ3(x1,x2)\mu_3(x_1, x_2)、α3(x1,x2)\alpha_3(x_1, x_2);
  • ……

流的解读:这个采样器把标准高斯的样本 (z1,…,zn)(z_1, \dots, z_n) 通过可逆变换(由 μi(⋅)\mu_i(\cdot)、αi(⋅)\alpha_i(\cdot) 参数化)变成模型的样本 (x1,…,xn)(x_1, \dots, x_n)。xix_i 只依赖 z≤iz_{\leq i}——雅可比是下三角的,正是第 7 讲 §7.3 的结构。连续的自回归模型就是流。

4.2 MAF:掩码自回归流

slides 18–19(Papamakarios et al. 2017;图改编自 Eric Jang 的博客):

  • 正向 z↦xz \mapsto x(采样):x1=exp⁡(α1)z1+μ1x_1 = \exp(\alpha_1)z_1 + \mu_1,算 μ2(x1)\mu_2(x_1)、α2(x1)\alpha_2(x_1);x2=exp⁡(α2)z2+μ2x_2 = \exp(\alpha_2)z_2 + \mu_2,……采样是顺序的、慢的(和自回归模型一样),O(n)O(n) 次网络计算。
  • 反向 x↦zx \mapsto z(求密度):用 MADE(第 3 讲)并行地算出所有 μi\mu_i、αi\alpha_i——xx 全部已知;然后 zi=(xi−μi)/exp⁡(αi)z_i = (x_i - \mu_i)/\exp(\alpha_i),逐元素地缩放平移。
  • 雅可比是下三角的,行列式高效:log⁡∣det⁡∂z/∂x∣=−∑iαi(x<i)\log|\det \partial z/\partial x| = -\sum_i \alpha_i(x_{<i})。
  • 求似然容易、可并行(和 MADE 一样);不同变量顺序的层可以叠起来。

4.3 IAF:逆自回归流

slide 20(Kingma et al. 2016):

  • 正向 z↦xz \mapsto x(采样,并行):抽 zi∼N(0,1)z_i \sim \mathcal{N}(0, 1);并行地算出所有 μi\mu_i、αi\alpha_i(它们是 zz 的自回归函数);xi=exp⁡(αi)zi+μix_i = \exp(\alpha_i)z_i + \mu_i。
  • 反向 x↦zx \mapsto z(顺序):z1=(x1−μ1)/exp⁡(α1)z_1 = (x_1 - \mu_1)/\exp(\alpha_1),算 μ2(z1)\mu_2(z_1)、α2(z1)\alpha_2(z_1);z2=…z_2 = \dots
  • 采样快,给数据点求似然慢(训练要用)。
  • 注意:给自己生成的点求似然很快——把 z1,…,znz_1, \dots, z_n 缓存下来就行。

4.4 IAF 是 MAF 的逆

slide 21:把 MAF 反向变换里的 zz 和 xx 对调,就得到 IAF 的正向变换;类似地,MAF 的正向变换就是 IAF 的反向变换。代码 02 第 1 部分用同一个 MADE 搭出一个 MAF 层和一个 IAF 层(令 IAF 的 α′=−α\alpha' = -\alpha、μ′=−μe−α\mu' = -\mu e^{-\alpha}):MAF.inverse(u) 和 IAF.forward(u) 的输出最大差 1.2×10−71.2 \times 10^{-7}(float32),MAF.forward(u) 和 IAF.inverse(u) 差 7.2×10−77.2 \times 10^{-7}。

同一个函数,换个名字。 哪个方向是并行的,取决于 MADE 的输入是 xx 还是 zz:MADE 只能对已知的整个向量一次算出所有 μi,αi\mu_i, \alpha_i。MAF 的 μ,α\mu, \alpha 是 xx 的函数——给定 xx(求密度)一次算完,采样时 xx 还不知道,只能一个一个算;IAF 正好反过来。

4.5 计算取舍

slide 22:**MAF 求似然快、采样慢;IAF 采样快、求似然慢。MAF 更适合基于 MLE 的训练和密度估计;IAF 更适合实时生成。**代码 02 第 2 部分(一个 MAF / IAF 层,MADE 两层 256 宽,1,000 个样本):

DDMAF 求密度MAF 采样IAF 采样IAF 给外来数据求密度IAF 给自己的样本求密度
160.27 ms4.5 ms0.26 ms4.4 ms0.26 ms
640.47 ms27.4 ms0.47 ms27.4 ms0.47 ms
2561.54 ms291.6 ms1.27 ms277.3 ms1.29 ms

顺序的两个方向随 DD 线性增长;D=256D = 256 时比并行方向慢近 200 倍。一段 1 秒的 16 kHz 音频有 16,000 个样本点,差距就是上万倍——这正是 WaveNet(第 3 讲)的痛点。用最大似然训练 IAF 时,每一步都要顺序求逆:D=64D = 64 时一步 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 的每一维都以前面所有维为条件,比耦合层(一半以另一半为条件)更灵活,代价是采样要 DD 步。这就是耦合层(采样、求密度都快)与自回归流(更灵活)之间的取舍。

能不能两者兼得?(slide 22)


5. Parallel WaveNet:概率密度蒸馏 · Probability density distillation

5.1 老师与学生

slide 23(van den Oord et al. 2018):两段式训练。

  • 老师用 MAF 参数化,可以用 MLE 高效地训练。
  • 老师训练好以后,初始化一个 IAF 参数化的学生。学生不能高效地给外来数据点求密度,但能高效地采样。
  • 关键观察:IAF 也能高效地给自己生成的样本求密度(缓存噪声 z1,…,znz_1, \dots, z_n)。

slide 24:概率密度蒸馏——训练学生去最小化学生 ss 和老师 tt 之间的 KL:

DKL(s,t)=Ex∼s[log⁡s(x)−log⁡t(x)].D_{\mathrm{KL}}(s, t) = \mathbb{E}_{x \sim s}\big[\log s(x) - \log t(x)\big].

对这个目标做蒙特卡洛估计和优化,需要:学生的样本 xx(IAF 正向,快);学生给 xx 的密度(缓存的 zz,快);老师给 xx 的密度(MAF 反向,快)。全部都能高效实现。

slide 25:训练分两步——第 1 步用 MLE 训练老师(MAF),第 2 步训练学生(IAF)最小化与老师的 KL;测试时只用学生。比原始的 WaveNet(普通的自回归模型)的采样效率提高了 1000 倍!

为什么蒸馏用的是 DKL(s∥t)D_{\mathrm{KL}}(s \Vert t) 而不是 DKL(t∥s)D_{\mathrm{KL}}(t \Vert s)?因为后者需要老师的样本(MAF 采样,顺序、慢)和学生给这些样本的密度(IAF 求逆,顺序、慢)——两样都慢,就失去了意义(练习 10)。可反向 KL 有它的代价,下面就看到。

5.2 实验:玩具音频

代码 03 用一个”像音频一样”的一维信号:长度 32 的非线性二阶自回归序列 xt∼N(1.2sin⁡(1.5xt−1)−0.6xt−2,0.352)x_t \sim \mathcal{N}(1.2\sin(1.5x_{t-1}) - 0.6x_{t-2}, 0.35^2),信号上下振荡,真实密度可以精确计算。老师是一个 MAF 层(MADE 两层 256 宽),用 2 万条序列做最大似然;学生是 3 个 IAF 层,从没见过数据,只最小化 DKL(学生∥老师)D_{\mathrm{KL}}(\text{学生} \Vert \text{老师})。

模型DKL(模型∥真实)D_{\mathrm{KL}}(\text{模型} \Vert \text{真实})DKL(真实∥模型)D_{\mathrm{KL}}(\text{真实} \Vert \text{模型}):均值中位数log⁡q\log q 比 log⁡p\log p 低 10 nat 以上采样 1 万条
老师(MAF,最大似然)1.1171.0050.551.4%86 ms(32 步顺序)
学生(IAF,蒸馏)1.5308,4801.6815.2%10 ms(3 层各一次前向)

(nat / 序列;真实分布的熵约 12.8 nat。DKL(学生∥老师)=1.38D_{\mathrm{KL}}(\text{学生} \Vert \text{老师}) = 1.38。)

  • 按它被训练的方向衡量,学生很好:DKL(学生∥真实)=1.53D_{\mathrm{KL}}(\text{学生} \Vert \text{真实}) = 1.53,和老师的 1.12 差不多——学生生成的序列,在真实分布看来是合理的。采样快约 8 倍(序列越长差距越大)。
  • 反过来衡量,学生很糟:15% 的真实序列在学生看来概率低了 e10e^{10} 倍以上,平均 DKL(真实∥学生)D_{\mathrm{KL}}(\text{真实} \Vert \text{学生}) 被这些序列主导,高达几千 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):设 X=fθ(Z)X = f_\theta(Z) 是先验为高斯 pZ=N(0,I)p_Z = \mathcal{N}(0, I) 的流,X~∼pdata\tilde{X} \sim p_{\text{data}}。流用最大似然训练,最小化 DKL(pdata∥pθ)=DKL(pX~∥pX)D_{\mathrm{KL}}(p_{\text{data}} \Vert p_\theta) = D_{\mathrm{KL}}(p_{\tilde{X}} \Vert p_X)——高斯样本经过 fθf_\theta 应该像数据。可以证明(KL 在可逆变换下不变)

DKL(pX~∥pX)=DKL(pfθ−1(X~)∥pfθ−1(X))=DKL(pfθ−1(X~)∥pZ):D_{\mathrm{KL}}(p_{\tilde{X}} \Vert p_X) = D_{\mathrm{KL}}\big(p_{f_\theta^{-1}(\tilde{X})} \Vert p_{f_\theta^{-1}(X)}\big) = D_{\mathrm{KL}}\big(p_{f_\theta^{-1}(\tilde{X})} \Vert p_Z\big):

**数据样本经过 fθ−1f_\theta^{-1} 应该像高斯。**怎样做到?

一维(slide 30):数据 X~\tilde{X} 的密度 pdatap_{\text{data}}、CDF Fdata(a)=∫−∞apdataF_{\text{data}}(a) = \int_{-\infty}^a p_{\text{data}}。逆 CDF 技巧:已知 FdataF_{\text{data}} 时,X~=Fdata−1(U)\tilde{X} = F_{\text{data}}^{-1}(U)(UU 均匀)就是 pdatap_{\text{data}} 的样本。这意味着 U=Fdata(X~)U = F_{\text{data}}(\tilde{X}) 是均匀的;再用逆 CDF 把均匀变成高斯:Φ−1(U)=Φ−1(Fdata(X~))\Phi^{-1}(U) = \Phi^{-1}(F_{\text{data}}(\tilde{X}))。可逆变换 Φ−1∘Fdata\Phi^{-1}\circ F_{\text{data}} 把数据高斯化了!

代码 04 第 1 部分(X∼0.4 N(−2,0.52)+0.6 N(1,0.82)X \sim 0.4\,\mathcal{N}(-2, 0.5^2) + 0.6\,\mathcal{N}(1, 0.8^2)):U=F(X)U = F(X) 的直方图每格都约 0.100;Z=Φ−1(F(X))Z = \Phi^{-1}(F(X)) 的直方图和标准正态逐格吻合;反过来 X=F−1(U)X = F^{-1}(U)(二分法求逆)的 P(X≤a)P(X \leq a) 和直接采样、精确的 F(a)F(a) 一致(例如 a=2a = 2 时 0.9366)。一维的高斯化是最优的流:变换后的分布恰好是 N(0,1)\mathcal{N}(0, 1),雅可比就是 p(x)/φ(z)p(x)/\varphi(z)(练习 7)。难处在高维:多维分布没有单个 CDF 能做到这一点。

第 1 步:逐维高斯化(slide 31):对每一维分别做一维高斯化,雅可比是对角矩阵、好算。注意:即使每一维的边缘分布都是高斯,它们合起来也不一定是联合高斯。(旁注:用高斯先验近似它,就是一个叫 copula 模型的浅层流,Sklar 1959。)代码 04 第 2 部分:双月牙逐维高斯化(核密度估计的 CDF)以后,两个边缘的标准差 0.94 / 0.93(核密度估计把 CDF 平滑了一点)、两维之间的相关系数 −0.41,点云还是弯的;把它当作模型,KL = 0.79。

第 2 步:旋转(slide 32):对变换后的数据做一次旋转(雅可比是正交矩阵,∣det⁡∣=1|\det| = 1)。N(0,I)\mathcal{N}(0, I) 在旋转下不变,旋转只是把”弯”分到不同的坐标方向上。

反复做这两步(slide 33):堆叠可学习的高斯 copula,把数据变成正态分布。

6.3 实验:贪心的高斯化流

代码 04 第 3 部分实现了一个不用梯度训练的版本(类似 RBIG,Laparra et al. 2011):每一层用当前数据的核密度估计做逐维高斯化,再乘一个随机正交矩阵,贪心地逐层拟合(2,000 个训练点):

层数 LL训练集上的 KLDKL(p∥q)D_{\mathrm{KL}}(p \Vert q)(新样本)
10.7770.800
20.6610.686
40.4880.519
80.1890.533
160.0701.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,0),(0,1),(1,0),(1,1)(0,0), (0,1), (1,0), (1,1),概率 0.4 / 0.3 / 0.2 / 0.1,熵 1.280 nat。直接在这些点上训练 RealNVP,“负对数似然”很快掉到熵以下、变成负数,之后忽高忽低(作者把训练延长到 8,000 步,仍在 −3.5 到 +10 之间跳动):流在试图把密度堆成 4 个无限尖的峰,p(x)p(x) 可以任意大(密度没有上限 1),这个目标没有最优解。低于熵这件事本身就说明,它不是一个合法的离散似然——第 6 讲练习 10 的同一个问题。

7.2 均匀去量化

给每个像素加一点均匀噪声 u∈[0,1)Du \in [0, 1)^D,在连续的 y=x+uy = x + u 上训练流。这定义了一个离散模型

P(x)=∫[0,1)Dp(x+u) du,P(x) = \int_{[0,1)^D} p(x + u)\,du,

(它确实是一个概率分布:对所有 xx 求和就是 pp 在全空间上的积分 = 1。)由 Jensen 不等式,Eu∼U[log⁡p(x+u)]≤log⁡P(x)\mathbb{E}_{u \sim U}[\log p(x + u)] \leq \log P(x)——训练目标是离散似然的下界(Theis et al. 2016)。二维的例子去量化以后,−log⁡p-\log p 稳定在 1.36–1.42 之间,略高于熵 1.28——一个有意义、可以和离散模型比较的数。

7.3 变分去量化

均匀分布不一定是最好的噪声。把 uu 当作隐变量,用一个学出来的 q(u∣x)q(u \mid x)(第 5 讲的变分推断),

log⁡P(x)≥Eu∼q(u∣x)[log⁡p(x+u)−log⁡q(u∣x)],\log P(x) \geq \mathbb{E}_{u \sim q(u|x)}\big[\log p(x + u) - \log q(u \mid x)\big],

qq 越接近”流在单位立方体里的形状”,界越紧(Flow++,Ho et al. 2019)。代码里 ui=sigmoid(ai(x)+esi(x)ϵi)u_i = \mathrm{sigmoid}(a_i(x) + e^{s_i(x)}\epsilon_i),log⁡q\log q 又是一次变量替换。

7.4 像素世界上的 RealNVP

代码 05 第 2–3 部分:64 维 RealNVP(8 个仿射耦合层,棋盘格掩码交替),8,000 步。用 kk 个去量化样本的重要性加权平均可以把界收紧(第 5 讲 §4.3 的 IWAE,这里的隐变量是 uu):

RealNVP(8 个耦合层)参数k=1k = 1:比真实多 bitk=16k = 16k=128k = 128
均匀去量化92 万18.9812.6210.99
变分去量化104 万7.945.304.51

(对照:第 3 讲 FVSBN 4.65、MADE 3.71、GRU 0.83;第 6 讲最好的 VAE 2.19;独立像素 9.88。)

  • 均匀去量化的 RealNVP 很差——比独立像素还差。y=x+uy = x + u 的真实密度在每个单位立方体里是平的,在边界上突变;光滑的可逆变换很难做出这种”台阶”,密度会漏到相邻的立方体里。Eu[log⁡p(x+u)]\mathbb{E}_u[\log p(x + u)] 和 log⁡P(x)\log P(x) 的差距,恰好就是”流在立方体里的形状”和均匀分布之间的 KL。
  • 变分去量化让 q(u∣x)q(u \mid x) 去迁就流擅长的形状,界紧了很多(k = 128 时 4.51),但仍不如 VAE 和好的自回归模型。对这种”少量离散配置 + 独立噪声”的二值数据,连续的流不是自然的选择;在自然图像上(像素有 256 个取值,“台阶”相对小得多)流表现好得多。
  • 第 4 部分:2,000 个样本(向下取整回到 0/1)在真实分布下的平均 −log⁡2p-\log_2 p 是 34.1(真实数据约 25.5,VAE 的样本约 31.7)——有一部分合法的形状,很多带着多余或缺失的像素。

8. 流模型小结 · Summary of flows

slide 35:

  • 通过变量替换,把简单分布变成更复杂的分布;
  • 变换的雅可比要有好算的行列式,才能高效地学习和估计密度;
  • 正向、反向变换的计算有取舍。

把到目前为止的三个似然模型家族放在一起:

自回归模型(第 3 讲)VAE(第 5–6 讲)归一化流(第 7–8 讲)
似然精确下界(ELBO);IWAE 估计偏低精确
采样顺序,nn 步一步(解码)一步(耦合层、IAF)或 nn 步(MAF)
隐表示没有有,低维、可压缩,需要编码器(近似后验)有,确定、精确,但维数 = 数据维数
结构限制必须选顺序后验近似误差;后验坍塌必须可逆、雅可比便宜;不能改变拓扑;离散数据要去量化
像素世界上(比真实多 bit)GRU 0.83最好的 2.194.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

  1. NICE 加性耦合:xB=zB+mθ(zA)x_B = z_B + m_\theta(z_A),mθm_\theta 任意、不用求逆,det⁡=1\det = 1。体积不变是硬限制:拟合窄高斯时 KL 卡在理论下限 3.605 附近;缩放层解决它。
  2. RealNVP 仿射耦合:xB=zB⊙eαθ(zA)+μθ(zA)x_B = z_B \odot e^{\alpha_\theta(z_A)} + \mu_\theta(z_A),log⁡det⁡=∑α\log\det = \sum\alpha,每层按条件缩放;8 层拟合双月牙 KL 0.037。掩码要交替;图像用棋盘格。隐空间插值用 cos / sin 保持在球壳附近。
  3. 连续自回归模型就是流。MAF:求密度一次(MADE),采样 nn 步;IAF:采样一次,给外来数据求密度 nn 步,给自己的样本求密度一次。二者互为逆(x、z 对调)。D=256D = 256 时顺序方向慢近 200 倍。耦合层(两方向都快)vs 自回归流(更灵活)。
  4. Parallel WaveNet:MLE 训练 MAF 老师,最小化 DKL(s∥t)D_{\mathrm{KL}}(s \Vert t) 蒸馏 IAF 学生,所需的三样东西都快。玩具音频上学生按反向 KL 很好(1.53),按前向 KL 很糟(15% 的真实序列几乎不可能)——样本缩水,反向 KL 的模式寻找。
  5. 高斯化流:最大似然 = 让 f−1f^{-1}(数据) 像高斯;一维用 Φ−1∘F\Phi^{-1}\circ F;高维用”逐维高斯化 + 旋转”反复迭代。贪心的非参数版本训练集 KL 一路下降,新样本 KL 在 L = 4 最好后回升。
  6. 去量化:流不能直接拟合离散数据(似然无界);Eu[log⁡p(x+u)]\mathbb{E}_u[\log p(x+u)] 是 log⁡P(x)\log P(x) 的下界。像素世界上均匀去量化很松(19 bit),变分去量化 + 重要性加权收紧到 4.5 bit,仍不如 VAE(2.2)和 GRU(0.83)。
  7. 三个似然家族各有取舍:精确似然 / 快速采样 / 有用的隐表示,没有一个能全部做好。

11. 常见误区 · Common pitfalls

  1. “耦合层只变换一半坐标,所以表达力只有一半。” 交替掩码(或层间置换)让每个坐标都被反复变换;表达力来自层数和条件网络(§3.3)。但若所有层都用同一个掩码,A 组永远不变(练习 3)。
  2. “加性耦合层也能任意改变密度。” 它体积不变:qq 的密度不会超过先验密度的最大值(§2.2)。需要缩放层或仿射耦合。
  3. “MAF 和 IAF 是两种不同的模型。” 它们是同一种变换的两个方向(§4.4);区别只在”哪个方向用 MADE 并行算”。
  4. “IAF 不能求密度。” 能,只是给外来数据求密度要顺序算;给自己的样本求密度和采样一样快(§4.3)——这是蒸馏能成立的关键。
  5. “蒸馏出的学生和老师是同一个分布。” 反向 KL 蒸馏让学生”宁缺毋滥”:生成质量好,却可能把真实数据的尾部判为几乎不可能(§5.2)。
  6. “把训练数据变得越像高斯,模型就越好。” 贪心的高斯化流可以把训练数据变得很像高斯,同时在新数据上越来越差(§6.3)。
  7. “直接用流去拟合离散的像素值就行。” 似然会无界、训练不稳定(§7.1);要去量化,并且报告的是下界。
  8. “流的似然是精确的,所以流在像素数据上的 bits 一定比 VAE 好。” 去量化引入的界可能很松(§7.4:均匀去量化比独立像素还差)。精确的是连续密度 p(y)p(y),不是离散的 P(x)P(x)。
  9. “耦合层既然快,就总比自回归流好。” 自回归流每一维以前面所有维为条件,更灵活;选择取决于你更在乎采样速度还是密度估计的质量(§4.5)。

12. 练习 · Exercises

练习 1(加性耦合) 证明加性耦合层的雅可比是 (I0∗I)\begin{pmatrix} I & 0 \\ \ast & I\end{pmatrix},行列式为 1。为什么反向变换里可以直接用 mθ(x1:d)m_\theta(x_{1:d})?如果把 mθm_\theta 的输入换成 zd+1:nz_{d+1:n} 的一部分,会出什么问题?

参考答案

x1:d=z1:dx_{1:d} = z_{1:d} 给出左上 II、右上 0(x1:dx_{1:d} 不依赖 zd+1:nz_{d+1:n});xd+1:n=zd+1:n+m(z1:d)x_{d+1:n} = z_{d+1:n} + m(z_{1:d}) 对 zd+1:nz_{d+1:n} 的导数是 II,对 z1:dz_{1:d} 的导数是 ∂m/∂z1:d\partial m/\partial z_{1:d}(左下 ∗\ast)。下三角、对角线全 1,行列式 1。反向时 x1:d=z1:dx_{1:d} = z_{1:d} 已知,所以 m(z1:d)=m(x1:d)m(z_{1:d}) = m(x_{1:d}) 可以直接算。如果 mm 依赖被变换的那部分,xd+1:n=zd+1:n+m(zd+1:n,… )x_{d+1:n} = z_{d+1:n} + m(z_{d+1:n}, \dots) 就成了一个隐式方程,求逆要迭代;雅可比的右下块也不再是 II,行列式不再免费。

练习 2(仿射耦合的 log det) 写出仿射耦合层反向变换的 log⁡∣det⁡∂z/∂x∣\log|\det \partial z/\partial x|。如果 αθ\alpha_\theta 不加限制,训练初期可能出什么问题?代码里怎样处理?

参考答案

zB=(xB−μ(xA))e−α(xA)z_B = (x_B - \mu(x_A))e^{-\alpha(x_A)},log⁡∣det⁡∣=−∑i∈Bαθ(xA)i\log|\det| = -\sum_{i \in B}\alpha_\theta(x_A)_i。α\alpha 很大时 eαe^\alpha 会数值溢出,一步梯度就可能把某个尺度推到极端,损失变成 nan。代码里用 α=scale⋅tanh⁡(⋅)\alpha = \text{scale}\cdot\tanh(\cdot) 把它限制在一个可学习的范围内,并把条件网络的最后一层初始化为 0,让每层一开始是恒等变换(RealNVP、Glow 都有类似的做法)。

练习 3(掩码必须交替) 设所有耦合层都用同一个掩码(A 组不变)。证明整个流对 A 组是恒等变换。这会让模型的边缘分布 p(xA)p(x_A) 是什么?

参考答案

每一层都保持 xA=zAx_A = z_A,复合以后仍然 xA=zAx_A = z_A,所以 p(xA)=pZ(zA)=N(0,I)p(x_A) = p_Z(z_A) = \mathcal{N}(0, I)——无论条件网络多强,A 组的边缘分布永远是标准高斯。交替掩码(或在层间置换坐标)让每个坐标轮流”做条件”和”被变换”。

练习 4(MAF 的对数似然) 写出单层 MAF 的 log⁡p(x)\log p(x),用 μi(x<i)\mu_i(x_{<i})、αi(x<i)\alpha_i(x_{<i}) 表示。它和”高斯自回归模型”的对数似然 ∑ilog⁡N(xi;μi,e2αi)\sum_i \log\mathcal{N}(x_i; \mu_i, e^{2\alpha_i}) 相同吗?

参考答案

zi=(xi−μi)e−αiz_i = (x_i - \mu_i)e^{-\alpha_i},log⁡p(x)=∑i[log⁡N(zi;0,1)−αi]=∑i[−(xi−μi)22e2αi−αi−12log⁡2π]\log p(x) = \sum_i\left[\log\mathcal{N}(z_i; 0, 1) - \alpha_i\right] = \sum_i\left[-\frac{(x_i - \mu_i)^2}{2e^{2\alpha_i}} - \alpha_i - \frac{1}{2}\log 2\pi\right],这正是 ∑ilog⁡N(xi;μi,e2αi)\sum_i\log\mathcal{N}(x_i; \mu_i, e^{2\alpha_i})。两种写法是同一个模型:流的视角给了它一个可以叠加多层、可以换顺序的框架(slide 17)。

练习 5(IAF 是 MAF 的逆) MAF 的反向变换是 z=(x−μ(x))e−α(x)z = (x - \mu(x))e^{-\alpha(x)}。证明:若 IAF 的条件网络输出 μ′(y)=−μ(y)e−α(y)\mu'(y) = -\mu(y)e^{-\alpha(y)}、α′(y)=−α(y)\alpha'(y) = -\alpha(y),则 IAF 的正向变换 x′=yeα′(y)+μ′(y)x' = y e^{\alpha'(y)} + \mu'(y) 恰好等于把 MAF 反向变换里的 xx 换成 yy。μ′\mu'、α′\alpha' 还满足自回归结构吗?

参考答案

ye−α(y)−μ(y)e−α(y)=(y−μ(y))e−α(y)y e^{-\alpha(y)} - \mu(y)e^{-\alpha(y)} = (y - \mu(y))e^{-\alpha(y)},正是 MAF 反向公式。μi′\mu'_i、αi′\alpha'_i 是 μi\mu_i、αi\alpha_i 的逐元素函数,而 μi,αi\mu_i, \alpha_i 只依赖 y<iy_{<i},所以 μi′,αi′\mu'_i, \alpha'_i 也只依赖 y<iy_{<i}——仍是自回归的(代码 02 第 1 部分的 IAFFromMAF)。

练习 6(蒸馏目标的分解) 证明 DKL(s∥t)=−H(s)−Es[log⁡t(x)]D_{\mathrm{KL}}(s \Vert t) = -H(s) - \mathbb{E}_s[\log t(x)]。如果只最大化 Es[log⁡t(x)]\mathbb{E}_s[\log t(x)](不要熵项),学生会变成什么样?这和 §5.2 的”缩水”有什么关系?

参考答案

DKL(s∥t)=Es[log⁡s]−Es[log⁡t]=−H(s)−Es[log⁡t]D_{\mathrm{KL}}(s \Vert t) = \mathbb{E}_s[\log s] - \mathbb{E}_s[\log t] = -H(s) - \mathbb{E}_s[\log t]。只最大化 Es[log⁡t]\mathbb{E}_s[\log t],学生会把所有样本都放到老师密度最大的那一点(坍塌成一个点,熵 →−∞\to -\infty)。熵项阻止坍塌,但它对”覆盖老师的全部尾部”没有强烈的要求——学生缩水一点,Es[log⁡t]\mathbb{E}_s[\log t] 会变大(样本更集中在老师的高密度区),熵变小,两者可以在一个比老师更窄的分布上取得平衡。这就是反向 KL 低估方差的来源。

练习 7(一维高斯化的雅可比) z=Φ−1(F(x))z = \Phi^{-1}(F(x))。证明 dz/dx=p(x)/φ(z)dz/dx = p(x)/\varphi(z),并由此证明 log⁡N(z)+log⁡∣dz/dx∣=log⁡p(x)\log \mathcal{N}(z) + \log|dz/dx| = \log p(x)——一维高斯化是一个”精确”的流。

参考答案

Φ(z)=F(x)\Phi(z) = F(x),两边对 xx 求导:φ(z)dzdx=p(x)\varphi(z)\frac{dz}{dx} = p(x),所以 dzdx=p(x)φ(z)\frac{dz}{dx} = \frac{p(x)}{\varphi(z)}。log⁡φ(z)+log⁡p(x)φ(z)=log⁡p(x)\log\varphi(z) + \log\frac{p(x)}{\varphi(z)} = \log p(x)。流给出的密度恰好就是真实密度——前提是 FF 精确已知。用核密度估计的 FF 时,流的密度就是核密度估计(代码 04 的 MarginalGaussianization 里 log det = log f − log φ(z))。

练习 8(去量化的下界) 设 pp 是 RD\mathbb{R}^D 上的连续密度,P(x)=∫[0,1)Dp(x+u) duP(x) = \int_{[0,1)^D}p(x + u)\,du,x∈ZDx \in \mathbb{Z}^D。(a) 证明 ∑xP(x)=1\sum_x P(x) = 1。(b) 证明 Eu∼U[0,1)D[log⁡p(x+u)]≤log⁡P(x)\mathbb{E}_{u \sim U[0,1)^D}[\log p(x + u)] \leq \log P(x),以及对任意 q(u∣x)q(u \mid x),Eq[log⁡p(x+u)−log⁡q(u∣x)]≤log⁡P(x)\mathbb{E}_q[\log p(x+u) - \log q(u \mid x)] \leq \log P(x)。等号什么时候成立?

参考答案

(a) 单位立方体 x+[0,1)Dx + [0, 1)^D(x∈ZDx \in \mathbb{Z}^D)恰好铺满 RD\mathbb{R}^D、互不重叠,∑xP(x)=∫RDp=1\sum_x P(x) = \int_{\mathbb{R}^D}p = 1。(b) P(x)=Eu∼q[p(x+u)q(u∣x)]P(x) = \mathbb{E}_{u \sim q}\left[\frac{p(x+u)}{q(u|x)}\right],由 Jensen(log 凹),log⁡P(x)≥Eq[log⁡p(x+u)q(u∣x)]\log P(x) \geq \mathbb{E}_q\left[\log\frac{p(x+u)}{q(u|x)}\right];均匀分布 q=1q = 1 是特例。等号当且仅当 p(x+u)/q(u∣x)p(x + u)/q(u \mid x) 对 uu 是常数,即 q(u∣x)=p(x+u)/P(x)q(u \mid x) = p(x + u)/P(x)——”qq 和流在立方体里的形状一致”。均匀去量化要求流在每个立方体里是平的,所以很松(§7.4)。

练习 9(动手:换一种掩码) 在 05_dequantization.py 的 train_pixel_flow 里,把棋盘格掩码换成 [half_mask(64, True), half_mask(64, False)](上下一半)。预测均匀去量化那一行的数字会变好还是变差。

参考答案(预测的思路)

上下一半的掩码让下半张以上半张为条件、反之亦然;每层的条件信息离被变换的像素较远,局部的笔画结构(相邻像素强相关)更难利用,可能会变差。但像素世界的结构是”整个形状”,上下两半也有很强的依赖(例如方框的上边和下边),差别未必大。具体数字以你的运行为准。

练习 10(为什么不用前向 KL 蒸馏) 如果改用 DKL(t∥s)=Ex∼t[log⁡t(x)−log⁡s(x)]D_{\mathrm{KL}}(t \Vert s) = \mathbb{E}_{x \sim t}[\log t(x) - \log s(x)] 训练学生,每一步需要计算什么?用 MAF 老师和 IAF 学生,哪些操作是慢的?它和”直接用老师的样本对学生做最大似然”是什么关系?

参考答案

需要老师的样本(MAF 采样:顺序,nn 步)和学生给这些样本的密度(IAF 给外来数据求密度:顺序,nn 步)——两样都慢,训练成本和直接训练一个自回归模型差不多,失去了 Parallel WaveNet 的意义。log⁡t\log t 不依赖学生,所以最小化 DKL(t∥s)D_{\mathrm{KL}}(t \Vert s) 等价于最大化 Ex∼t[log⁡s(x)]\mathbb{E}_{x \sim t}[\log s(x)]——就是”用老师的样本对学生做最大似然”。它会让学生覆盖老师的全部(模式覆盖),没有缩水的问题,但每一步都很慢。


13. 延伸阅读 · Further reading

原课材料

耦合层与自回归流

  • 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

到这里,我们已经有了三个基于似然的模型家族,它们都在最小化 DKL(pdata∥pθ)D_{\mathrm{KL}}(p_{\text{data}} \Vert p_\theta)(或它的下界)。可第 4 讲就提醒过:似然高不等于样本好;第 6 讲看到 ELBO 更紧也不保证样本更好;本讲看到流在像素世界上似然不错、样本却有不少多余的像素。第 9 讲(原课 Lecture 9,GANs)换一个思路:

  • 不再要求模型能算出 pθ(x)p_\theta(x),只要求能采样(一个”隐式”模型:z→Gθ(z)z \to G_\theta(z));
  • 用两样本检验来比较两个分布:训练一个判别器去区分真实样本和生成样本(第 1 讲代码 05 的”似然 vs 判别器”);
  • 生成器和判别器的极小极大博弈,最优判别器,以及它和 Jensen–Shannon 散度的关系。
← 返回课程目录