想象你是乐高拼装大师,桌上散落着成百上千个标准零件,目标是把它们拼成一只栩栩如生的恐龙。正向拼装必须按顺序进行:先装脊椎,再装腿,最后装头——每一块零件的位置都取决于前面已经装好的部分。而反向拆卸也同样可行:只要记录每一步的操作,就能沿着原路把恐龙还原成零件。标准化流(Normalizing Flow)就是教机器这样一张“双向说明书”:把简单零件(高斯噪声)通过一系列可逆步骤变成复杂成品(真实数据)。MAF(Masked Autoregressive Flow,掩码自回归流)则是这套说明书的“高效排版”——它用一块精密的遮罩告诉每个零件“你只能参考前面的零件号”,从而让“逆向拆解并核算概率”可以并行加速。这篇会讲清楚它的自回归结构、掩码设计、与 RealNVP / IAF 的差异,以及密度估计应用,帮你从原理上掌握这类可逆生成模型。
弄懂 MAF,等于拿到了整个标准化流家族的“放大镜”:它把可逆变换、自回归、掩码三大思想熔于一炉,后续的 RealNVP、IAF 都是它的变体或镜像。掌握它能让你在设计生成模型时心里有数——知道每一步快在哪里、慢在哪里、该怎么改造。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
MAF掩码矩阵:下三角自回归依赖 (借鉴MADE) \u9645\u53EF\u89C1\u6027\u77E9\u9635 (Mask)\u4E0B\u4E09\u89D2\u96C5\u53EF\u6BD4\u77E9\u9635MAF变换公式\u884C\u5217\u5F0F = \u4E0B\u4E09\u89D2\...
标准化流基础
乐高说明书的本质是“双向可逆”:每一页都记录了一块零件放在哪里,从第一页翻到最后一页是拼恐龙,从最后一页倒着翻回第一页是拆回零件。标准化流就是深度学习里的“双向说明书”——它用一个可逆函数 $f$,把潜在空间 $Z$ 里的简单分布(标准高斯噪声,相当于刚拆封的整齐零件)映射到数据空间 $X$ 里的复杂分布(真实数据,相当于拼好的成品)。函数 $f$ 是生成方向,它的逆 $f^{-1}$ 是编码方向,两者必须严格互逆,说明书才算合格。
既然是“可逆变换”,拆装前后的概率密度就不能凭空增减:某个区域的零件被拉伸了,单位面积里的密度自然会被稀释。雅可比行列式(Jacobian determinant)就是衡量这种“体积形变”的系数——它像一个弹簧秤,告诉你组装过程中每个局部空间被放大了多少倍。数学上,从 $z$ 到 $x$ 的概率关系由变量替换公式给出:
把多个可逆变换首尾串联($f = f_1 \circ f_2 \circ \cdots \circ f_K$),说明书就变成了“分步拼装手册”:每一层只负责一个小改动,合起来却能表达非常复杂的分布。这就像厚厚一本乐高图纸,每一页只画一个步骤,但翻完一整本就能拼出整只恐龙。标准化流的全部优雅之处,正在于每一层都严格可逆、每一层的概率修正都可以用链式法则累乘起来,最终得到精确的似然值。
- 逆映射定位先把数据 $x$ 通过逆映射 $f^{-1}$ 送回潜在空间,得到对应的 $z$
- 查表得密度在简单高斯分布上查 $z$ 的概率密度
- 体积伸缩修正乘以雅可比行列式的绝对值,修正可逆映射对空间体积的拉伸或压缩,保证概率积分恒为 1
MAF核心思想
普通乐高说明书是“固定座椅”:每个零件的坐标是死数字。但 MAF 的说明书是“条件式”的——第二个零件的位置由第一个零件的实际位置决定,第三个由前两个决定,以此类推。这种“后面的依赖前面”的结构,就是自回归(Autoregressive)。MAF 的全称是 Masked Autoregressive Flow,它的核心假设正是:数据空间第 $i$ 个维度的生成,只由前 $i-1$ 个维度控制。
为了让这个“条件依赖”既能表达复杂关系又保证可逆,MAF 采用仿射变换(affine transformation):每个维度先由神经网络读出前面维度的均值和标准差,再用标准噪声线性组合出当前维度。仿射形式是“可逆”的保证——就像记偏移量而非绝对坐标:拆卸时只要记住“手肘是在手臂基础上前移了几厘米”,就能从成品精确还原零件。数学上写作:
为什么要仿射而不是更复杂的任意函数?因为仿射变换反解时只需要一步除法:给定成品 $x$,立刻得到 $z_i = (x_i - \mu_i)/\sigma_i$。这种“线性可逆”是自回归流能精确计算似然的地基。把乐高比喻拉回来:MAF 每拼一块新零件,都会参考前面所有已经落位的零件位置,把它换算成“基准 + 受控偏移”,这既灵活又保证任何时候都能精确拆回原样。
- 条件均值$\mu_i(\mathbf{x}_{<i})$ 是网络根据前面 $i-1$ 个已生成维度算出的“基准位置”
- 条件标准差$\sigma_i(\mathbf{x}_{<i})$ 是网络输出的缩放系数,控制这一步随机扰动的幅度
- 标准噪声注入标准高斯变量 $z_i$ 先乘标准差再加均值,得到第 $i$ 个维度的实测值
掩码矩阵设计
要落实“后面的零件只能看前面”,做法是在神经网络的权重上盖一块遮罩布——把连接未来维度的通道全部挡住。这个思路来自 MADE(Masked Autoencoder for Distribution Estimation),MAF 直接借用了它:通过一个提前设计好的 0/1 掩码矩阵 $M$,与权重矩阵逐元素相乘(Hadamard 积),就能让网络从结构上满足自回归约束,而不需要修改任何反向传播逻辑。
掩码矩阵的构造规则非常朴素:输出神经元 $j$ 只允许接收输入神经元 $i < j$ 的信号,否则通道被置零。这就像在图纸上盖一块只露出“已拼部分”的挡板,未拼的未来区域全部用黑布盖上:
隐藏层同样需要设计掩码,常见技巧是给每个隐藏单元分配一个“连接度”(degree),并保证连接度沿网络单调递增,使信息只能从前往后流动。由于遮罩在训练前固定、训练中不变,反向传播时被遮住位置的梯度天然为零,等于“这些连接从未存在过”。乐高视角下,这块遮罩是整个 MAF 的“纪律委员”:它严格保证拼装顺序不被破坏,是自回归结构能够并行部署的结构前提。
- 上下标配对$M_{ji}$ 的第 $j$ 行是输出维度编号,第 $i$ 列是输入维度编号
- 通道放行当输入编号严格小于输出编号时,允许信息通过,对应“只看前面已拼好部分”
- 通道遮断当输入编号大于等于输出编号时,权重被强制置零,未来信息彻底无法泄漏
MAF计算流程
一张双向说明书,正向是拼装,逆向是拆解。MAF 最耐人寻味的地方在于:这两个方向的成本完全不对称。逆向“拆解算似然”极其快——一次前馈并行搞定;正向“拼装采样”却必须逐维串行——推一步、落一块零件。搞清楚这个方向差异,才算真正理解 MAF。
先看逆向。当输入是一整只成品恐龙(完整的 $x$)时,计算第 $i$ 维的潜变量 $z_i$ 需要 $\mu_i$ 和 $\sigma_i$,而它们只依赖 $\mathbf{x}_{<i}$——也就是输入里已经现成的前 $i-1$ 个维度。既然输入完整可见,所有 $\mu_i$、$\sigma_i$ 可以在同一个神经网络里一次前馈全部算出,所有 $z_i$ 也就能同时并行计算:
有了 $z$ 和 $\sigma$,再配合三角雅可比结构的红利,对数似然可以精确求和:
相比之下,正向采样必须模拟乐高拼装的真实顺序:先随机抽 $z_1$ 得 $x_1$,把 $x_1$ 喂进网络算出 $\mu_2,\sigma_2$,再结合 $z_2$ 得 $x_2$……每一步都依赖上一步的输出,整个生成过程需要依次调用 $D$ 次网络前馈。这就是 MAF 的“快慢两面”:它是密度估计的加速器,却不是低延迟采样的最优解——这个矛盾直接引出了 RealNVP 和 IAF 的改进思路。
- 潜变量反解用样本减去均值、除以标准差,得到对应的标准噪声
- 查潜变量对数密度把 $z$ 看作标准高斯样本,计算其对数密度
- 雅可比对角累加三角雅可比行列式等于主对角线乘积 $\prod_{i=1}^D \sigma_i$,取对数后对所有维度的 $\log \sigma_i$ 求和
与RealNVP对比
如果 MAF 是“逐一累积”的拼装方式,RealNVP(Real Non-volume Preserving)就是“两人协作”:一个人先把左半边零件全部落位,另一个人看着左半边的成品来拼右半边。RealNVP 的耦合层(coupling layer)正是这样——把输入按维度分成两组(常见是前一半与后一半),前半部分原封不动直接通过,后半部分再用前半部分的信息做仿射变换。
数学上,RealNVP 可以看作 MAF 的极端特例:MAF 允许每个维度依赖前面所有维度,RealNVP 则把依赖范围截断成“只允许后半依赖前半”。这样做的直接好处是,前向和逆向都只需要一次前馈——因为任意方向下,“被依赖的一半”始终是输入里现成的内容。耦合层的公式如下:
RealNVP 的正反向都快,但代价是单层表达能力弱于完整自回归的 MAF——毕竟右半边能参考的信息只有左半边,而不能像 MAF 那样精细地参考“紧挨着的前面几位”。实际使用中,RealNVP 往往堆更多层、并在层间打乱维度顺序来弥补。用乐高的话说:两人协作拼装速度快,但每步能参考的只有半个成品;MAF 的一人顺次拼装慢,但每一步都能参考全部已拼好的部分。选谁,取决于你更缺时间还是更缺精度。
- 前半恒等放行前 $d$ 个维度不做任何操作,直接等于输入
- 后半条件仿射后半部分用前半部分的输出,经过网络生成 $s$ 和 $t$,做缩放加平移
- 雅可比来自后半因为前半恒等,雅可比行列式只来自后半的对角块
与IAF对比
如果说 MAF 的说明书是“质检员专用版”——拆解飞快、拼装缓慢,那么 IAF(Inverse Autoregressive Flow)就是把这份说明书镜像翻转的“组装工专用版”——拼装飞快、拆解缓慢。二者在数学上是互为逆变换的对偶结构,理解了这个镜像关系,你就掌握了整个自回归流家族的设计哲学。
IAF 把条件依赖从“数据空间 $\mathbf{x}_{<i}$”换成“潜变量空间 $\mathbf{z}_{<i}$”:正向变换写成 $x_i = \mu_i(\mathbf{z}_{<i}) + \sigma_i(\mathbf{z}_{<i}) z_i$。由于生成时 $z$ 是采样的起点、全部已知,所有 $\mu_i$、$\sigma_i$ 可以并行计算,所有 $x_i$ 也能一次成型——这就是“拼装快”。但坏消息是,逆向拆解时 $z_i$ 依赖前几个 $z$,而它们需要逐个反解,于是似然计算退化成串行,一次前馈再也搞不定。
| 模型 | 正向采样(z→x) | 逆向似然(x→z) |
|------|----------------|----------------|
| MAF | 串行,需 D 次前馈 | 并行,单次前馈 |
| IAF | 并行,单次前馈 | 串行,需 D 次前馈 |
那句经典的“训练看 MAF、部署看 IAF”就来自这张表:如果你要反复计算大量数据的对数似然(比如做密度估计、异常检测),MAF 的并行逆向是压倒性优势;如果你要低延迟生成样本(比如实时语音合成、交互式图像生成),IAF 的并行正向更合适。乐高工厂的比喻很贴切:MAF 是给质检科的快速拆卸手册,IAF 是给装配车间的快速拼装手册,两本手册内容互为镜像,你用哪本取决于你的工位在哪条流水线上。
密度估计应用
有了“双向说明书”,你能做三件事:从零件出发拼出恐龙(生成新样本)、把真恐龙拆开并测算它与标准恐龙吻合到什么程度(计算对数似然)、以及鉴别一个来路不明的“恐龙”是正品还是劣质赝品(异常检测)。这正是 MAF 在密度估计任务中的三种典型用法。
训练 MAF 的目标非常直接——极大似然估计(Maximum Likelihood Estimation):调整网络参数,让训练数据在模型下的对数似然尽量大。得益于逆向路径的并行计算,每个 batch 只要一次前馈就能得到所有样本的似然,训练效率远高于需要逐维递推的朴素实现。目标函数写成:
训练完成后,MAF 既能按说明书“倒着拼”生成全新的恐龙样本,也能给每个输入样本打一个精确的似然分数。在工业质检场景里,良品在说明书上的还原度天然很高(对数似然大),缺陷品则会在某个维度上“拼不上”(对数似然显著偏低),于是 MAF 就成了一台无监督异常检测器。乐高故事到这里闭环了:一本好的双向说明书,不只是用来拼玩具的——它本身就是一把衡量世界是否“合规”的标尺。
- 训练集期望对数据分布中抽出的每个样本,计算对数似然的期望值
- 拆解概率项样本经逆向映射到潜变量,代入标准高斯计算对数密度
- 雅可比修正项加上逆向变换的对数行列式,补偿组装过程的体积伸缩
AI 应用场景
工业图像异常检测
阶段:无监督密度估计 / 异常检测
解决的问题:传统视觉质检依赖大量标注缺陷样本,且缺陷类型层出不穷;MAF 只用在良品图像上学分布,推理时一次前馈计算对数似然,得分低的图像即判定为异常,无需见过缺陷样本。
具体案例:某电子元件产线采集 5 万张良品电路板灰度图,训练一个三层 MAF 模型作为“合格品密度计”;新图到来时计算 $\log p(x)$,低于阈值则触发人工复检,召回率相比手工规则提升了约 30%。
高维数据的可逆表征学习
阶段:无监督表征学习 / 数据压缩
解决的问题:自编码器学到的隐变量没有显式概率解释,GAN 没有编码器;MAF 的逆向路径天然提供一个可逆编码器,能把高维数据无损映射到潜空间,同时给出精确的密度值。
具体案例:医疗影像团队用 MAF 对 3D 脑部 MRI 切片建模,将 64×64 图像编码为 64 维潜变量,既可用于低维可视化,也能通过潜空间插值生成过渡扫描结果,辅助医生观察病灶演化。
低延迟采样任务的 IAF 替代方案分析
阶段:模型选型 / 推理部署
解决的问题:MAF 采样需逐维串行,实时性差;工程师在部署前用“MAF-IAF 对偶表”评估两端成本,若应用以生成为主则改用 IAF 架构。
具体案例:某语音合成团队原用 MAF 建模声学特征,108 维输出导致单个样本生成延迟 8ms,超出实时预算;将网络改成 IAF 后采样延迟降到 1.2ms,且通过共享参数训练基本保持了音频质量。
Python 演示
import torchimport torch.nn as nn class MaskedLinear(nn.Module): """自回归掩码线性层:输出 j 只能使用输入 i<j""" def __init__(self, in_dim, out_dim): super().__init__() self.weight = nn.Parameter(torch.randn(out_dim, in_dim) * 0.1) self.bias = nn.Parameter(torch.zeros(out_dim)) mask = (torch.arange(in_dim)[None, :] < torch.arange(out_dim)[:, None]).float() self.register_buffer('mask', mask) def forward(self, x): return x @ (self.weight * self.mask).T + self.bias class MAF(nn.Module): """仿射 MAF 层:逆向 x→z 并行,正向采样逐维串行""" def __init__(self, dim): super().__init__() self.mu_net = MaskedLinear(dim, dim) self.logs_net = MaskedLinear(dim, dim) def forward(self, x): mu = self.mu_net(x) logs = torch.tanh(self.logs_net(x)) * 0.6 z = (x - mu) * torch.exp(-logs) log_det = -logs.sum(dim=1) return z, log_det def sample(self, n): dim = self.mu_net.bias.numel() z = torch.randn(n, dim) x = torch.zeros_like(z) with torch.no_grad(): for i in range(dim): mu = self.mu_net(x) logs = torch.tanh(self.logs_net(x)) * 0.6 x[:, i] = mu[:, i] + z[:, i] * torch.exp(logs[:, i]) return x def train(model, data, steps=600): opt = torch.optim.Adam(model.parameters(), lr=0.01) for s in range(steps): z, log_det = model(data) loss = (0.5 * z.pow(2).sum(1) - log_det).mean() # -log p(x) opt.zero_grad() loss.backward() opt.step() if s % 150 == 0: print(f'step {s}: loss {loss.item():.3f}') torch.manual_seed(0)data = torch.randn(1000, 2)data[:, 1] = data[:, 0] * 0.8 + data[:, 1] * 0.6 # 构造二维相关分布model = MAF(2)train(model, data)print('采样均值(应接近0):', model.sample(200).mean(dim=0).tolist())
mask = (torch.arange(in_dim)[None, :] < torch.arange(out_dim)[:, None]).float()构造下三角“通行证”:输出 j 只连接输入 i<j,未来信息被结构性地遮断。return x @ (self.weight * self.mask).T + self.bias权重逐元素乘掩码,被遮住的连接直接置零,反向传播也自动跳过它们。logs = torch.tanh(self.logs_net(x)) * 0.6输出对数标准差并限制在可控范围,保证数值稳定和变换可逆。z = (x - mu) * torch.exp(-logs)MAF 的逆向黄金路径:一次前馈并行算出所有潜变量。log_det = -logs.sum(dim=1)三角雅可比行列式的对数化,只需逐维累加缩放项。loss = (0.5 * z.pow(2).sum(1) - log_det).mean()极大似然损失等价于最小化负对数似然,第一项来自标准高斯,第二项是体积修正。for i in range(dim)` 配合 `x[:, i] = mu[:, i] + z[:, i] * torch.exp(logs[:, i])正向采样必须逐维递推,体现 MAF 采样串行的根本原因。
常见误区
误区网上很多资料说 MAF“高效”,我理解成生成样本时也很快,一次把整个向量推算出来,所以适合实时生成。
正解MAF 的“高效”特指逆向似然计算——输入完整样本时一次前馈算出全部 $\mu$、$\sigma$,从而并行得到 $z$。但正向采样时,生成第 $i$ 维必须等前 $i-1$ 维落位,每一步都要重新过一遍网络,总共 $D$ 次串行前馈。打个比方:质检员拆零件能一眼看全所有组装痕迹,但组装工人必须一块一块按顺序拼。
为何常见:只记住结论“MAF 高效”而忽略了“高效在哪一端”,把逆向的并行红利错误投射到正向上。
误区掩码把权重置零,Dropout 也随机把神经元置零,两者应该差不多,都是防止过拟合的。
正解完全不是一回事。Dropout 是训练时随机的临时遮断,测试时恢复,目的是正则化;MAF 的掩码是固定不变的确定性结构,目的是强制因果依赖、阻断未来信息泄漏。掩码一旦被随机打乱,自回归条件就崩溃了,模型会“偷看答案”。
为何常见:两者都表现为“权重矩阵上有零元素”,表面相似容易混淆,但其实一个管泛化、一个管结构。
误区RealNVP 用耦合层、MAF 用自回归,名字也不像,感觉是两个独立发展的技术路线。
正解RealNVP 可以看成 MAF 的极端特例——把“每个维度依赖前面所有维度”换成“后一半维度只依赖前一半维度”。结构上 MAF 是完整的三角自回归,RealNVP 是分块对角化的稀疏版本。二者都共享标准化流的骨架:可逆仿射 + 雅可比行列式修正。
为何常见:论文里对二者的动机叙述不同,初学者容易把“实现差异”误读为“原理差异”。
误区既然生成应用需要采样,而 IAF 采样并行、MAF 采样串行,那 IAF 一定处处比 MAF 好。
正解IAF 只是把“快”换到了正向端,它的逆向似然计算退化为逐维串行。密度估计、异常检测这类高频计算似然的任务依然是 MAF 的主场。二者是方向对偶的孪生兄弟,没有绝对优劣,只有是否匹配任务方向。
为何常见:许多讲解只强调生成侧体验,忽略了训练和评估侧同样重要的似然计算成本。
误区训练时 MAF 的负对数似然降得很低,那它生成的样本应该和张片一样清晰。
正解对数似然是概率密度的全局度量,而人眼感知质量更看重局部结构和纹理;高维空间中似然与样本质量并非严格单调对应。MAF 的潜在风险是建模了噪声或高频伪影,导致似然很高但样本观感模糊;需要配合样本可视化、FID 等指标一起评估。
为何常见:把“似然”这一训练目标当作“质量”的唯一代理,忽略了感知评估的多维度性。
面试题
Q1. MAF 中“掩码”的核心作用是?
- A.防止过拟合,类似 Dropout 的随机置零
- B.强制因果依赖,阻止未来信息泄漏← 正确答案
- C.加速 GPU 矩阵运算和显存带宽
- D.压缩模型参数以减小存储开销
答案:B。掩码是固定结构的 0/1 矩阵,作用是让输出维度只能看到前面输入维度,从而严格保证自回归顺序。Dropout 是训练时随机遮断用于正则化,与掩码目的完全不同;C 和 D 与掩码无直接关系。
Q2. MAF 中哪一步可以用一次并行前馈完成?
- A.正向采样生成全新的数据样本
- B.逆向计算似然(从 x 到 z)← 正确答案
- C.反向传播更新所有网络参数
- D.以上三个步骤全部可以并行
答案:B。逆向时输入样本完整,所有 $\mu_i$、$\sigma_i$ 可一次算出,$z_i$ 自然并行。正向采样因 $x_i$ 依赖 $\mathbf{x}_{<i}$ 必须逐维递推;参数更新是训练机制,与“方向并行”不是同一概念。
Q3. 标准化流模型的核心目标是?
- A.学习一个不可逆的黑盒特征映射
- B.学习可逆变换,把简单分布映成数据分布← 正确答案
- C.学习一个判别超平面做分类决策
- D.学习一个瓶颈结构做有损压缩
答案:B。标准化流要求所有变换严格可逆,从而能精确计算似然;不可逆映射无法做变量替换,判别器对应 GAN/分类器,瓶颈编码对应自编码器,都不是流模型的核心。
Q4. MAF 的雅可比行列式为什么容易计算?
- A.网络权重全部是线性且正交的
- B.变换是三角结构,行列式等于对角元乘积← 正确答案
- C.输出维度远小于输入维度的低秩近似
- D.GPU 并行让大矩阵求逆变得可忽略
答案:B。自回归变换中 $x_i$ 只依赖 $z_1$ 到 $z_i$,雅可比矩阵是下三角阵,行列式简化为对角线乘积 $\prod \sigma_i$,因此对数似然只需累加 $\log \sigma_i$,无需高维行列式计算。
Q5. 关于 RealNVP 与 MAF 的关系,正确的是?
- A.两者完全独立,没有任何数学联系
- B.RealNVP 是 MAF 在分块依赖下的特例← 正确答案
- C.MAF 是 RealNVP 在多加一层后的推广
- D.RealNVP 不需要雅可比行列式修正
答案:B。RealNVP 把“后一半维度依赖前一半”视作自回归依赖的稀疏化,结构上是 MAF 的特例。RealNVP 同样需要雅可比修正,只是因为前半恒等,修正项更简单。
Q6. 关于 MAF 与 IAF 的对比,正确的有?
- A.二者互为方向对偶结构← 正确答案
- B.MAF 逆向似然快、正向采样慢← 正确答案
- C.IAF 正向采样快、逆向似然慢← 正确答案
- D.MAF 采样通常比同样规模的 IAF 更快
答案:ABC。IAF 是 MAF 的逆变换镜像,快慢两端刚好互换。MAF 逆向并行、正向串行,IAF 反之;因此 D 说 MAF 采样更快是错误的。
Q7. 训练 MAF 时,使用的损失函数通常是?
- A.最小化 E[0.5‖z‖² − log_det],其中 z 是潜变量← 正确答案
- B.最小化 E[0.5‖x‖² − log_det],其中 x 是数据
- C.最大化判别器与生成器的极小极大对抗损失
- D.最小化重构误差加上 KL 散度的加权和
答案:A。MAF 训练目标是极大似然,等价于最小化 $E[-\log p(x)]$。由于 $p_Z(z)$ 是标准高斯,展开后得到 $E[0.5\|z\|^2 - \log\det J]$,其中 $z=f^{-1}(x)$。B 错在把 $x$ 代入高斯项;C 是 GAN;D 是 VAE。
Q8. 下列属于标准化流家族成员的有?
- A.RealNVP← 正确答案
- B.MAF← 正确答案
- C.IAF← 正确答案
- D.VAE
答案:ABC。RealNVP、MAF、IAF 都基于可逆变换 + 雅可比行列式修正,是标准流的不同实现。VAE 使用编码器—解码器结构并优化证据下界,不要求变换可逆,不属于流家族。
Q9. 对 128 维数据生成 1000 个样本,MAF 与 IAF 的采样耗时关系是?
- A.MAF 更快,因为训练阶段效率更高
- B.IAF 更快,正向采样可一次并行完成← 正确答案
- C.两者耗时完全相同,与方向无关
- D.取决于数据分布是否服从高斯分布
答案:B。采样对应正向方向。MAF 正向需逐维串行递推 128 次网络前馈,IAF 正向因依赖潜变量(全部已知)可一次前馈完成,故 IAF 采样更快。训练效率与推理方向不能混淆。
Q10. 哪些场景更适合选用 MAF 而非 IAF?
- A.离线密度估计,需批量计算大量样本的似然← 正确答案
- B.实时交互式生成,采样延迟要求极低
- C.训练过程中频繁评估验证集的负对数似然← 正确答案
- D.只需要生成样本,完全不需要计算似然
答案:AC。MAF 的优势在逆向似然计算——A 的批量似然评估和 C 的验证集监控都依赖该方向,适合 MAF。B 的实时生成需要采样快,应选 IAF;D 不涉及似然,同样应优先 IAF。