第 16 章 归一化流(Normalizing flows)

返回目录

本章一句话:归一化流用一串可逆的网络层,把一个简单的概率分布(通常是标准正态)一步步“变形”成复杂的数据分布;借助变量替换公式,它既能采样生成新样本,又能精确算出任意样本的似然。

读这章的收获:理解变量替换公式 \(Pr(x)=Pr(z)\left|\det\frac{\partial z}{\partial x}\right|\) 为什么是归一化流的心脏,搞清楚雅可比行列式扮演什么角色,明白为什么网络层必须“既好求逆、又好算雅可比”,并认识耦合流、自回归流、残差流和多尺度结构这几种主力构件。


本章速览

  • 核心思想:从一个简单可处理的基分布 \(Pr(z)\) 出发,用函数 \(x=f[z,\phi]\) 把它变成想要的数据分布 \(Pr(x)\)。采样很简单——抽一个 \(z^*\),过一遍网络得到 \(x^*=f[z^*,\phi]\)。
  • 变量替换公式:变形会拉伸或压缩空间。被拉伸处概率密度变低,被压缩处变高,靠的是雅可比行列式来记账,保证总面积(体积)恒为 1。
  • 两个方向:前向 \(x=f[z,\phi]\) 叫生成方向(用来采样);逆向 \(z=f^{-1}[x,\phi]\) 叫归一化方向(用来算似然、训练)。所以 \(f\) 必须可逆。
  • 四条硬要求:网络层要 ① 足够表达力、② 可逆(双射)、③ 逆映射好算、④ 雅可比行列式好算。后两条决定了能不能高效训练。
  • 主力构件:线性流、逐元素流(简单但不够强)→ 组合出更强的耦合流自回归流残差流。它们的共同诀窍是让雅可比变成三角阵,行列式 = 对角线乘积。
  • 采样 vs. 训练的取舍:掩码自回归流学得快但采样慢;逆自回归流采样快但学得慢;可用“师生蒸馏”兼得。
  • 多尺度流:潜空间必须和数据同维,但可把潜向量分块、在不同深度逐步引入,加快采样与密度估计。
  • 独门优势:在本书四大生成模型里,归一化流是唯一能算出新样本精确对数似然的(GAN 不给概率,VAE 和扩散模型只给下界)。代表作 GLOW 能合成人脸、做潜空间插值。

16.1 一维示例

归一化流是概率生成模型:它给训练数据拟合一个概率分布。我们先用最简单的一维情形把直觉讲透。

目标是建模一个一维分布 \(Pr(x)\)。做法是:先选一个简单又好处理的基分布 \(Pr(z)\)(比如标准正态),再施加一个函数 \(x=f[z,\phi]\),调参数 \(\phi\) 让 \(Pr(x)\) 长成我们想要的样子。

生成新样本很容易:从基分布抽一个 \(z^*\),过一遍函数得到 \(x^*=f[z^*,\phi]\),就完事了。

配图直觉:左边是一条标准正态曲线(基分布,自变量 \(z\))。中间有一条弯曲的函数曲线 \(x=f[z,\phi]\)。把基分布上抽到的 \(z\) 点沿着这条曲线“折射”过去,落到右边横轴上,右边就堆出了一个新的、复杂的分布 \(Pr(x)\)。

16.1.1 怎么算一个点的概率

采样容易,算概率却麻烦。把函数 \(f[z,\phi]\) 作用在已知密度的随机变量 \(z\) 上,会发生什么?

关键直觉:被函数拉伸的区域,概率密度下降;被压缩的区域,概率密度上升——这样变形后曲线下的总面积才能保持为 1。拉伸还是压缩,取决于函数斜率(梯度)的大小:输入的小变化引起输出的大变化 = 拉伸;引起的小变化 = 压缩。

配图直觉:把基分布按等间隔切成一条条竖条。每条竖条里的“概率质量”在变形前后必须守恒。某条竖条经过函数里斜率大于 1 的一段,就被横向拉宽,于是它对应的新分布那块必须变矮,才能保持面积不变;反之在斜率小于 1 的地方,新分布就变高

写成公式,数据 \(x\) 在变形后分布下的概率是:

\[ Pr(x|\phi)=\left|\frac{\partial f[z,\phi]}{\partial z}\right|^{-1}\cdot Pr(z), \]

其中 \(z=f^{-1}[x,\phi]\) 是“生成出 \(x\) 的那个潜变量”。\(Pr(z)\) 是它在基分布下的原始概率,再被导数的大小修正一下:导数大于 1,概率变小;小于 1,概率变大。

16.1.2 前向与逆向映射

这里出现了两个方向:

  • 采样,需要前向映射 \(x=f[z,\phi]\);
  • 算似然,需要逆向映射 \(z=f^{-1}[x,\phi]\)。

所以必须把 \(f[z,\phi]\) 选得可逆。前向映射有时叫生成方向(generative direction);由于基分布通常取标准正态,逆向映射就把复杂的 \(x\) 分布“拉回”成正态的 \(z\) 分布,因此叫归一化方向(normalizing direction)——这正是“归一化流”名字的由来。

16.1.3 学习(训练)

训练就是找参数 \(\phi\),让训练数据 \(\{x_i\}_{i=1}^I\) 的似然最大,等价于让负对数似然最小:

\[ \hat\phi=\underset{\phi}{\arg\min}\left[\sum_{i=1}^{I}\left(\log\left|\frac{\partial f[z_i,\phi]}{\partial z_i}\right|-\log Pr(z_i)\right)\right]. \]

这里假设数据独立同分布,并代入了上面的变量替换公式。直观上:训练就是在让“变形后落到真实数据点上的概率”尽量大。


16.2 一般情形(变量替换 / 雅可比)

现在把一维推广到多维,并且让变换由一个深度神经网络来定义。

考虑作用在 \(z\in\mathbb{R}^D\) 上的函数 \(x=f[z,\phi]\),\(z\) 的基分布是 \(Pr(z)\),\(f\) 是一个深度网络,结果 \(x\in\mathbb{R}^D\) 有了新分布。采样照旧两步:① 从基分布抽 \(z^*\);② 过网络得 \(x^*=f[z^*,\phi]\)。

仿照一维,样本似然为:

\[ Pr(x|\phi)=\left|\det\frac{\partial f[z,\phi]}{\partial z}\right|^{-1}\cdot Pr(z),\qquad z=f^{-1}[x,\phi]. \]

写成更常见的“按 \(x\) 求导”的形式就是本章的核心公式(这是与上式等价的标准变量替换写法,因为 \(\partial z/\partial x=(\partial x/\partial z)^{-1}\)):

\[ Pr(x)=Pr(z)\left|\det\frac{\partial z}{\partial x}\right|. \]

第一项里出现的是 \(D\times D\) 雅可比矩阵 \(\partial f[z,\phi]/\partial z\) 的行列式(第 \((i,j)\) 位置是 \(\partial f_j/\partial z_i\))。一维时用绝对导数衡量“面积”的变化,多维时就用雅可比行列式的绝对值衡量“体积”的变化。第二项还是潜变量在基分布下的概率。

一句话记住:雅可比行列式 = 这个变换在某点把体积放大/缩小了多少倍。它就是多维版的“拉伸/压缩记账员”。

16.2.1 用深度网络做前向映射

实际中,前向映射 \(f[z,\phi]\) 由一串层 \(f_k[\cdot,\phi_k]\) 复合而成:

\[ x=f[z,\phi]=f_K\big[f_{K-1}[\dots f_2[f_1[z,\phi_1],\phi_2]\dots,\phi_{K-1}],\phi_K\big]. \]

逆向映射(归一化方向)就是把每层的逆按相反顺序复合起来:

\[ z=f^{-1}[x,\phi]=f_1^{-1}\big[f_2^{-1}[\dots f_K^{-1}[x,\phi_K]\dots,\phi_2],\phi_1\big]. \]

基分布通常取多元标准正态(零均值、单位协方差)。于是每个逆层的作用,就是把数据密度一点点“流(flow)”向这个正态分布——这就是“归一化流”里“流”的含义。

配图直觉:最左是标准正态,经过 \(f_1,f_2,\dots\) 一层层变形,逐渐变成右边复杂的模型密度。反过来看,每层的逆把复杂密度一步步“归一化”回正态。

链式复合带来一个极好的性质:前向映射的雅可比是各层雅可比的连乘,而行列式可乘——所以总的雅可比行列式 = 各层雅可比行列式之积:

\[ \left|\det\frac{\partial f[z,\phi]}{\partial z}\right|=\prod_{k}\left|\det\frac{\partial f_k}{\partial f_{k-1}}\right|. \]

逆映射的雅可比行列式则是前向的倒数。训练仍用负对数似然准则:

\[ \hat\phi=\underset{\phi}{\arg\min}\left[\sum_{i=1}^{I}\left(\log\left|\det\frac{\partial f[z_i,\phi]}{\partial z_i}\right|-\log Pr(z_i)\right)\right],\qquad z_i=f^{-1}[x_i,\phi]. \]

16.2.2 对网络层的四条要求(desiderata)

理论很漂亮,但要真能用,我们需要的网络层 \(f_k\) 得具备以下四点性质(第 1 条是所有层合起来的集体属性,第 2–4 条是逐层都要满足的):

  1. 足够表达:所有层合起来要能把多元标准正态映射成任意密度。
  2. 可逆(双射):每层都是输入到输出的一一映射;若多个输入映到同一输出,逆映射就会有歧义。
  3. 逆映射高效:每次算似然都要求逆,训练时反复进行,必须有闭式解或快速算法。
  4. 雅可比行列式高效:前向或逆向的雅可比行列式都要能快速算出来。

后两条最棘手——下一节介绍的各种“流”,本质上都是在牺牲一点通用性、换取逆映射和雅可比行列式的可计算性


16.3 可逆网络层(各种“流”)

下面介绍不同的可逆层。先看两个简单但不够强的基础件——线性流逐元素流;它们再搭起更强的耦合流、自回归流、残差流

16.3.1 线性流(Linear flows)

形式为 \(f[h]=\beta+\Omega h\)。只要矩阵 \(\Omega\) 可逆,变换就可逆。但对一般的 \(\Omega\in\mathbb{R}^{D\times D}\),求逆和算行列式都要 \(O[D^3]\),维度一大就很贵。

给 \(\Omega\) 加特殊结构能提速,但通用性下降:

  • 对角矩阵:求逆和行列式都只要 \(O[D]\),但各维之间不交互。
  • 正交矩阵:好求逆、行列式固定,但不能对各维做缩放。
  • 三角矩阵:实用,用回代法求逆是 \(O[D^2]\),行列式 = 对角元素之积。

一个兼顾通用、好求逆、好算行列式的办法是直接用 LU 分解参数化:

\[ \Omega=PL(U+D), \]

其中 \(P\) 是预设的置换矩阵,\(L\) 是下三角,\(U\) 是对角为零的上三角,\(D\) 是补上对角元素的对角阵。这样求逆是 \(O[D^2]\),对数行列式 = \(L\) 和 \(D\) 对角线上绝对值取对数之和。

但线性流根本不够强:把线性函数 \(\beta+\Omega h\) 作用在正态分布上,结果还是正态分布(均值 \(\beta+\Omega\mu\)、协方差 \(\Omega\Sigma\Omega^T\))。所以单靠线性流永远没法把正态映成任意密度。

16.3.2 逐元素流(Elementwise flows)

既然线性流不够,就得上非线性。最简单的非线性流是逐元素流——对输入的每个分量分别施加同一个逐点非线性函数 \(f[\cdot,\phi]\):

\[ f[h]=\big[f[h_1,\phi],f[h_2,\phi],\dots,f[h_D,\phi]\big]^T. \]

由于第 \(d\) 个输入只影响第 \(d\) 个输出,雅可比是对角阵,行列式就是对角元素连乘:

\[ \left|\det\frac{\partial f[h]}{\partial h}\right|=\prod_{d=1}^{D}\left|\frac{\partial f[h_d]}{\partial h_d}\right|. \]

这个逐点函数可以是固定的可逆非线性(如 leaky ReLU,无参数),也可以是带参数的可逆单调函数。一个常见例子是分段线性函数:把输入域 \([0,1]\) 切成 \(K\) 个等宽小区间,每段给一个正的斜率参数 \(\phi_k\),只要这些参数为正且和为 1,函数就单调可逆,把 \([0,1]\) 映到 \([0,1]\)。实践中也常用样条来构造光滑单调(因而可逆)的函数。

配图直觉:横轴 \([0,1]\) 切成 5 段,每段一条小斜线首尾相接,整体是一条从 \((0,0)\) 升到 \((1,1)\) 的折线,单调上升所以可逆。

逐元素流是非线性的,但不混合各维,没法在变量间制造相关性。与线性流(会混维)交替使用能建模更复杂的变换;不过实践中逐元素流主要是当作下面耦合流的零件。

16.3.3 耦合流(Coupling flows)

耦合流把输入劈成两半 \(h=[h_1^T,h_2^T]^T\),然后这样定义:

\[ h_1'=h_1,\qquad h_2'=g\big[h_2,\phi[h_1]\big]. \]

也就是说,前一半原样照搬;后一半 \(h_2\) 经过一个可逆变换 \(g[\cdot,\phi]\)(比如逐元素流),而 \(g\) 的参数 \(\phi[h_1]\) 是前一半 \(h_1\) 的(任意复杂、不必可逆的)函数——通常用一个神经网络来算。

逆映射极其简单:因为 \(h_1=h_1'\) 直接知道,就能算出参数 \(\phi[h_1]\),再对后半应用逆变换:

\[ h_1=h_1',\qquad h_2=g^{-1}\big[h_2',\phi[h_1]\big]. \]

配图直觉:输入分上下两块。上块 \(h_1\) 直通到输出 \(h_1'\);同时 \(h_1\) 喂给一个网络算出参数 \(\phi\),用这些参数把下块 \(h_2\) 变换成 \(h_2'\)。逆过程反着走:上块直读 \(h_1\) → 算 \(\phi\) → 逆变换还原下块。

为什么雅可比好算?若 \(g\) 是逐元素流,雅可比是下三角阵:左上是单位阵,右下是逐元素变换的导数。行列式 = 这些对角元素之积,飞快。

不过这种结构每层只变换“后半依赖前半”,比较受限。补救办法是在层与层之间用置换矩阵把各维随机打乱,这样每个变量最终都会被其他所有变量变换到。置换矩阵很难学,所以一般随机初始化后冻结。对图像这类结构化数据,则把通道分成两半,用 1×1 卷积在层间混合通道。

16.3.4 自回归流(Autoregressive flows)

自回归流是耦合流的推广:把每一维都当成一个独立“块”。输出的第 \(d\) 维只依赖输入的前 \(d-1\) 维:

\[ h_d'=g\big[h_d,\phi[h_{1:d-1}]\big]. \]

这里 \(g[\cdot,\cdot]\) 叫变换器(transformer)(与第 12 章的 Transformer 层毫无关系),参数 \(\phi[\cdot]\) 叫条件器(conditioner)。变换器必须可逆,条件器可任意(通常是神经网络)。只要两者足够灵活,自回归流是通用逼近器,能表示任意概率分布。

配图直觉:输入、输出各画成竖排 4 个格子。\(h_1'\) 只由 \(h_1\) 变换;\(h_2'\) 由 \(h_2\) 变换、参数看 \(h_1\);\(h_3'\) 由 \(h_3\) 变换、参数看 \(h_1,h_2\)……前向时各输出互不依赖,可并行算。

前向可以用带掩码(mask)的网络一次并行算完所有输出——让位置 \(d\) 的参数只看前面位置,这叫掩码自回归流(masked autoregressive flow),原理和第 12.7.2 节的掩码自注意力很像:把“看未来”的连接剪掉。

但求逆没那么省力。前向是:

\[ h_1'=g[h_1,\phi],\quad h_2'=g[h_2,\phi[h_1]],\quad h_3'=g[h_3,\phi[h_{1:2}]],\quad h_4'=g[h_4,\phi[h_{1:3}]]. \]

求逆必须顺序进行:要算 \(h_2\) 得先知道 \(h_1\),要算 \(h_3\) 得先知道 \(h_1,h_2\)……

\[ h_1=g^{-1}[h_1',\phi],\quad h_2=g^{-1}[h_2',\phi[h_1]],\quad h_3=g^{-1}[h_3',\phi[h_{1:2}]],\quad\dots \]

因为 \(h_d\) 依赖前面已算出的结果,逆向无法并行,输入一大就很慢。

16.3.5 逆自回归流(Inverse autoregressive flows)

掩码自回归流定义在归一化(逆)方向:算似然时所走的方向可并行,所以学得快;但采样要走生成方向,每个变量逐个算,很慢。

反过来,如果把自回归流用在前向(生成)方向,那采样就快了,但算似然(即训练)变慢——这叫逆自回归流(inverse autoregressive flow)

鱼与熊掌怎么兼得?一个技巧是师生蒸馏:先训一个掩码自回归流当“老师”(学得快),再用它去训一个逆自回归流当“学生”(采样快)。这需要换一种“从另一个函数学、而不是从样本学”的训练方式(见 16.5.3)。

16.3.6 残差流:iRevNet

残差流借鉴残差网络。同样把输入分两半 \(h=[h_1^T,h_2^T]^T\),定义:

\[ h_1'=h_1+f_1[h_2,\phi_1],\qquad h_2'=h_2+f_2[h_1',\phi_2], \]

其中 \(f_1,f_2\) 不必可逆。逆映射只要把计算顺序反过来、加法变减法:

\[ h_2=h_2'-f_2[h_1',\phi_2],\qquad h_1=h_1'-f_1[h_2,\phi_1]. \]

配图直觉:两个残差块串联。第一块处理 \(h_2\) 再加上 \(h_1\);第二块处理上一步结果再加上 \(h_2\)。逆向时反序执行,每个“加”都换成“减”。

和耦合流一样,分块限制了表达力,所以层间也要置换让变量充分混合。这种结构很好求逆,但对一般的 \(f_1,f_2\) 雅可比行列式没有高效算法。即便如此它仍有用:因为网络可逆,前向时不必存各层激活值,可在反向传播时重算,从而把训练 \(K\) 层网络的内存从 \(O[K]\) 降到 \(O[1]\)。

16.3.7 残差流与压缩映射:iResNet

另一条思路是利用巴拿赫不动点定理(压缩映射定理):每个压缩映射都有不动点。压缩映射 \(f[\cdot]\) 满足

\[ \text{dist}\big[f[z'],f[z]\big]<\beta\cdot\text{dist}\big[z',z\big],\qquad 0<\beta<1. \]

把这种函数反复迭代(输出再喂回输入),就会收敛到 \(f[z]=z\) 的不动点。

配图直觉:在 \(z\)-\(f[z]\) 坐标里画一条斜率处处小于 1 的曲线和一条对角线 \(f[z]=z\)。从 \(z_0\) 出发求 \(z_1=f[z_0]\),再代回去迭代,台阶状地一步步逼近曲线与对角线的交点(不动点)。

这能用来求逆形如 \(y=z+f[z]\) 的方程:要找映到给定 \(y^*\) 的 \(z^*\),从任意 \(z_0\) 出发迭代 \(z_{k+1}=y^*-f[z_k]\) 即可收敛。同理可逆形如 \(h'=h+f[h,\phi]\) 的残差层——只要 \(f[h,\phi]\) 是压缩映射,即Lipschitz 常数小于 1。若激活函数斜率不超过 1,这等价于每个权重矩阵 \(\Omega\) 的最大奇异值小于 1;粗暴做法是裁剪权重让其绝对值够小。

雅可比行列式仍不好直接算,但它的对数可以用一串技巧近似。先用恒等式 \(\log|A|=\text{trace}[\log A]\),再把 \(\log\) 展成幂级数:

\[ \log\left|\det\left(I+\frac{\partial f}{\partial h}\right)\right|=\sum_{k=1}^{\infty}\frac{(-1)^{k-1}}{k}\,\text{trace}\left[\left(\frac{\partial f}{\partial h}\right)^k\right]. \]

即便截断,逐项算迹仍贵,于是再用 Hutchinson 迹估计器:对零均值、单位协方差的随机向量 \(\epsilon\),有

\[ \text{trace}[A]=\mathbb{E}\big[\epsilon^T A\,\epsilon\big]\approx\frac{1}{I}\sum_{i=1}^{I}\epsilon_i^T A\,\epsilon_i. \]

这样就能近似幂级数各项的迹,进而估出对数概率。


16.4 多尺度流(Multi-scale flows)

归一化流有个硬约束:潜空间 \(z\) 必须和数据空间 \(x\) 同维。可现实数据往往能用更少的底层变量描述。我们终归要引入全部维度,但让它们都从头到尾过完整个网络很浪费——于是有了多尺度流

在生成方向,多尺度流把潜向量分块 \(z=[z_1,z_2,\dots,z_N]\)。先只用一串与 \(z_1\) 同维的可逆层处理 \(z_1\);到某一层把 \(z_2\) 拼进来一起处理;如此继续,直到网络维度长到和数据 \(x\) 一样大。在归一化方向,网络从 \(x\) 的完整维度开始,每到当初引入 \(z_n\) 的那一层,就把对应那块直接拿去与基分布比对,不再往下处理。

配图直觉:潜向量像分批入场的乘客。\(z_1\) 先走完前面几层,途中 \(z_2\)、\(z_3\)……陆续加入合流,规模逐渐扩大到数据尺寸。逆过程把箭头反向:每块走到自己当初加入的位置就“提前下车”,成为 \(z_n\) 去对照基分布。

好处是:靠后才引入的维度不必经过全部层,密度估计和采样都更快


16.5 应用

下面讲三个应用:建模概率密度、用 GLOW 合成图像、以及用归一化流去逼近其他分布。

16.5.1 建模密度(精确似然)

本书四大生成模型里,归一化流是唯一能算出新样本精确对数似然的:GAN 不是概率模型;VAE 和扩散模型都只能给似然的下界

配图直觉:左边是一团二维玩具数据点,右边是 iResNet 学到的平滑密度热力图,高密度区正好压在数据点聚集处。

密度估计的一个用途是异常检测:先用归一化流拟合一份“干净”数据的分布,新样本若概率很低就标为离群点。但要小心——可能存在“概率很高却不属于典型集”的离群点(详见第 8 章关于典型集的讨论),不能只看概率值下结论。

16.5.2 合成(GLOW)

生成流 GLOW 是一个能合成高保真图像的归一化流模型,几乎用上了本章所有想法。从归一化方向看最好懂:

  • 输入是 256×256×3 的 RGB 图像张量。
  • 耦合层:把通道分两半,对其中一半的每个空间位置做仿射变换,而仿射参数由跑在另一半通道上的 2D 卷积网络算出。
  • 耦合层与 1×1 卷积交替(卷积用 LU 分解参数化)来混合通道。
  • 周期性地把每个 2×2 小块拼成一个位置、通道数变四倍,从而降分辨率
  • 它是多尺度流,过程中周期性抽走部分通道并入潜向量 \(z\)。
  • 图像是离散的(RGB 量化),直接训会让似然无上界地涨,所以给输入加噪声,叫去量化(dequantization)

为了采到更逼真的图,GLOW 从基分布的正幂次采样——偏向密度中心、避开尾部,类似 GAN 里的“截断技巧”。

配图直觉:一面墙的人脸采样图,质量不错但还不如 GAN/扩散模型锐利;另一组是“潜空间插值”:把左右两张真实人脸沿归一化方向投到潜空间,在两点间线性插值,再投回图像空间,得到一串平滑过渡的合理人脸。

值得一提:GLOW 的样本不如 GAN 和扩散模型。这究竟是可逆层的根本限制,还是仅仅因为投入这方向的研究更少,目前尚无定论。

16.5.3 逼近其他密度模型(师生)

归一化流还能学着生成样本去逼近一个已有的、易求值但难采样的密度。此时把归一化流 \(Pr(x|\phi)\) 称为学生,目标密度 \(q(x)\) 称为老师

诀窍在于:我们自己从学生采样 \(x_i=f[z_i,\phi]\),所以已知它们对应的潜变量 \(z_i\),不必求逆就能算出学生模型下的似然——于是即便是“求逆很慢”的掩码自回归流也能用。损失基于反向 KL 散度,鼓励学生与老师的似然一致:

\[ \hat\phi=\underset{\phi}{\arg\min}\;\text{KL}\!\left[\frac{1}{I}\sum_{i=1}^{I}\delta\big[x-f[z_i,\phi]\big]\;\Big\|\;q(x)\right]. \]

这与归一化流的常规用法正相反。常规用法是从未知分布的样本 \(x_i\) 出发、用极大似然建模 \(Pr(x_i,\phi)\),靠的是前向 KL 散度里的交叉熵项:

\[ \hat\phi=\underset{\phi}{\arg\min}\;\text{KL}\!\left[\frac{1}{I}\sum_{i=1}^{I}\delta[x-x_i]\;\Big\|\;Pr(x_i,\phi)\right]. \]

配图直觉:(a) 一堆训练数据;(b) 常规做法——调流模型让“数据→模型”的 KL 最小(等价于极大似然拟合);(c)–(d) 师生做法——调流模型让“流的样本 \(x_i\) → 目标密度”的 KL 最小。

这个技巧还能用来在 VAE 里建模后验(见第 17 章)。


本章小结

归一化流把一个基分布(通常是正态)变形成新的密度。它的独特优势是既能精确算样本似然、又能采样生成,代价是结构上的硬约束:每层都必须可逆——前向变换用来采样,逆向变换用来算似然。

为了高效训练(要反复算似然),雅可比行列式也必须能高效估计。这正是各种流设计的主线:用三角化、分块、链式连乘等手段,把雅可比行列式变得好算。不过即使雅可比算不动,可逆层本身也有价值——它能把训练 \(K\) 层网络的内存从 \(O[K]\) 降到 \(O[1]\)。

本章按“弱→强”过了一遍可逆层:线性流、逐元素流简单但表达力不足;耦合流、自回归流、残差流更强,各自在“逆映射好不好算、雅可比好不好算、能不能并行、能不能通用逼近”上做不同取舍。最后看到归一化流可用于精确密度估计、图像合成与插值(GLOW),以及用师生方式逼近其他分布。


关键术语对照

中文 English 一句话含义
归一化流 Normalizing flow 用可逆变换把简单分布变成复杂分布
基分布 Base density 简单可处理的起点分布(常用标准正态)
变量替换公式 Change of variables \(Pr(x)=Pr(z)\lvert\det\,\partial z/\partial x\rvert\)
雅可比(行列式) Jacobian (determinant) 衡量变换在某点放大/缩小体积的倍数
生成方向 Generative direction 前向 \(x=f[z]\),用来采样
归一化方向 Normalizing direction 逆向 \(z=f^{-1}[x]\),用来算似然
双射 Bijection 一一对应、可逆的映射
线性流 Linear flow \(f[h]=\beta+\Omega h\),单用表达力不足
逐元素流 Elementwise flow 逐分量施加同一可逆非线性,雅可比为对角阵
耦合流 Coupling flow 半数照搬、半数受其参数化变换,逆与雅可比都好算
自回归流 Autoregressive flow 第 \(d\) 维只依赖前 \(d-1\) 维,通用逼近器
掩码自回归流 Masked autoregressive flow 用掩码并行前向算似然,逆向需顺序
逆自回归流 Inverse autoregressive flow 采样快、训练慢,可由师生蒸馏得到
残差流 Residual flow 借鉴残差网络的可逆层(iRevNet / iResNet)
压缩映射 Contraction mapping Lipschitz<1,可用不动点迭代求逆
多尺度流 Multi-scale flow 潜向量分块、不同深度逐步引入,加速采样
去量化 Dequantization 给离散像素加噪,防止训练似然无上界增长
GLOW GLOW 用耦合层+1×1 卷积+多尺度的图像合成流模型

返回目录 | 上一章:第 15 章 生成对抗网络 | 下一章:第 17 章 变分自编码器