面包房里,一块标准的圆形面饼被放在案板上——它厚薄均匀,每一小片面积完全相同。面包师的梦想,是把它变成一个轮廓复杂的“天鹅”饼干:有些部位要堆得厚实,有些部位要擀得轻薄。但他有一条铁律:所有动作必须可逆——擀开能擀回,折叠能展开,绝不丢弃任何一撮面团。每一道工序,他都在记账本上记下“这一小片面团被拉伸了几倍、压缩了几倍”。这样,无论工序多复杂,他都能从成品反推回到最初的面饼,并精确说出任意位置的厚度。这个故事就是“标准化流”(Normalizing Flow):从简单分布出发,用一串可逆变换塑形出任意复杂分布;而“变量替换定理”(Change of Variables)就是那本账本——它用雅可比行列式记录每个局部被放大或缩小的倍数,从而精确计算任意点的概率密度。因为每一步都可逆、每一笔账都清楚,Flow 成为唯一能提供精确对数似然的生成模型。

岗位关联

掌握 Change of Variables 与雅可比行列式,你就能在生成模型选型中看清何时该用精确似然,并为密度估计、异常检测等工业落地提供理论支撑。

目录
  1. 可视化演示
  2. 生成模型谱系
  3. 变量替换定理
  4. 雅可比行列式
  5. 可逆变换设计
  6. 多层变换组合
  7. 最大似然训练
  8. 应用与局限
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

生成模型谱系

面包房里有三种明星产品,对应三类生成模型。VAE 像一台“估重机”:它不精确称重,而是猜一个大致范围(似然下界),速度快但有偏差。GAN 像师徒对练:师傅捏造型,徒弟挑毛病,成品越来越逼真,但没人能说出“这团面到底有多重”——它根本不计算概率。Flow 则是那位拿记账本的面包师,每一克都算得清清楚楚。

生成模型的任务,是学出数据分布并评估样本出现的概率。VAE 优化对数似然的下界(ELBO),GAN 用对抗博弈绕过似然,Flow 则让“模型认为某个样本出现的概率”能被精确计算。

给定 N 个训练样本,经验对数似然是:

所以选模型先问一句:你要不要精确账本?要异常检测、密度打分,选 Flow;要最快出图,选 GAN;要平滑潜空间且能忍受近似,选 VAE。账本的选择,就是生成模型选型的第一步。

LMLE=1N∑i=1Nln⁡pθ(xi)\displaystyle \mathcal L_{\text{MLE}}=\frac{1}{N}\sum_{i=1}^{N}\ln p_{\theta}(\mathbf x_i)
通俗说明:从真实数据里随机抽 N 个样本,把每个样本“出现概率的对数”取平均,就是我们要最大化的目标——面包师要让真天鹅照片的“称重分”最高。
  1. 样本平均对数据集里 N 个样本逐个打分后求平均,相当于让每位顾客都为成品称重。
    1N∑i=1N(⋅)\displaystyle \frac{1}{N}\sum_{i=1}^{N}(\cdot)
  2. 对数似然$\ln p_{\theta}(\mathbf x_i)$ 衡量模型认为该样本出现的概率,取对数后乘法变加法,数值更稳定。
    ln⁡pθ(xi)\displaystyle \ln p_{\theta}(\mathbf x_i)
  3. 最大化目标调整模型参数让平均分最高,这正是“最大似然估计”的名字由来。
    max⁡θLMLE\displaystyle \max_{\theta}\mathcal L_{\text{MLE}}

变量替换定理

面包师在面饼上标满坐标网格,每个点有唯一编号。一次擀面,编号为 $\mathbf z$ 的点移动到新位置 $\mathbf x=f(\mathbf z)$。因为动作可逆,看到成品坐标,他总能倒推回原始编号 $\mathbf z=f^{-1}(\mathbf x)$。这就是变量替换的直观画面。

但关键问题是:擀完后,原本均匀的厚度变得参差不齐。直接“把成品坐标代入原始分布”是错的——因为面饼被摊开或挤堆时,同一片概率质量被摊到了更大或更小的面积上。Change of Variables 定理给出了修正配方:

这个公式是 Flow 的基石:只要 $f$ 可逆且光滑,任何复杂分布都能由简单分布“搬运”而来,且密度可以精确反推。面饼的每一笔账,都从这一行公式开始。

px(x)=pz(f−1(x)) ∣det⁡Jf−1(x)∣\displaystyle p_{\mathbf x}(\mathbf x)=p_{\mathbf z}\big(f^{-1}(\mathbf x)\big)\,\left|\det J_{f^{-1}}(\mathbf x)\right|
通俗说明:成品某处的厚度 = 原始面饼在该点的厚度 ÷ 局部被拉伸的倍数。
  1. 逆变换代入$\mathbf z=f^{-1}(\mathbf x)$ 把成品坐标还原为面团坐标,才能查这一小片“原本有多厚”。
    z=f−1(x)\displaystyle \mathbf z=f^{-1}(\mathbf x)
  2. 雅可比修正$\left|\det J_{f^{-1}}(\mathbf x)\right|$ 是局部面积拉伸倍数;面积变大 N 倍,密度变 1/N,保证概率质量守恒。
    ∣det⁡Jf−1(x)∣\displaystyle \left|\det J_{f^{-1}}(\mathbf x)\right|
  3. 密度等式两处相乘,得到 $\mathbf x$ 点的真实密度——账本的第一行公式。
    px(x)=pz(z) ∣det⁡Jf−1(x)∣\displaystyle p_{\mathbf x}(\mathbf x)=p_{\mathbf z}(\mathbf z)\,\left|\det J_{f^{-1}}(\mathbf x)\right|

雅可比行列式

面包师想看某一小片面团被拉伸了几倍,做法很简单:在那片面团上画一个极小的正方形,擀完后它变成一个平行四边形,平行四边形面积除以正方形面积,就是局部拉伸倍数。这个“局部放大镜”的学名叫雅可比行列式。

高维情况下,变换 $f$ 的偏导数排成一个矩阵——雅可比矩阵 $J$;它的行列式的绝对值 $\left|\det J\right|$ 就是“体积伸缩倍数”。$\det=1$ 说明形状变了但面积不变;$\det=2$ 说明面积扩了一倍,密度降一半。

看到 $O(n^3)$ 就知道,光有“放大镜”还不够,必须设计便宜好算的放大镜——这正是下一节耦合层登场的理由。面包师换了一把“秒读”的卷尺。

∣det⁡Jf(z)∣=∣det⁡(∂f1∂z1⋯∂f1∂zn⋮⋱⋮∂fn∂z1⋯∂fn∂zn)∣\displaystyle \left|\det J_f(\mathbf z)\right|=\left|\det\begin{pmatrix}\dfrac{\partial f_1}{\partial z_1}&\cdots&\dfrac{\partial f_1}{\partial z_n}\\[4pt]\vdots&\ddots&\vdots\\[4pt]\dfrac{\partial f_n}{\partial z_1}&\cdots&\dfrac{\partial f_n}{\partial z_n}\end{pmatrix}\right|
通俗说明:矩阵的每个格子记录“一个方向的微小变化会引起另一个方向多大变化”,行列式把这些方向综合成总体积缩放倍数。
  1. 偏导数矩阵$J_{ij}=\dfrac{\partial f_i}{\partial z_j}$ 表示第 $j$ 个输入变化对第 $i$ 个输出的影响强度。
    Jij=∂fi∂zj\displaystyle J_{ij}=\frac{\partial f_i}{\partial z_j}
  2. 行列式取绝对值负行列式只表示方向翻转,密度只关心缩放倍数,所以取绝对值。
    ∣det⁡J∣\displaystyle \left|\det J\right|
  3. 计算代价一般 $n\times n$ 矩阵求行列式是 $O(n^3)$,高维数据(如图像)直接计算几乎不可行。
    O(n3)\displaystyle O(n^{3})

可逆变换设计

面饼房的规矩写在墙上:第一,不能甩掉面团渣——信息不丢,变换可逆;第二,擀面杖不能有毛刺——函数光滑可微,梯度才传得动;第三,放大镜要秒读——行列式必须便宜。能满足三条的招牌工具,是“仿射耦合层”。

耦合层的思路很巧妙:把输入切成前后两半。前半直接复制到输出;后半用“前半提供的条件”做缩放和平移。如此设计,反变换只依赖前半(没被改动的部分),永远可解:

网络本身不需要可逆,只需 $s>0$ 且光滑——这是一项天才工程:用“任何 MLP”当缩放平移器,却保证整体变换严格可逆。面饼房的规矩因此轻松达成。

x1:d=z1:d,xd+1:D=s(z1:d)⊙zd+1:D+t(z1:d)\displaystyle \mathbf x_{1:d}=\mathbf z_{1:d},\qquad \mathbf x_{d+1:D}=s(\mathbf z_{1:d})\odot \mathbf z_{d+1:D}+t(\mathbf z_{1:d})
通俗说明:前半原封不动当“说明书”,后半照着说明书做“缩放加平移”;返回时先读说明书,再反解后半。
  1. 前半复制$\mathbf x_{1:d}=\mathbf z_{1:d}$,前 $d$ 维不经过任何网络,天然可逆。
    x1:d=z1:d\displaystyle \mathbf x_{1:d}=\mathbf z_{1:d}
  2. 缩放向量$s(\cdot)$ 由神经网络从前半算出,逐元素乘以后半,决定每个维度的拉伸倍数。
    s(z1:d)⊙zd+1:D\displaystyle s(\mathbf z_{1:d})\odot \mathbf z_{d+1:D}
  3. 平移向量$t(\cdot)$ 同样由网络给出,控制分布的均值位置。
    t(z1:d)\displaystyle t(\mathbf z_{1:d})
  4. 三角雅可比由于前半不过变换,雅可比矩阵呈三角结构,行列式等于各 $s_i$ 的乘积,$O(n)$ 秒算。
    det⁡J=∏i=1D−dsi\displaystyle \det J=\prod_{i=1}^{D-d}s_i

多层变换组合

一次擀面只能把圆饼变椭圆,做天鹅需要十几道工序:擀、折、压、叠。每一道工序都是可逆操作,最终形状就是这些工序的复合:$f=f_K\circ\cdots\circ f_1$。Flow 的“流”字,正源于这种层层流过水闸的塑形过程。

复合变换的放大镜倍数怎么算?第一道把面饼拉伸 3 倍,第二道在已拉伸的基础上再放大 2 倍,总共 $3\times2=6$ 倍——是相乘,不是相加。多层的总行列式等于各层行列式的乘积;取对数后才变为求和:

每层变换虽然简单,但层层堆叠并交替置换输入顺序,整体表达力呈指数级增长——就像普通厨师的十几道工序,也能捏出以假乱真的天鹅。账本一页页相加,依然分毫不差。

ln⁡∣det⁡Jf(z)∣=∑k=1Kln⁡∣det⁡Jfk(zk)∣,zk=fk∘⋯∘f1(z)\displaystyle \ln\left|\det J_{f}(\mathbf z)\right|=\sum_{k=1}^{K}\ln\left|\det J_{f_k}(\mathbf z_k)\right|,\qquad \mathbf z_k=f_k\circ\cdots\circ f_1(\mathbf z)
通俗说明:连续拉伸的倍数相乘;取对数后连乘变连加,数值上更稳定,也便于梯度回传。
  1. 中间变量$\mathbf z_k$ 是第 $k$ 层的输入,等于前 $k-1$ 层复合作用的结果。
    zk=fk∘⋯∘f1(z)\displaystyle \mathbf z_k=f_k\circ\cdots\circ f_1(\mathbf z)
  2. 行列式乘积复合函数的雅可比行列式是每层行列式的乘积(链式法则),即总拉伸倍数连乘。
    det⁡Jf=∏k=1Kdet⁡Jfk\displaystyle \det J_{f}=\prod_{k=1}^{K}\det J_{f_k}
  3. 对数化求和取对数化乘为加,避免数值上溢或下溢,训练时每层只需累加自己的 $\ln\left|\det J\right|$。
    ln⁡det⁡Jf=∑k=1Kln⁡det⁡Jfk\displaystyle \ln\det J_f=\sum_{k=1}^{K}\ln\det J_{f_k}

最大似然训练

面包师终于开始卖天鹅饼干。他邀请顾客打分:这团面像不像天鹅?Flow 的打分方式不是目测,而是精确称重——把成品按可逆工序一步步还原成标准圆饼,沿途记录每一步的拉伸倍数,最终算出“这团面出现的概率”。

训练就是调整每道工序的参数(即网络参数),让所有真实天鹅样本的分数都尽可能高。目标函数直接来自 Change of Variables,每个样本的 $\ln p(\mathbf x)$ 都能精确计算,然后做梯度上升:

对比之下,VAE 需要额外训练一个编码器去猜后验,Flow 的“编码器”就是解码器的逆——一套网络双向使用,参数省一半。顾客评分等于精确称重,分数收敛处即工序大成。

LFlow=−1N∑i=1N[ln⁡pz(f−1(xi))−ln⁡∣det⁡Jf(zi)∣],zi=f−1(xi)\displaystyle \mathcal L_{\text{Flow}}=-\frac{1}{N}\sum_{i=1}^{N}\Big[\ln p_{\mathbf z}\big(f^{-1}(\mathbf x_i)\big)-\ln\left|\det J_f(\mathbf z_i)\right|\Big],\qquad \mathbf z_i=f^{-1}(\mathbf x_i)
通俗说明:负对数似然越小越好;它等于“还原后的标准面饼得分”减去“沿途记录的拉伸校正”。
  1. 逆向还原每个训练样本 $\mathbf x_i$ 先过逆变换回到潜变量 $\mathbf z_i$。
    zi=f−1(xi)\displaystyle \mathbf z_i=f^{-1}(\mathbf x_i)
  2. 潜变量得分$\ln p_{\mathbf z}(\mathbf z_i)$ 是标准分布(如标准正态)给还原后面团的分数。
    ln⁡pz(zi)\displaystyle \ln p_{\mathbf z}(\mathbf z_i)
  3. 伸缩校正$-\ln\left|\det J_f(\mathbf z_i)\right|$ 补偿各层拉伸,保证概率质量守恒。
    −ln⁡∣det⁡Jf(zi)∣\displaystyle -\ln\left|\det J_f(\mathbf z_i)\right|
  4. 梯度优化整个目标对网络参数可微,用 SGD 或 Adam 端到端更新所有工序参数。
    θ←θ+η∇θln⁡px(xi)\displaystyle \theta\leftarrow\theta+\eta\nabla_{\theta}\ln p_{\mathbf x}(\mathbf x_i)

应用与局限

面饼房生意兴隆,但老板立了两条规矩:面团总重量守恒,1 公斤面不能变 2 公斤——对应 Flow 的维度约束:$\dim(\mathbf z)=\dim(\mathbf x)$,可逆变换不能升维或降维;每道工序都要花时间读放大镜——雅可比计算成本随维度与层数上涨。

精确似然带来两把金钥匙:第一,密度估计——给任何样本一个概率分,低分即异常;第二,可逆推断——生成与编码共用同一网络,前向是生成,反向是编码。局限同样源于可逆:网络结构受限、维度锁死、高分辨率生成常输给 GAN 或扩散模型。

选型结论浮出水面:要“精确概率账本”时选 Flow——异常检测、密度估计、可逆编码;要最高画质图像时选 GAN。Flow 也许捏不出最华丽的天鹅,但它的每一克重量都算得明明白白,这正是工业界信任它的理由。

dim⁡(z)=dim⁡(x)\displaystyle \dim(\mathbf z)=\dim(\mathbf x)
通俗说明:想压缩维度就必然丢失信息,那就不是“可逆”了;Flow 的潜空间与数据空间同维。
  1. 等维映射双射要求 $\mathbf z$ 与 $\mathbf x$ 元素个数相同。
    dim⁡(z)=dim⁡(x)\displaystyle \dim(\mathbf z)=\dim(\mathbf x)
  2. 信息守恒每个 $\mathbf x$ 唯一对应一个 $\mathbf z$,不增不减,信息零丢失。
    f:RD→RD\displaystyle f:\mathbb R^{D}\to\mathbb R^{D}

AI 应用场景

金融交易异常检测

阶段:模型训练与无监督密度估计推断

解决的问题:传统风控靠人工规则和阈值,无法覆盖新型欺诈,且欺诈标签稀少。Flow 在正常交易分布上训练精确对数似然,推理时给每笔交易一个概率分,低分样本即异常,输出可解释的置信度,而不是“拍脑袋”的阈值。

具体案例:某支付平台用 50 维交易特征训练 8 层仿射流,日处理千万笔交易。对每笔交易输出 $\ln p(\mathbf x)$,低于 P1 分位阈值即转人工复核,召回率比统计方法提升约 30%,且误报率可控。

图像生成与隐空间编辑选型

阶段:生成式建模与部署选型

解决的问题:GAN 没有编码器,想做图像属性编辑需额外训练编码器或在隐空间反复优化;Flow 的可逆性让“编码=解码的逆”,一次前向就能得到隐变量 $\mathbf z=f^{-1}(\mathbf x)$,编辑后再用 $f(\mathbf z)$ 生成。

具体案例:人脸属性编辑模型(Glow 类)把真实人脸编码到隐空间,加减“微笑方向”向量后解码,得到自然的编辑结果;同一套网络完成编码和解码,无需额外网络,且每一步变换都可逆,编辑过程可解释。

数据科学生成式建模技术选型

阶段:技术选型与模型评估

解决的问题:团队在 VAE、GAN、Flow 之间摇摆不定。需要精确概率评分的任务(如保险定价、稀疏数据处理)选 Flow;需要逼真合成图像增强数据选 GAN;需要平滑潜空间做插值选 VAE。选型依据来自三者的“账本精确度”差异。

具体案例:某保险公司用 Flow 对理赔金额分布做密度估计,得到连续概率密度函数用于定价与分层;同时用 GAN 合成困难样本训练理赔审核分类器,两条管线各得其所。

Python 演示

python61 行
"""一维标准化流: 用 Change of Variables 拟合偏态数据"""import numpy as npimport matplotlib.pyplot as plt  def log_std_normal(z):    # 标准正态分布的对数密度    return -0.5 * z * z - 0.5 * np.log(2 * np.pi)  def forward(a, b, z):    # 可逆变换 x = b + a * exp(z), 导数 a * exp(z) = x - b    return b + a * np.exp(z)  def inverse(a, b, x):    # 逆变换 z = log((x - b) / a)    return np.log(x - b + 1e-8) - np.log(a)  def log_det(a, b, x):    # 一维雅可比行列式的对数, 即 log|dx/dz| = log(x - b)    return np.log(x - b + 1e-8)  def log_prob(a, b, x):    # 变量替换定理: p_x(x) = p_z(z) / |dx/dz|    z = inverse(a, b, x)    return log_std_normal(z) - log_det(a, b, x)  def grad_log_prob(a, b, x):    # 对数似然对参数 a、b 的解析梯度    z = inverse(a, b, x)    g_a = z / a    g_b = (z + 1) / (x - b)    return g_a, g_b  # 从模型同族分布采样训练数据: x = 0.2 + 1.2 * exp(z), z ~ N(0,1)rng = np.random.default_rng(42)x_train = 0.2 + 1.2 * np.exp(rng.standard_normal(4000)) a, b = 1.0, -0.5lr, epochs = 0.005, 300for _ in range(epochs):    ga, gb = grad_log_prob(a, b, x_train)    a = a + lr * ga.mean()    b = b + lr * gb.mean() print("learned a=%.3f b=%.3f" % (a, b))print("avg log-likelihood=%.3f" % log_prob(a, b, x_train).mean()) # 对比: 学到的密度曲线 vs 训练数据直方图x = np.linspace(0.1, 8.0, 500)pdf = np.exp(log_prob(a, b, x))plt.hist(x_train, bins=60, density=True, alpha=0.5, label="data")plt.plot(x, pdf, label="flow pdf")plt.legend()plt.savefig("flow_demo.png")plt.close()
目的:用一个一维可逆变换实现完整的 Change of Variables 训练闭环——从数据采样、逆变换、雅可比校正到参数梯度上升,验证 Flow 能精确拟合偏态分布。
  1. x_train = 0.2 + 1.2 * np.exp(rng.standard_normal(4000))从已知可逆族生成数据,方便验证学到的 a、b 是否回到 1.2 和 0.2。
  2. return log_std_normal(z) - log_det(a, b, x)变量替换公式的代码化身:原密度减去拉伸校正。
  3. g_a, g_b = grad_log_prob(a, b, x_train)对整批样本解析求梯度,比数值差分更稳更快。
  4. a = a + lr * ga.mean()梯度上升更新可逆变换的参数,这就是最大似然训练的本质。
  5. plt.plot(x, pdf, label="flow pdf")画出学到的精确密度,与数据直方图对比验证拟合效果。

常见误区

误区“反正是个常数,不乘它概率也能归一化吧?生成模型里细节不重要。”初学者常把 $\log\left|\det J\right|$ 当正则项丢掉,或天真地期待它约等于 1。

正解它是变量替换的命门。把面饼拉伸 3 倍,同一位置的厚度必须变成 1/3,否则概率质量不守恒($\int p\neq1$),模型学到的根本不是合法分布;同时梯度也会失真,训练无法收敛到正确参数。忽略行列式,相当于把拉薄后的面饼按原厚度记账,账本彻底失平。

为何常见:一维微积分里“换元后直接代入”的直觉太强,忘了雅可比;而深度学习的 loss 里项很多,初学者分不清哪项是核心哪项是辅助。

误区“把 z 扔进 MLP 得到 x,这不就是流吗?反向传播不就能训练?”

正解普通 MLP 不是双射:不同 z 可能撞到同一个 x,信息丢失后无法还原。Flow 必须严格可逆,且正逆两个方向都要能计算。工程上多用仿射耦合层等专门结构——网络本身无需可逆,但整体变换必须可逆,这是硬约束。

为何常见:深度学习里“万能函数近似”的直觉深入人心,忽略了可逆是流模型区别于普通神经网络的命根子。

误区“VAE 算不出真似然,GAN 更是瞎猜,那所有生成任务都用 Flow!”

正解精确似然有代价:维度必须相等、可逆结构限制表达力、雅可比计算开销高。高分辨率图像生成中,GAN 和扩散模型效果往往更好;Flow 适合密度估计、异常检测、可逆编码等“要概率分”的场景。选型要看任务是“要账本”还是“要画质”。

为何常见:只看到“精确”两个字的光环,没算可逆性与算力的账,忽视了每种模型各有主场。

误区“三层变换,每层拉伸 2 倍,总共 2+2+2=6 倍,和乘法一样啊。”初学者容易把乘积记成加法。

正解面积变换是乘性的:先拉伸 2 倍、再拉伸 3 倍,总倍数是 $2\times3=6$ 而不是 5,因为第一层的拉伸会被第二层继续放大。取对数后 $\ln6=\ln2+\ln3$,这才是“对数域相加”的来源,训练里用加法只是为了数值稳定。

为何常见:对数似然公式里净是加号(求和符号),让初学者误以为行列式本身也相加。

误区“生成模型不都学个低维潜变量吗?Flow 也能做 autoencoder 式降维。”

正解双射要求 $\dim(\mathbf z)=\dim(\mathbf x)$。可逆变换是等维映射,不能压缩维度;要降维需要“潜变量 + 边缘化”这类近似方法(VAE 正是如此)。Flow 的潜变量维度和数据一样,这也是它计算昂贵的根源之一。

为何常见:与 VAE 的“低维潜变量”心智模型混淆,忘了可逆就意味着信息零丢失、维度自然锁死。

面试题

Q1. 标准化流最核心的理论依据是什么?

单选题 · easy

  • A.贝叶斯定理与先验假设
  • B.变量替换下的密度变换← 正确答案
  • C.大数定律的样本平均
  • D.中心极限定理的近似

答案:B。流的全部公式都建立在 Change of Variables 上——把简单分布的密度“搬运”到复杂分布。贝叶斯定理用于推断后验,大数定律用于蒙特卡洛估计,中心极限定理是统计近似,都不是流模型的支柱。

Q2. 变量替换公式中,密度的校正因子是什么?

单选题 · easy

  • A.变换向量的梯度范数
  • B.雅可比行列式的绝对值← 正确答案
  • C.协方差矩阵的迹的大小
  • D.海森矩阵的特征值大小

答案:B。变换拉伸局部面积 N 倍,密度必须除以 N,这个 N 就是 $\left|\det J\right|$。梯度范数管梯度大小,协方差和海森矩阵分别是二阶统计量与二阶导数,都不直接校正密度。

Q3. 设 z~N(0,1),x=2z+3,那么在 x=5 处 p_x 的值是?

单选题 · mid

  • A.p_z(0),即标准正态在原点的值
  • B.p_z(1),与标准正态密度相同
  • C.p_z(1)/2,密度因拉伸减半← 正确答案
  • D.2·p_z(1),密度因压缩加倍

答案:C。x=5 对应 z=1;$\left|dx/dz\right|=2$,面饼被拉伸 2 倍,密度减半。忽略行列式会得到 B,方向弄反会得到 D。A 错在把坐标代错位置。

Q4. 关于标准化流的可逆性要求,下列说法正确的是?

单选题 · mid

  • A.只要求前向变换可以计算即可
  • B.只要求雅可比行列式不为零即可
  • C.只要求在训练阶段保持可逆即可
  • D.要求双射且正反向都可得计算← 正确答案

答案:D。流要求严格双射,$f$ 和 $f^{-1}$ 都要能用、可微。$\det\neq0$ 只是可逆的必要条件之一;训练时可用不代表推理时也成立。面饼必须“揉出去”也能“揉回来”。

Q5. 多层可逆变换的复合雅可比行列式如何计算?

单选题 · mid

  • A.各层行列式取最大值项
  • B.各层行列式直接求和取平均
  • C.各层行列式取对数后求和← 正确答案
  • D.各层行列式乘积再求平方根

答案:C。连续拉伸的倍数是乘性的:$3\times2=6$。取对数后才变成加法,所以严格说是“行列式相乘,对数相加”。A、B、D 都不符合链式法则。

Q6. 仿射耦合层中,为什么让前半维直接复制不动?

单选题 · hard

  • A.使雅可比矩阵为三角阵,行列式秒算← 正确答案
  • B.让网络表达能力提升数倍
  • C.避免训练时梯度爆炸与消失
  • D.使模型对输入维度不敏感

答案:A。前半不动让“被变换部分的反解”只依赖前半,同时雅可比呈三角结构,行列式等于对角线乘积,$O(n)$ 完成。耦合层的核心目的就是高效可逆 + 快算行列式。

Q7. 与 VAE、GAN 相比,标准化流最独特的优势是?

单选题 · mid

  • A.不需要设计任何网络结构
  • B.训练速度在所有生成模型中最快
  • C.对离散数据天然无需处理
  • D.提供精确可计算的对数似然← 正确答案

答案:D。因为所有变换可逆,$\ln p(\mathbf x)$ 能用变量替换公式精确算出。VAE 只给 ELBO 下界,GAN 不计算似然。网络结构仍需精心设计,速度也谈不上最快,离散数据同样要专门处理。

Q8. 标准化流对变换函数 f 有哪些要求?

单选题 · mid

  • A.变换必须是可逆的双射映射← 正确答案
  • B.变换应当光滑且处处可微← 正确答案
  • C.雅可比行列式应易于计算← 正确答案
  • D.变换必须是线性仿射函数

答案:ABC。双射保证信息不丢;光滑可微保证梯度可回传;行列式好算才能训练。非线性(如耦合层里 s、t 用神经网络)正是 Flow 表达力的来源,所以 D 错。

Q9. 下列哪些是 Flow 合适的应用或选型判断?

单选题 · hard

  • A.用对数似然做异常点检测← 正确答案
  • B.高分辨率图像生成优先选 Flow
  • C.需要精确密度估计与可逆编码← 正确答案
  • D.允许把数据压到任意低维空间

答案:AC。低似然等于异常,是 Flow 的招牌应用;可逆编码也是它独有的。高分辨率图像生成通常 GAN 或扩散模型更强;维度必须保持 $\dim(\mathbf z)=\dim(\mathbf x)$,不能随意压缩,D 错。

Q10. 哪些手段能降低雅可比行列式的计算开销?

单选题 · hard

  • A.设计三角结构的雅可比矩阵← 正确答案
  • B.用逐元素乘积代替全矩阵运算← 正确答案
  • C.完整 O(n³) 行列式直接算
  • D.使用仿射耦合层构造稀疏雅可比← 正确答案

答案:ABD。三角阵行列式等于对角线乘积,复杂度 O(n);耦合层天然给出这种结构。B 的逐元素对角计算正是耦合层的行列式求法。C 是反面教材——全矩阵 O(n³) 正是高维数据要避开的坑。