老城区巷子深处有位面塑师傅,他的绝活不是凭空捏出龙凤,而是从一团“标准面团”开始——光滑、圆润、处处均匀。他会擀、捏、卷、压,每道工序都严格可逆:向左擀半寸,就能向右擀回半寸。当所有工序完成,标准面团变成栩栩如生的锦鲤;客人想看原样,他倒着做一遍,面团又回到球形。更妙的是,他把芝麻混进面团里,随着造型改变,芝麻的疏密悄悄记录着每一处的拉扯程度。这个故事几乎就是生成模型领域“标准化流”(Normalizing Flow)的完整隐喻:从一个简单分布出发,用一串可逆变换,塑造成复杂的数据分布。芝麻是样本点,疏密是概率密度,每道工序的拉扯比例,就是数学中的雅可比行列式。这篇文章,就带你认识这位“面塑师傅”的全套手艺。

岗位关联

理解标准化流,等于掌握生成模型中“精确似然”这一派核心功法——在密度估计、异常检测、语音合成等场景中可直接落地,是生成模型工程师的必修内力。

目录
  1. 可视化演示
  2. 分布变换思想
  3. 变量替换公式
  4. 雅可比行列式
  5. 可逆变换设计
  6. 正向逆向流程
  7. 流模型家族
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示标准化流从简单分布Z~N(0,1)经可逆变换f1→f2→fK逐步映射为复杂分布p(X)的过程,含Jacobian行列式修正和双射(Biject)可逆性。

本节配有交互动效(进入视口后自动加载,约 3KB)。

标准化流核心原理 简单先验Z~N(0,1)经K层可逆变换f1→f2→fK映射为复杂分布p(X),变量替换公式保证概率守恒 Jacobian行列式(det J)修正体积缩放,双射(Biject)保证正向生成与逆向推断均可精确计算 p_X(x) = p_Z(f⁻¹(x)) · |det J_{f⁻¹}(x)|

分布变换思想

面塑师傅从不从零开始捏一只锦鲤。他先揉出一团“标准面团”——光滑、圆润、每一处的质地都一模一样。接下来的每一道工序,擀、捏、卷、压,都在改变面团的形状,而且严格可逆:往左擀半寸,就能往右擀回半寸。做完整个造型后,客人说“还原”,他倒着走一遍流程,面团又回到标准的球形。这个“从标准到复杂、随时可还原”的过程,就是标准化流最核心的思想。

在生成模型里,真实数据分布就像那只锦鲤——人脸、语音、分子结构,复杂得无法直接写出概率密度函数。标准化流的思路是:先从一个简单分布出发,这个分布通常是标准高斯分布(也就是我们的“标准面团”),然后通过一个由多层可逆函数复合而成的变换 f,把简单分布逐步塑造成复杂分布。因为每一层都可逆,整个映射也可逆:既能从简单分布流到复杂分布,也能从复杂分布流回简单分布。

更具体地说,假设潜变量 z 服从标准高斯,变换 f 由 K 层可逆函数复合而成:令 z₀ = z,然后依次计算 z_k = f_k(z_{k-1}),最终输出 x = z_K。每一层 f_k 的参数由神经网络给出,所以整个变换是一个深度模型。训练时,我们最大化观测数据在模型分布下的对数似然;采样时,只需从标准高斯抽一个点,逐层正向传播,就得到一个新样本。

面塑师傅敢承诺“可还原”,是因为每道工序都有明确的逆操作;标准化流之所以能精确计算概率,也是因为每层变换都可逆——概率的“账”,才能一笔一笔算得清清楚楚。这就是“标准化”三个字的含义:不管造型多复杂,账总能算清。

变量替换公式

面塑师傅有一本引以为傲的“芝麻账本”。他在标准面团里混入上千粒芝麻,每一粒芝麻都代表一个样本点。当他擀面时,芝麻跟着面团流动:被擀薄的区域,芝麻粒变得稀疏;被捏紧的部位,芝麻粒挤作一团。如果客人问“这个造型某个角落的面有多厚”,光看原来面团的密度是不够的——必须乘上一个“拉扯比例”。这个“拉扯比例”,在数学上就由变量替换公式来精确描述。

若 x = f(z) 是一个可逆变换,z 的概率密度为 p_Z(z),那么 x 的概率密度不能直接等于 p_Z(x),因为变换会改变局部体积,概率质量被“摊薄”或“堆厚”。正确的公式如下:

为了数值稳定和计算方便,实际训练时使用的是它的对数形式:log p_X(x) = log p_Z(f⁻¹(x)) + log|det J|。加法的好处是可以用梯度上升直接优化,而且多层变换的对数行列式可以逐层相加——师傅的账本上,每一道工序记一笔拉扯倍数,最后汇总,清晰明了。

pX(x)=pZ(f−1(x))∣det⁡∂f−1(x)∂x∣p_X(\mathbf{x}) = p_Z\left(f^{-1}(\mathbf{x})\right)\left|\det \frac{\partial f^{-1}(\mathbf{x})}{\partial \mathbf{x}}\right|
  1. 逆变换 f⁻¹(x)把成品样本映回原始“标准面团”上的对应点;因为变换可逆,这个对应点存在且唯一。
    f−1(x)f^{-1}(\mathbf{x})
  2. 原密度 p_Z(·)找到对应点后,查它在原始分布里的概率密度,这是密度的“基数”。
    pZ(f−1(x))p_Z\left(f^{-1}(\mathbf{x})\right)
  3. 导数矩阵度量逆变换在 x 附近每个方向上的伸缩比例,是一个 D×D 的矩阵。
    ∂f−1(x)∂x∈RD×D\frac{\partial f^{-1}(\mathbf{x})}{\partial \mathbf{x}} \in \mathbb{R}^{D\times D}
  4. 行列式绝对值把矩阵的伸缩率压缩成一个正数,表示这个小邻域的体积被放大还是缩小了多少倍。
    ∣det⁡∂f−1(x)∂x∣\left|\det \frac{\partial f^{-1}(\mathbf{x})}{\partial \mathbf{x}}\right|
  5. 相乘得新密度原密度乘以体积伸缩因子,就是变换后分布在新点的密度。
    pX(x)=pZ(f−1(x))⋅∣det⁡∂f−1(x)∂x∣p_X(\mathbf{x}) = p_Z\left(f^{-1}(\mathbf{x})\right)\cdot \left|\det \frac{\partial f^{-1}(\mathbf{x})}{\partial \mathbf{x}}\right|

雅可比行列式

擀面杖每次下压,面塑师傅心里都在默算:“这一下,左边那团面被拉长了 1.3 倍,右上角那团被压成了 0.8 倍。”这一个个“局部放大倍数”,在数学里就是雅可比行列式(Jacobian determinant)。变换是全局非线性的,但在任意一点附近都可以用它的导数矩阵——雅可比矩阵——来近似描述局部的伸缩行为。

雅可比矩阵 J 的第 i 行第 j 列元素是 ∂(f_k)_i / ∂(z_{k-1})_j,表示第 j 个输入方向动一点,第 i 个输出被带动多少。它的行列式 det J 就是局部体积伸缩因子:det J > 1 表示区域被拉伸、密度变稀;det J < 1 表示区域被压缩、密度变稠;det J = 0 表示映射发生了坍缩,这在可逆变换中绝不允许发生——因为可逆映射必须处处满秩。当有多层变换叠加时,总伸缩因子是各层行列式的乘积,取对数后变成求和:

其中 $\mathbf{J}_k = \partial \mathbf{z}_k / \partial \mathbf{z}_{k-1}$ 是第 k 层变换的雅可比矩阵。

有人会问:计算一个 D×D 矩阵的行列式不是要 O(D³) 吗?这就引出了流模型设计的关键技巧——把每层的雅可比矩阵设计成三角矩阵。三角矩阵的行列式等于对角线元素乘积,计算复杂度降到 O(D)。面塑师傅的账本之所以能飞快算完,正是因为他每道工序只用“直上直下”的简单手法,从不做需要复杂计算的“扭曲交叉”。

log⁡pX(x)=log⁡pZ(z0)−∑k=1Klog⁡∣det⁡Jk∣\log p_X(\mathbf{x}) = \log p_Z(\mathbf{z}_0) - \sum_{k=1}^{K}\log\left|\det \mathbf{J}_k\right|
  1. 初始点 z₀标准高斯采样得到的潜变量,相当于“标准面团”上一粒芝麻的起始位置。
    z0∼N(0,I)\mathbf{z}_0 \sim \mathcal{N}(\mathbf{0}, \mathbf{I})
  2. 第 k 层变换每一层把当前点 z_{k-1} 映射到 z_k,输出又成为下一层的输入。
    zk=fk(zk−1)\mathbf{z}_k = f_k(\mathbf{z}_{k-1})
  3. 每层雅可比矩阵J_k 的每个元素描述该层变换在某个方向上的局部放大幅度。
    Jk=∂zk∂zk−1\mathbf{J}_k = \frac{\partial \mathbf{z}_k}{\partial \mathbf{z}_{k-1}}
  4. 对数行列式累加K 层伸缩因子的对数逐层相加,因为总体伸缩是各层乘积。
    ∑k=1Klog⁡∣det⁡Jk∣\sum_{k=1}^{K} \log\left|\det \mathbf{J}_k\right|
  5. 总体对数似然初始密度的对数,减去所有层“拉扯”的总账,得到最终数据的对数密度。
    log⁡pX(x)=log⁡pZ(z0)−∑k=1Klog⁡∣det⁡Jk∣\log p_X(\mathbf{x}) = \log p_Z(\mathbf{z}_0) - \sum_{k=1}^{K}\log\left|\det \mathbf{J}_k\right|

可逆变换设计

面塑师傅的工具箱里没有神秘道具,就是擀面杖、捏刀、卷轴和转盘——每样工具都有对应的“逆操作”。标准化流里的每一层也是精心设计的基本招式,最常见的是三种:仿射耦合层、1×1 卷积和特征置换。仿射耦合层来自 RealNVP,它的做法是:把输入 x 分成前后两段,前段原封不动“穿过去”,后段则根据前段计算出的缩放因子 s 和平移量 t 做仿射变换:

由于前段被原样保留,逆变换也很简单:先从输出 y 里取出 y_{1:d},它就是 x_{1:d},再据此算出 s 和 t,最后对后段做反向仿射:

不过如果每一层都让前段直通,深层网络里前段信息永远不被加工,模型的表达能力会受限。所以流模型一般还会在耦合层之间穿插特征置换——把维度的顺序打乱,让原本“当前段”的维度在下一层变成“被改造段”。Glow 更进一步,引入可学习的 1×1 可逆卷积,相当于用数据驱动的方式学习最优的置换和通道混合,同时它的对数行列式也容易计算。师傅的每道工序都不花哨,但简单招式的深层堆叠,最终塑造出极其复杂的造型——这正是深度学习的精髓。

y1:d=x1:d,yd+1:D=xd+1:D⊙exp⁡(s(x1:d))+t(x1:d)\mathbf{y}_{1:d} = \mathbf{x}_{1:d}, \qquad \mathbf{y}_{d+1:D} = \mathbf{x}_{d+1:D}\odot\exp\left(\mathbf{s}(\mathbf{x}_{1:d})\right) + \mathbf{t}(\mathbf{x}_{1:d})
  1. 还原前段y_{1:d} 就是 x_{1:d},无需计算直接得到。
    x1:d=y1:d\mathbf{x}_{1:d} = \mathbf{y}_{1:d}
  2. 减去平移仿射变换的加法部分,用减法就能撤销。
    yd+1:D−t(x1:d)\mathbf{y}_{d+1:D} - \mathbf{t}(\mathbf{x}_{1:d})
  3. 乘以缩放倒数指数缩放的逆操作就是乘以 exp(-s),逐元素还原。
    xd+1:D=(yd+1:D−t(x1:d))⊙exp⁡(−s(x1:d))\mathbf{x}_{d+1:D} = \left(\mathbf{y}_{d+1:D} - \mathbf{t}(\mathbf{x}_{1:d})\right)\odot\exp\left(-\mathbf{s}(\mathbf{x}_{1:d})\right)

正向逆向流程

面塑有两种工作方式:一种是客人拿来一张参考图,师傅照着图一步步塑形,每道工序都知道手该往哪儿使劲——这叫正向塑形;另一种是客人指着成品说“再给我来一只一模一样的”,师傅直接翻模、快速复制——这叫逆向还原。标准化流同样有两条方向相反的路,而且共用同一套可逆网络。

先说正向(从 z 到 x)。在训练阶段,我们手里只有真实数据 x,要做的是把它逆变换回潜变量 z,然后在标准高斯分布下打分。把变量替换公式写成带参数 θ 的形式,训练目标就是最大化真实数据的期望对数似然:

训练完成后,逆向流程(从 z 到 x)就是生成采样:从标准正态分布抽一个随机点,逐层正向调用 f_θ,立刻得到一个符合数据分布的新样本。因为网络本身可逆,逆向采样与正向训练共用同一套代码,只是调用方向相反。面塑师傅照图塑形时心里有把尺子(似然),快速翻模时用的是同一个模具(可逆网络)——一个模型两种用法,这正是标准化流最优雅的地方。

L(θ)=Ex∼pdata[log⁡pZ(fθ−1(x))+log⁡∣det⁡Jfθ−1(x)∣]\mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}\left[\log p_Z\left(f_\theta^{-1}(\mathbf{x})\right) + \log\left|\det \mathbf{J}_{f_\theta^{-1}}(\mathbf{x})\right|\right]
  1. 数据分布期望对真实数据分布取平均,实际操作时用训练集 mini-batch 的均值近似。
    Ex∼pdata[⋅]\mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}\left[\cdot\right]
  2. 逆变换回潜空间把数据 x 通过逆网络映回潜变量 z,这一步要求网络可逆。
    z=fθ−1(x)\mathbf{z} = f_\theta^{-1}(\mathbf{x})
  3. 高斯对数密度衡量 z 在标准高斯分布下有多“正常”。数据被解释得越好,z 越像高斯样本。
    log⁡pZ(z)\log p_Z(\mathbf{z})
  4. 行列式补偿加上逆变换的伸缩因子对数,保证概率守恒,否则“账”就对不上了。
    log⁡∣det⁡Jfθ−1(x)∣\log\left|\det \mathbf{J}_{f_\theta^{-1}}(\mathbf{x})\right|
  5. 整体目标对每个数据点计算上述两项之和,再取平均,用梯度上升优化参数 θ。
    L(θ)=Ex∼pdata[log⁡pZ(fθ−1(x))+log⁡∣det⁡Jfθ−1(x)∣]\mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}\left[\log p_Z\left(f_\theta^{-1}(\mathbf{x})\right) + \log\left|\det \mathbf{J}_{f_\theta^{-1}}(\mathbf{x})\right|\right]

流模型家族

不同的面塑流派各有绝活。北派 RealNVP 的招法是“分层擀卷”——仿射耦合层加上特征置换,动作朴实但耐力持久;南派 Glow 的招法多了“旋转台”——1×1 可逆卷积,捏花更精细,还练就了多尺度架构的硬功夫。它们共同组成了标准化流家族的主要谱系。

RealNVP(2016)首次把仿射耦合层堆叠成深度流模型,通过交替置换保证各个维度都能被充分改造。Glow(2018)在此基础上引入可学习的 1×1 卷积来替代固定置换,并采用多尺度结构逐层“分流”信息,在 256×256 的人脸生成上取得了惊艳效果,还支持在潜空间里做语义属性编辑。两者都保留了标准化流的立身之本:精确的似然计算。

把流模型和另外两大生成模型对比,差异一目了然。GAN 擅长生成高真实度的图像,但训练不稳定,而且没有显式密度,无法给一个数据点打出“概率分”;VAE 有显式的变分下界,但似然是近似的,生成图像常常偏模糊。标准化流则两头兼顾:似然精确、训练稳定、采样速度快,代价是深层的可逆变换计算量偏大。在后来的扩散模型崛起之前,流模型是“精确似然 + 高质量生成”这个组合里最均衡的选择。

流派虽有别,但都遵循同一套“面团哲学”:可逆、可算账、能还原。师傅祖传的规矩,正是标准化流的立身之本——不管面塑的造型多复杂,只要每道工序都能逆向还原,芝麻账本就永远算得清。

AI 应用场景

金融反欺诈中的密度估计

阶段:密度估计 / 异常检测

解决的问题:欺诈交易占比极小、形态不断翻新。传统规则阈值难以覆盖未知欺诈,有监督分类器又依赖大量标注。标准化流可以在正常交易数据上训练,学出一个精确的密度模型——正常交易的密度高,可疑交易的密度低,无需标注即可发现“长尾”异常。

具体案例:某支付风控团队用标准化流对“设备指纹 + 交易序列”的低维特征建模,每天对全部交易批量计算对数似然分数。低于阈值的交易自动进入人工复核队列,黑样本召回率比传统规则提升约 30%。

语音合成中的可逆声码器

阶段:生成 / 波形合成

解决的问题:自回归声码器逐点生成波形,速度慢得无法落地;GAN 声码器训练不稳定。WaveGlow 是 Glow 的变体,把梅尔频谱作为条件,正向将波形映射到高斯,逆向从高斯采样合成波形,一次前向传播即可生成整段音频。

具体案例:某在线教育平台的语音助手需要批量合成课程音频。采用 WaveGlow 后,合成 10 分钟音频的时间从自回归模型的约 40 分钟缩短到 2 秒,且保留了精确似然,方便做音质异常检测。

分子构象生成与筛选

阶段:生成 / 精确似然评估

解决的问题:药物分子的 3D 构象分布极其复杂,而且研发人员需要判断一个新颖分子在已知化学空间里是否“合理”。标准化流天然支持精确似然,既能生成分子构象,又能给候选分子打分排序。

具体案例:某 AI 制药团队用连续标准化流在分子坐标上建模,生成大量候选 3D 构象,再依据对数似然筛选出高概率、低能量的候选,辅助虚拟筛选流程,缩短了先导化合物发现周期。

Python 演示

python47 行
import torchimport torch.nn as nnimport math torch.manual_seed(0) def target_log_prob(x):    logp1 = -0.5 * ((x - 2.0) / 0.6) ** 2 - math.log(0.6) - 0.5 * math.log(2 * math.pi)    logp2 = -0.5 * ((x + 2.0) / 0.6) ** 2 - math.log(0.6) - 0.5 * math.log(2 * math.pi)    return torch.logsumexp(torch.stack([logp1, logp2], dim=-1), dim=-1) - math.log(2) class AffineFlow(nn.Module):    def __init__(self):        super().__init__()        self.s = nn.Parameter(torch.zeros(1))        self.t = nn.Parameter(torch.zeros(1))     def forward(self, x):        self._logdet = self.s.expand(x.shape[0])        return x * torch.exp(self.s) + self.t     def inverse(self, y):        return (y - self.t) * torch.exp(-self.s) model = nn.Sequential(*[AffineFlow() for _ in range(6)])opt = torch.optim.Adam(model.parameters(), lr=0.05) for step in range(1500):    z = torch.randn(512)    x = z    logdets = 0.0    for layer in model:        x = layer(x)        logdets = logdets + layer._logdet    log_pz = -0.5 * z ** 2 - 0.5 * math.log(2 * math.pi)    loss = -(target_log_prob(x) + log_pz - logdets).mean()    opt.zero_grad()    loss.backward()    opt.step()    if step % 500 == 0:        print('step %d, loss %.4f' % (step, loss.item())) z = torch.randn(2000)samples = zfor layer in reversed(model):    samples = layer.inverse(samples)print('采样均值 %.3f, 标准差 %.3f' % (samples.mean().item(), samples.std().item()))
目的:用 6 层可逆仿射变换,把标准高斯分布塑造成双峰高斯混合分布,并演示正向训练(密度估计)与逆向采样(生成)的完整流程。
  1. def target_log_prob(x)定义目标数据分布的对数密度:一个双峰高斯混合,相当于面塑师傅要塑的“锦鲤图样”。
  2. class AffineFlow(nn.Module)每一层就是一个可逆仿射变换:y = x·exp(s) + t。
  3. self._logdet = self.s.expand(x.shape[0])记录本层伸缩因子,供训练时计算对数似然。
  4. def inverse(self, y): return (y - self.t) * torch.exp(-self.s)逆变换实现,采样时把高斯点“还原”成数据点。
  5. x = layer(x); logdets = logdets + layer._logdet正向流过所有层,同时累加每层的对数行列式。
  6. loss = -(target_log_prob(x) + log_pz - logdets).mean()训练目标:让变换后的 x 落在目标分布高密度区,同时考虑概率守恒的伸缩补偿。
  7. for layer in reversed(model): samples = layer.inverse(samples)逆向流程:从标准高斯采样,逐层逆变换生成符合目标分布的新样本。

常见误区

误区我一开始以为“可逆”等于“不改变体积”,所以每层变换的雅可比行列式必须等于 1,否则信息就丢了。

正解可逆只要求雅可比矩阵满秩,即行列式处处非零。行列式大于 1(拉伸)或小于 1(压缩)都完全允许,它们改变的只是概率密度的大小——这正是流模型建模复杂分布的动力来源。行列式恒等于 1 的流(如 NICE)只是特例,称为“体积保持”,一般流并不需要。

为何常见:初学时容易把“可逆”和“等体积”混淆。面塑师傅把面拉长,面团体积不变、但局部变薄了——行列式在这里度量的是“局部薄厚”,而不是“总质量是否守恒”。

误区既然都叫生成模型,那评价标准化流的标准也应该和 GAN 一样,就看生成的图片逼不逼真。

正解流模型的核心卖点是精确似然——它能给任意一个数据点算出可解释的概率值,因此擅长密度估计、异常检测等任务。GAN 没有显式密度,只能给出判别器的打分,无法回答“这个点的概率是多少”。在纯生成逼真度上,GAN 往往更强,但论“算账”能力,流模型独树一帜。

为何常见:2010 年代后 GAN 生成的图像太过惊艳,外界习惯用生成效果衡量一切生成模型,忽略了流模型“精确似然”这条差异化赛道。

误区我以为流模型只要把高斯噪声正向映射成数据就能用,训练时根本不需要走逆向流程。

正解恰恰相反。训练时必须逆向:把真实数据 x 逆变换回潜变量 z,才能在标准高斯密度下打分并计算对数似然。正向路径只用于生成阶段。两条路径共用同一套可逆网络,缺一不可——就像面塑师傅既要会照着图样塑形,也要能逆着工序把成品还原成面团,还原的过程正是他校准手艺的方式。

为何常见:初学者从生成任务切入,只盯着“噪声→数据”的方向,忽略了似然训练需要“数据→噪声”的逆映射这一前提。

误区D 维输入对应 D×D 的雅可比矩阵,求一次行列式要 O(D³),流模型听起来只能做玩具级实验。

正解现代流模型把每层雅可比设计成三角矩阵或结构化矩阵,行列式退化为对角线乘积,计算复杂度降到 O(D)。耦合层、1×1 卷积等设计正是为此而生,Glow 甚至能处理 256×256 的图像。所谓“太贵”,是没有看到模型设计者在结构上做的巧妙约束。

为何常见:拿一般矩阵的行列式复杂度去套结构化设计,忽略了耦合层带来的三角雅可比这一关键简化——面塑师傅的账本薄,是因为他记账的方式本身就简单。

面试题

Q1. 标准化流的建模目标是什么?

单选题 · easy

  • A.学习近似变分后验
  • B.可逆变换拟合分布← 正确答案
  • C.对抗式学习生成器
  • D.马尔可夫链去噪生成

答案:B。标准化流的目标是用一串可逆变换把简单分布拟合成复杂数据分布。A 是 VAE 的思路,C 是 GAN 的思路,D 是扩散模型的思路,三者都不依赖“可逆变换 + 精确似然”这一核心设定。

Q2. 变量替换公式需要额外计算什么?

单选题 · mid

  • A.计算判别器梯度
  • B.雅可比行列式值← 正确答案
  • C.编码器的 KL 散度
  • D.扩散过程时间步

答案:B。变量替换公式的核心是原密度乘上逆变换雅可比行列式的绝对值。判别器梯度属于 GAN,KL 散度属于 VAE,扩散时间步属于扩散模型,都与流模型的密度变换无关。

Q3. 雅可比行列式 det J > 1 时说明什么?

单选题 · mid

  • A.局部体积缩小密度变大
  • B.局部体积放大密度变小← 正确答案
  • C.该点处变换不可逆
  • D.生成样本质量更高

答案:B。行列式大于 1 表示该点邻域被拉伸,体积放大,同样的概率质量摊到更大区域,所以密度变小。就像面团被擀薄的地方,芝麻粒变稀疏。C 与满秩条件矛盾,D 与行列式无关。

Q4. 耦合层让雅可比成三角矩阵的主要收益?

单选题 · hard

  • A.成倍提升模型容量
  • B.令逆变换更易实现
  • C.行列式等于对角线积← 正确答案
  • D.显著缓解模式崩溃

答案:C。三角矩阵的行列式等于对角线元素乘积,把 O(D³) 的行列式计算降为 O(D)。B 是耦合层的附带好处而非三角矩阵的核心收益,A、D 与三角结构没有直接关系。

Q5. 以下属于可逆变换实现手段的有?

多选题 · hard

  • A.采用仿射耦合层← 正确答案
  • B.使用一乘一卷积← 正确答案
  • C.添加最大池化层
  • D.应用特征置换操作← 正确答案

答案:ABD。仿射耦合层、1×1 可逆卷积、特征置换都是标准化流中常见的可逆变换设计。最大池化会丢失位置信息,本质不可逆,无法用于流模型。

Q6. 标准化流的训练目标是什么?

单选题 · easy

  • A.最大化数据似然← 正确答案
  • B.最大化变分下界
  • C.最小化对抗损失
  • D.最小化重构误差

答案:A。标准化流直接最大化数据的对数似然,因为变量替换公式给出的是精确密度。B 是 VAE 的目标,C 是 GAN 的目标,D 是自编码器的目标。

Q7. 关于标准化流说法正确的有?

多选题 · hard

  • A.可逆性保证精确似然← 正确答案
  • B.生成时从高斯采样← 正确答案
  • C.多层对数行列式相加← 正确答案
  • D.无需计算雅可比

答案:ABC。可逆性让变量替换公式成立,从而精确计算似然;生成时从标准高斯采样并逐层正向传播;多层变换的伸缩因子取对数后累加。D 错误,雅可比行列式是流模型计算似然的核心依赖。

Q8. 仿射耦合层中前段特征的作用是?

单选题 · mid

  • A.直接被模型丢弃
  • B.生成缩放平移参数← 正确答案
  • C.提取图像的语义
  • D.仅用于对抗训练

答案:B。前段 x_{1:d} 原样通过,同时作为输入去生成后段的缩放 s 和平移 t。它既没有被丢弃,也不是为了提取语义,更与对抗训练无关。

Q9. 标准化流相比 VAE 的优势有哪些?

多选题 · mid

  • A.精确似然而非下界← 正确答案
  • B.采样生成更加稳定← 正确答案
  • C.训练目标直接明确← 正确答案
  • D.完全无需可逆结构

答案:ABC。流模型给出精确对数似然而不是 ELBO 下界,采样只需一次前向传播,训练目标就是最大化似然,直接明了。D 错误,可逆结构是流模型的前提。

Q10. Glow 相比 RealNVP 新增的关键组件是?

单选题 · easy

  • A.仿射耦合层设计
  • B.一乘一可逆卷积← 正确答案
  • C.引入自注意力机制
  • D.引入深度残差连接

答案:B。Glow 的核心创新是用可学习的 1×1 可逆卷积替代 RealNVP 的固定特征置换,实现数据驱动的通道混合。仿射耦合层是两者共有,自注意力和残差连接不属于 Glow 的标志性改动。