Normalizing Flows
归一化流通过可逆层将简单噪声映射为复杂数据,因此同一个模型既能采样,也能计算精确似然。了解其工作原理。
归一化流是一种生成式 AI模型,它通过一系列可逆、可微函数,将简单的基础分布(通常是标准高斯分布)转换为复杂的数据分布。由于每一层都可以反向运行,且其对体积的影响可以精确计算,单个流就能完成大多数生成模型无法同时完成的两项任务:通过让噪声正向通过各层来生成新样本,以及通过让观测数据点反向传回基础分布来计算其精确似然。Esteban Tabak 及其同事于 2010 年和 2013 年提出了用于密度估计的流;DeepMind 的 Danilo Rezende 和 Shakir Mohamed 则在 ICML 2015 上发表的 Variational Inference with Normalizing Flows 中将这一名称引入深度学习。“归一化”指的是将数据分布转换为正态分布(即高斯分布),与批归一化无关。
变量替换公式#
如果可逆函数 f 将数据点 x 映射为一个潜在点 z = f(x),那么数据的对数似然为 log p(x) = log p_z(f(x)) + log |det J|,其中 J 是 f 的雅可比矩阵,行列式衡量 f 在 x 附近对体积的拉伸或压缩程度。对于一个包含 D 个变量的一般函数,计算该行列式需要约 D³ 次运算;对于包含数十万个维度的图像而言,这远远太慢。因此,流层会设计成具有三角雅可比矩阵,其行列式就是对角元素的乘积。堆叠多个这样的层会组合它们的变换,并将它们的对数行列式相加;训练时则直接最大化训练数据的对数似然。
RealNVP 的仿射耦合层是经典设计。输入的一半保持不变,并送入一个小型神经网络,由它为另一半设置缩放和平移,如这个 PyTorch 层所示:
import torch
from torch import nn
torch.manual_seed(0)
# Affine coupling layer (RealNVP): x1 passes through unchanged and sets the scale and shift for x2
net = nn.Sequential(nn.Linear(2, 32), nn.Tanh(), nn.Linear(32, 4))
def coupling(x):
"""Map data x to z and return log|det J|, which is just the sum of the log-scales."""
x1, x2 = x.chunk(2, dim=-1)
log_s, t = net(x1).chunk(2, dim=-1)
return torch.cat([x1, x2 * log_s.exp() + t], dim=-1), log_s.sum(dim=-1)
x = torch.randn(4)
z, log_det = coupling(x)
jacobian = torch.autograd.functional.jacobian(lambda v: coupling(v)[0], x)
print(f"log|det J|: {log_det:.4f} from the formula, {torch.logdet(jacobian):.4f} from the full 4x4 Jacobian")
# Inverse: z1 equals x1, so the same scale and shift can be recomputed and undone
z1, z2 = z.chunk(2)
log_s, t = net(z1).chunk(2)
x_rec = torch.cat([z1, (z2 - t) * (-log_s).exp()])
print(f"Largest reconstruction error: {(x_rec - x).abs().max():.1e}")简化公式和完整雅可比矩阵都给出 0.1489 的对数行列式;逆变换恢复输入时的误差在 1.2e-07 以内,这是 float32 的舍入误差。层内的网络无需求逆,因此可以任意复杂。
流模型架构#
- 耦合流: Laurent Dinh 及其同事提出的 NICE(2014)和 RealNVP(2016)会交替变换输入的两半;OpenAI 的 Glow(2018)加入了可学习的可逆 1 x 1 卷积,并生成逼真的 256 x 256 人脸。采样和密度评估都很快。
- 自回归流: 根据前面的维度对每个维度进行条件变换。掩码自回归流只需一次前向计算即可评估密度,但采样时一次只能生成一个维度;逆自回归流则相反。Apple 的 TarFlow(2024)在图像块上堆叠自回归 Transformer 模块,是首个生成样本质量可与扩散模型媲美的独立流模型。
- 连续流: 将变换定义为常微分方程的解,从而摆脱层设计限制;FFJORD(2018)使用随机迹估计器追踪对数密度的变化。
应用场景#
- 异常检测: DifferNet(2021)、CFLOW-AD 和 FastFlow 在无缺陷产品图像上拟合预训练卷积神经网络的特征,并将低似然图像标记为缺陷图像。FastFlow 报告称,在 2021 年的 MVTec AD 工业检测基准上,异常检测 AUC 达到 99.4%。
- 语音合成: NVIDIA 的 WaveGlow(2018)通过单次并行处理,从梅尔频谱图生成语音音频。
- 科学采样: Frank Noé 及其同事提出的玻尔兹曼生成器(2019)会对分子和蛋白质的平衡状态进行采样,并利用精确似然重新加权样本,使其符合真实的物理分布。
这些检测器之所以对特征而非像素建模,是因为 Eric Nalisnick 及其同事在 2019 年证明:在 CIFAR-10 照片上训练的 Glow 模型,会给从未见过的 SVHN 门牌号图像赋予更高似然;后续研究发现,这是因为流模型更多地对局部像素相关性而非图像内容建模。对于缺陷检测,流模型的输入可以是任意预训练主干网络生成的嵌入:Ultralytics YOLO26 的 embed 方法会为每张图像返回一个平均池化特征向量,默认取自检测头之前的那一层。










