传说在古都深巷里,有一座神秘的折纸工坊。坊主“流光”大师能把一张平平整整的绢纸,折成振翅欲飞的仙鹤、盘踞生风的飞龙、层层叠叠的繁花;更神奇的是,任何一件成品,他都能沿着折痕逆序展开,分毫不差地还原成最初那张纸。学徒们问秘诀,大师只说了八个字:“折叠可逆,账目清楚。” 在生成模型的世界里,Glow 正是这样一门“天工折纸术”。它不像 GAN 那样靠对抗“捏造”,也不像 VAE 那样靠模糊“涂抹”,而是从一张简单的标准高斯“纸”出发,通过一串精确可逆的变换,把它折叠成逼真的人脸、风景与物体。因为每一步都可逆、每一道折痕的“面积变化”都能精确记账,Glow 的概率计算分毫不差——这正是它成为可逆生成模型代表作的根基。接下来,就让我们走进这座工坊,拆解 Glow 的每一道折痕。
对 AI 从业者而言,Glow 是理解“可逆生成模型”的最佳课堂:掌握变换链、耦合层与可逆卷积的设计思路,你就能在图像生成、风格混合、精确密度估计等任务中,构建既高效又可解释的生成系统。
可视化演示
展示Glow标准化流的变换链架构、可逆1x1卷积通道混合与仿射耦合层分维变换,交互切换查看各组件核心指标。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Glow标准化流变换链架构 可逆变换链将简单分布转换为复杂数据分布 每步包含1x1卷积+仿射耦合层+分裂操作 z=f(x)=f_L°...°f_1(x) 对数似然可精确计算支持高效采样与推断
流模型概览
学徒第一次走进工坊时,以为仙鹤是捏出来的。可大师当着他的面,把一只仙鹤“哗啦”一声展开——翅膀、脖子、尾巴全变成了一张素绢。原来,任何复杂作品都始于一张简单方纸,靠的是折叠,而非捏塑。这个动作让学徒恍然大悟:复杂可以从简单中来,只要每一步都留得住。
生成模型的任务,就是学会“造出”以假乱真的图像。主流路线各有各的绝活:GAN 像雕塑家与鉴定师相互博弈,VAE 像隔着毛玻璃作画,扩散模型像把墨迹一点点细化。而标准化流(Normalizing Flow)选择走大师的折纸路线:先假设一张“标准高斯纸”,再用一个可逆映射,把它折成我们想要的数据分布。它不捏、不擦、不磨,只折。
具体地说,Flow 学习一个光滑可逆的映射 f,把数据 x 映射到隐变量 z,并要求 z 服从标准高斯分布。因为 f 可逆,所以从 z 也能还原回 x;因为 f 可微,所以 x 的概率密度可以通过“变量替换公式”精确写出来。Glow 正是这样一套被精心构造的标准化流,它的名字也暗示着“发光”:用可逆性照亮生成过程。
如果把常规网络比作“捏泥巴”,那 Flow 就是折纸:前者一步步塑造却难回头,后者每一道折痕都可以原路返回。Glow 的整套设计都围绕“可逆”二字展开——正因为可逆,它才能把“简单纸张”变成“复杂艺术品”,再把账算得清清楚楚。
- 前向映射 f把真实图像 x 送进网络,逐层折叠,最后得到隐变量 z。
- 逆向映射 f⁻¹从隐变量 z 出发,沿折痕反向展开,还原出图像 x。
- 标准高斯约束要求 z 服从简单分布,这样“纸”是已知的、好采样的。
可逆变换链
大师从来不尝试“一步折出仙鹤”。他的手法是:先折出躯干,再折翅膀,再折头颈——几十道小折痕串成一条链,每一步都很简单,加起来却无比精妙。学徒问为什么不分大步走,大师笑道:“大步容易失手,小步才能步步留痕。”
单次变换的表达能力有限,标准化流同样把多个可逆层串成一条“变换链”:x → z₁ → z₂ → … → z_K = z。每一层负责一次温和的“折叠”,合起来就能表达非常复杂的分布。这也带来一个数学上的红利:概率密度的变化可以逐层追踪,像账本一样一目了然。
变量替换公式告诉我们:若 z = f(x),则 p_X(x) = p_Z(f(x)) · |det J_f|,其中 J_f 是雅可比矩阵。当 f 是多层复合时,雅可比矩阵是各层雅可比矩阵的乘积,行列式也就等于各层行列式的乘积——这正是“链式法则”。于是,总的对数似然等于各层贡献的简单求和。
就像账本上一行行记录每道折痕的面积变化,变换链也把每一步的“膨胀率”明确写了出来。这让 Glow 不仅会折,还知道每一折对最终概率贡献了多少——精确,是这门手艺的第一原则。
- 先验密度 p_Z(z)隐变量的已知概率密度(标准高斯),是“账”的起点。
- 连乘符号把所有层的“面积变化倍数”乘起来,因为链式法则把总行列式拆成了乘积。
- 雅可比行列式第 k 层变换的局部缩放倍数,衡量这层折叠让概率密度放大了多少。
仿射耦合层
折纸最难的一步是“悬空折叠”:没有参照,手就会抖。大师的秘诀是“以纸折纸”——左手按住右半张纸当标尺,右眼观察标尺的纹理,再决定左半张折多少、抬多高。这叫“耦合”:一半的信息,引导另一半的变形。
受此启发,Dinh 等人设计了仿射耦合层(Affine Coupling Layer),这是 Glow 的基本折叠单元。它先把数据按通道分成两份 x_a 和 x_b;其中 x_b 原封不动地通过(当作标尺),而 x_a 则根据 x_b 计算出的缩放因子 s 和平移量 t 进行仿射变换。
这个设计妙在两个地方:第一,逆变换极其简单——已知 y_b = x_b,先还原出 s、t,再让 x_a = (y_a − t) / s 即可;第二,雅可比矩阵是三角矩阵,行列式就是 s 各分量的乘积,计算成本几乎为零。也就是说,这个层既强劲又廉价,是“好折痕”的典范。
大师说“以纸折纸”的关键,在于标尺永远不动;耦合层里 x_b 原样通过,正是这条原则。只需把多层耦合串起来、让每层轮流当标尺,纸的每一个角落就都能被“折”到。
- 通道分裂把输入沿通道维度一分为二(x_a, x_b),前一半待变换、后一半当标尺。
- 缩放与平移s(x_b) 逐元素乘上 x_a,再加上 t(x_b),实现“参考另一半决定怎么折”。
- 标尺直通x_b 原样通过,保证信息完整保留,也为逆变换提供依据。
可逆1x1卷积
学徒练习了很久,发现总沿着同一条中线折叠,纸很快就叠成了厚厚的“纸砖”:有些地方永远折不到,有些地方越折越笨重。大师取出绢纸,先把它旋转一个角度再折,折痕立刻换了个方向,新造型层出不穷。
RealNVP 时代的耦合层,通道分裂方式是固定的:永远是前一半当标尺、后一半被变换。这就像永远沿同一条线折叠——许多通道要等很多层之后才“轮到”被变换。Glow 的突破,是在每个耦合层之前加入一个可逆 1×1 卷积,相当于把整张纸旋转一个学习到的角度,再做折叠。
可逆 1×1 卷积本质上就是一个可学习的可逆矩阵 W:y = Wx,对通道做线性混合(包括任意的置换)。因为是方阵且可逆,它的行列式可以精确计算;为了效率,Glow 还把 W 用 LU 分解参数化,把行列式的计算复杂度从 O(d³) 降到 O(d)。
从“固定折线”到“可学习转角”,Glow 在一张纸上找到了无限多的折叠方向。正是这个看似不起眼的“旋转”,让 Glow 的表达能力远超前辈,也让我们真正理解了什么叫“通道间的灵活置换”。
- 矩阵乘法W 是 d×d 可逆矩阵,把每个位置的 d 个通道线性混合,承担“旋转纸张”的角色。
- LU 分解把 W 拆成置换阵 P、下三角 L、上三角 U,其中 U 的对角元决定行列式。
- 行列式对数三角矩阵的行列式等于对角元乘积,所以 log|det W| 就是对 U 对角元取对数再求和,O(d) 完成。
对数似然目标
工坊有条家规:每件作品必须配一本账,记录每一折带来的面积变化。大师说,艺术可以自由,但账必须清楚——有了账,才能评判好坏、改进手法。学徒恍然大悟:原来大师的“随手一折”,背后都有一笔“精确的账”。
对生成模型而言,这本账就是“对数似然”。训练时,我们希望模型给真实图像打出很高的概率分,给乱涂乱画打出低分。Glow 因为每一步都可逆、每个行列式都算得清,可以把这张图像的“概率分”精确计算出来,而不是像 GAN 那样靠判别器估算、VAE 那样靠下界近似。
具体地,把变量替换公式取对数,就得到下面的训练目标:最大化这批真实数据的平均对数似然。梯度可以沿变换链反向传播,每一层的雅可比行列式都在账本上清晰可查。为了避免行列式出现零或负值,Glow 用 exp 类参数化保证缩放为正,用 LU 分解保证数值稳定——这些都是“记账”时的防错措施。
对 Glow 来说,“艺术”是生成逼真的图像,“账本”是精确的似然。翻账本就能定位哪一折出了问题,改进也就有了方向——这,就是可逆生成模型最迷人的工作方式。
- 取对数把概率密度的乘积变成求和,数值上更稳定,也便于梯度计算。
- 隐变量项z = f(x) 在标准高斯下的对数密度,代表“这张纸折完后落在哪”。
- 行列式求和每一层折叠的面积变化取对数后相加,就是整条链对概率的修正量。
采样与推断
学徒最佩服大师的一点:任何作品,大师闭着眼都能原路折回去,也闭着眼能原样展出来。折与展是同一套手法,只是方向相反。他说:“记住折痕,就不怕迷路。”
训练好的 Glow 也有两条路。第一条是“采样生成”:从标准高斯分布采一个随机隐变量 z(相当于抽一张白纸),然后沿变换链反向走——把每一层折叠的逆变换依次应用——就能得到一张全新图像。第二条是“推断编码”:把真实图像 x 沿前向走一遍,得到隐变量 z,这个 z 就是图像在“纸面坐标系”下的精确表示。
因为每层变换都是严格可逆的,采样和推断的计算成本完全相同,只是方向相反。这在生成模型中非常稀有:GAN 只能生成不能编码,VAE 只能编码不能精确重构,而 Glow 两样都做得干净利落。z 作为精确的隐表示,还可以用于图像压缩、特征提取、风格迁移等下游任务。
“记住折痕,就不怕迷路”——Glow 的双向行走能力,正是可逆性的直接回报。无论是创作新作品(采样),还是解读旧作品(推断),大师都能从容应对。
- 抽取白纸从标准高斯分布采样隐变量 z,作为随机种子。
- 逆向走链把 z 依次通过各层的逆变换 f⁻¹,一路“展开”成图像。
对比RealNVP
工坊里曾有位勤奋的学徒,设计了“固定折法”:永远把纸对半分开,左半折、右半当标尺。他也很努力,可作品总显得呆板。大师看后说:“标尺永远不动,纸就永远只有一半被折过。你得让每一次折叠都换个参照。”
这位学徒就是 RealNVP。它首次提出了耦合层,功不可没;但它的通道分裂是固定的——前一半永远被变换,后一半永远当标尺。虽然通过多层堆叠“轮流”分工,但通道之间的信息交流很慢,需要很深的网络才能让所有通道都被充分变换。
Glow 对此的改进直击要害:在每个耦合层前加一个可逆 1×1 卷积,让通道在每次“折叠”前先被重新洗牌(旋转)。于是这一层轮到谁当标尺、谁被变换,是由网络自己学出来的,而不是写死的。这种“灵活置换”让每层的变换都更充分,也带来了实实在在的生成质量提升。
大师的话成了工坊的箴言:“换一个角度,纸就有了新生命。”Glow 正是用可学习的角度旋转,解放了耦合层的表达力——这也是它与 RealNVP 最本质的分水岭。
- 固定分裂RealNVP 中 (x_a, x_b) 的分裂方式是固定的,永远前一半被变换。
- 可学习置换Glow 先用可逆矩阵 W 对通道做线性混合,再进入耦合层,让“谁当标尺”成为可学习的决策。
- 耦合层统一框架两种写法都用 Coupling 表示耦合层,突出差异仅在于前置是否做通道置换。
图像生成应用
工坊年展上,最令人惊叹的不是单件作品,而是一件“混血”作品:仙鹤的翅膀、飞龙的躯干、繁花的纹路,完美融于一体。大师解释:“折法是可以借用的。我在纸面上找到两件作品的'折痕坐标',再把坐标融合,就能折出全新的东西。”
这种“折痕坐标”就是隐变量 z。Glow 在人脸生成上大放异彩:OpenAI 的 Glow 模型在 CelebA-HQ 数据集上生成了 256×256 的逼真人脸,每一个样本都对应隐空间里的一个点。更重要的是,由于变换链可逆,隐空间具有良好的线性结构:两张图的隐变量做算术运算,在图像空间就会呈现对应的“语义混合”。
风格混合与插值因此变得优雅:对两张图分别取隐变量 z₁、z₂,按系数 α 加权平均,再逆向走链还原,就得到一张“既像 A 又像 B”的新图。同样,在隐空间沿着某个方向滑动,可以连续地改变人脸的表情、年龄、姿态。这些操作在 GAN 里需要精心调参,在 Glow 里却像折纸一样自然。
年展落幕时,学徒终于明白:大师的千变万化,从来不是什么玄学,而是一套可逆、可算、可拆解的工程艺术。Glow 教会我们的,正是把“创造”变成“可逆的折叠”——每个 AI 从业者,都可以在这套折纸术里,找到属于自己的那一道折痕。
- 两幅作品的坐标把图 A 和图 B 分别前向编码,得到隐变量 z₁、z₂。
- 线性混合按 α 在隐空间加权平均,得到折痕坐标的“中间态”。
- 还原图像把中间态逆向走链展开,得到融合了两种风格的新图。
AI 应用场景
影视级人脸生成
阶段:模型训练与推理生成
解决的问题:传统 GAN 生成人脸虽逼真但训练不稳定、易模式崩溃;VAE 生成的图像偏模糊。Glow 用可逆变换链直接最大化精确对数似然,训练稳定且能生成 256×256 高清人脸。
具体案例:OpenAI 的 Glow 模型在 CelebA-HQ 人脸数据集上训练后,从标准高斯隐变量采样,逆向走链即可生成清晰逼真的新人脸;还能在隐空间找到“微笑方向”“年龄方向”,实现自然的属性编辑,就像大师在纸面上调整某几道折痕。
图像风格混合与隐空间插值
阶段:特征表示与内容创作
解决的问题:设计师想创作“赛博朋克风格的中国山水”,传统方式难以量化“风格”。Glow 把图像编码成可逆隐变量,风格融合变成向量加减,直观且可解释。
具体案例:取两幅图的隐变量 z₁、z₂,按比例混合后逆向还原,即可得到风格逐渐过渡的图像序列;调整 α 可以得到介于两者之间的连续变化帧,用于广告、影视特效的创意生成,正如工坊里“借仙鹤翅膀折到飞龙身上”。
异常样本筛选与精确密度评估
阶段:模型评估与数据质量治理
解决的问题:在数据集中找出“不符合分布”的异常图像(模糊、损坏、伪造),传统分类器需要大量标注。Glow 直接输出精确对数似然,低分样本即为异常,且分数有清晰的数学含义。
具体案例:在内容审核平台,用 Glow 对上传图片打分,似然显著偏低的图片送入人工复核;由于批量行列式可精确计算,分数可解释、可对比,便于设定业务阈值。这就像大师翻账本:哪一折对不上,一眼就能揪出来。
Python 演示
import numpy as np def gaussian_logp(z): """标准高斯分布的 log 概率密度""" return -0.5 * (z ** 2).sum(axis=1) - 0.5 * z.shape[1] * np.log(2 * np.pi) class AffineCoupling: """仿射耦合层:前一半通道根据另一半的信息做缩放平移""" def __init__(self, d): self.d = d def _st(self, xb): # 真实实现中这里是一个小型神经网络,此处用简单函数演示 s = 0.3 * np.tanh(xb.sum(axis=1, keepdims=True)) t = 0.4 * np.sin(xb.sum(axis=1, keepdims=True)) return s, t def forward(self, z): half = self.d // 2 xa, xb = z[:, :half], z[:, half:] s, t = self._st(xb) ya = xa * np.exp(s) + t return np.concatenate([ya, xb], axis=1) def inverse(self, y): half = self.d // 2 ya, xb = y[:, :half], y[:, half:] s, t = self._st(xb) xa = (ya - t) * np.exp(-s) return np.concatenate([xa, xb], axis=1) def logdet(self, z): half = self.d // 2 xb = z[:, half:] s, _ = self._st(xb) return s.sum(axis=1) class Conv1x1: """可逆 1x1 卷积:可学习的方阵 W,承担通道置换与混合""" def __init__(self, d): self.W = np.eye(d) + 0.05 * np.random.randn(d, d) def forward(self, z): return z @ self.W def inverse(self, y): return y @ np.linalg.inv(self.W) def logdet(self, z): return np.full(z.shape[0], np.log(abs(np.linalg.det(self.W)))) class GlowMini: """迷你 Glow:交替堆叠 1x1 卷积与仿射耦合层""" def __init__(self, d, layers=3): self.layers = [] for _ in range(layers): self.layers.append(Conv1x1(d)) self.layers.append(AffineCoupling(d)) def forward(self, x): logdet = np.zeros(x.shape[0]) for layer in self.layers: x = layer.forward(x) logdet = logdet + layer.logdet(x) return x, logdet def inverse(self, z): for layer in reversed(self.layers): z = layer.inverse(z) return z def log_prob(self, x): """精确对数似然:log p(x) = log p(z) + log|det J|""" z, logdet = self.forward(x) return gaussian_logp(z) + logdet if __name__ == "__main__": flow = GlowMini(d=4, layers=3) x = np.array([[0.5, -0.2, 1.0, 0.3], [0.1, 0.9, -0.4, 0.7]]) z, logdet = flow.forward(x) x_round = flow.inverse(z) print("逆向还原最大误差:", np.abs(x_round - x).max()) print("log|det J|:", np.round(logdet, 4)) print("精确对数似然:", np.round(flow.log_prob(x), 4))
s, t = self._st(xb)由右半通道算出缩放与平移,模拟“以纸折纸”的标尺作用ya = xa * np.exp(s) + t仿射耦合前向变换:exp 保证乘数恒为正,层一定可逆xa = (ya - t) * np.exp(-s)逆变换:乘法变除法,一句话完成“展开”z @ self.W1×1 卷积就是矩阵乘法:给所有通道重新“洗牌”y @ np.linalg.inv(self.W)求逆还原:W 可逆是整条链可逆的前提logdet = logdet + layer.logdet(x)把每一层折叠的“面积变化账”累加起来return gaussian_logp(z) + logdet变量替换公式:先验 + 行列式 = 精确对数似然for layer in reversed(self.layers): z = layer.inverse(z)采样时倒着走完整条链
常见误区
误区初学者以为 Flow 里的所有模块(包括计算缩放 s 和平移 t 的网络)都必须严格可逆,否则整个模型就没法用了。
正解只有“外层变换”需要可逆。耦合层里,计算 s(x_b)、t(x_b) 的网络只是把 x_b 映射成两个向量,它本身完全不需要可逆——就像折纸时用标尺量长度,尺子不需要能被“反着量”。真正必须可逆的是“折叠动作”本身,即 y_a = s·x_a + t 这个变换,而它因为有 x_b 做参照,天然可逆。
为何常见:因为教材反复强调“可逆性”,初学者容易把可逆性误解为对每一个内部组件的要求,而忽略了 Flow 这种“外壳可逆、内芯自由”的分层设计。
误区有人以为 1×1 卷积跟普通卷积一样,只是对每个像素做“按通道加权求和”用于特征提取,没什么特别的。
正解在 Glow 里,可逆 1×1 卷积是“通道置换器”:它用可逆矩阵 W 对通道做线性混合,核心诉求是让耦合层每次面对不同的通道划分。它必须保障方阵可逆、行列式可算(LU 分解加速),而普通卷积既不要求可逆也不算行列式——两者目标完全不同。
为何常见:共享“卷积”这个名词,又都是通道维度的线性运算,容易让人忽略可逆性与行列式这两个决定性差异。
误区觉得 Glow 效果好纯粹是堆了更多层、更多参数,结构上没本质变化。
正解关键差异是“折叠角度”从固定变成可学习:RealNVP 的通道分裂固定,一半永远当标尺;Glow 在耦合层前用 1×1 卷积做通道置换,让每一层都能换新折线。这是结构性的改进,不是简单的“更深更大”。
为何常见:深度学习时代“大力出奇迹”的印象太深,容易把所有效果差异都归因于规模,忽略了架构设计的因果贡献。
误区认为可逆保证了无损,所以 Glow 生成质量必然碾压所有其他模型。
正解可逆保证的是“概率计算精确、双向变换无损”,不保证“学到的分布等于真实分布”。生成质量还受层数、通道宽度、训练数据、优化难度限制;Glow 在精致纹理和高分辨率上仍有短板。可逆性是一张“好牌”,但不是“必胜牌”。
为何常见:把“数学性质”与“工程效果”混为一谈——可逆性是个漂亮的理论保证,但实际生成质量是多种因素共同决定的。
面试题
Q1. Glow 中可逆 1×1 卷积的核心作用是什么?
- A.对输入图像进行空间下采样
- B.实现通道间可学习的置换混合← 正确答案
- C.增加卷积核的数量提取特征
- D.用非线性激活替代线性变换
答案:B。可逆 1×1 卷积用可学习矩阵 W 对通道做线性置换与混合,相当于折纸前先旋转纸面,使耦合层每层面对新的通道划分。A 是下采样,与通道置换无关;C 是普通卷积的动机;D 与可逆线性变换矛盾。
Q2. 标准化流(Normalizing Flow)生成数据的基本思路是什么?
- A.用马尔可夫链逼近复杂分布
- B.可逆链把简单分布映射到数据分布← 正确答案
- C.用对抗训练拟合真实图像分布
- D.对高维图像数据做聚类压缩
答案:B。Flow 从简单的标准高斯分布出发,通过一串可逆变换得到复杂数据分布,就像从一张方纸折成仙鹤。A 是扩散模型的思路;C 是 GAN 的思路;D 与生成任务无关。
Q3. Glow 中隐变量 z 被要求服从什么分布?
- A.均匀分布(区间 0 到 1)
- B.标准高斯分布(均值为 0)← 正确答案
- C.伯努利分布(取值 0 或 1)
- D.指数分布(恒为非负数)
答案:B。Glow 要求 z 服从标准高斯分布,因为高斯分布容易采样、密度可解析计算,相当于工坊里“已知的那张素绢”。A、C、D 都不是标准化流的默认先验。
Q4. 仿射耦合层 y_a = s(x_b)⊙x_a + t(x_b),y_b = x_b 的雅可比行列式为?
- A.s(x_b) 各分量之和
- B.s(x_b) 各分量的乘积← 正确答案
- C.t(x_b) 各分量之和
- D.恒等于 1(单位行列式)
答案:B。雅可比矩阵是分块三角矩阵,左上块是 diag(s),行列式等于 s 各分量的乘积。A 把“乘积”错写成“求和”;C 同理;D 只在 s 全为 1 时成立。
Q5. Glow 用 LU 分解参数化 1×1 卷积的主要目的是什么?
- A.扩大卷积核的感受野范围
- B.把行列式降到 O(d) 量级计算← 正确答案
- C.让卷积的变换变得不可逆
- D.大幅增加模型参数的总量
答案:B。三角矩阵的行列式等于对角元乘积,LU 分解后 log|det W| 只需对 U 的对角元求和,从 O(d³) 降到 O(d)。A 与矩阵分解无关;C 恰恰相反;D 不是目的。
Q6. 关于 Glow 的对数似然计算,正确的说法是?
- A.用变量替换公式精确计算← 正确答案
- B.需要蒙特卡洛近似采样
- C.等于 p(z) 加各层行列式对数之和← 正确答案
- D.与变换网络层数完全无关
答案:AC。Glow 每层可逆、行列式可算,所以 log p(x) = log p(z) + Σ log|det J| 可精确计算,无需采样近似。B 是 VAE 等模型的无奈;D 错,层数直接决定行列式求和项数,就像账本的行数决定账目内容。
Q7. 训练好的 Glow,可以完成哪些操作?
- A.从高斯采样逆向展开生成图像← 正确答案
- B.把真实图像前向编码为隐变量← 正确答案
- C.在隐空间插值实现风格混合← 正确答案
- D.直接对图像做有损压缩编码
答案:ABC。采样 = 逆向走链;编码 = 前向走链;风格混合 = 隐空间插值后还原。D 错:可逆变换是无损的,不是有损压缩,信息不会丢失。
Q8. 关于 RealNVP 与 Glow 的区别,正确的有?
- A.RealNVP 的通道分裂方式固定← 正确答案
- B.Glow 用 1×1 卷积做通道置换← 正确答案
- C.两者的耦合层结构完全不同
- D.谁当标尺变成可学习决策← 正确答案
答案:ABD。RealNVP 永远按固定方式分裂通道,折线不变;Glow 在耦合层前用 1×1 卷积旋转纸面,让通道置换和“谁当标尺”都由网络学习。C 错:两者核心都使用耦合层,只是 Glow 多了前置置换。
Q9. 若某一层变换满足 log|det J| > 0,说明该变换?
- A.使体积收缩,密度贡献为负
- B.使体积膨胀,密度贡献为正← 正确答案
- C.对概率密度没有任何影响
- D.说明该变换一定不可逆
答案:B。|det J| > 1 表示变换把局部体积放大,log|det J| > 0 给对数似然带来正贡献,就像折纸把纸面“撑开”了一块。A 是 log det < 0 的情形;C 错,行列式必然影响密度;D 混淆概念,行列式非零即可逆,正负皆可。
Q10. 设 Glow 某子块由两层组成:先是 1×1 卷积(log|det W| = 2),再是耦合层(log|det J_c| = 1)。某点处 p_Z(z) = 0.05,则 p_X(x) 约为?
- A.约 0.05,行列式不影响概率密度
- B.约 0.14,只算一层行列式贡献
- C.约 1.00,先验与两层贡献相乘← 正确答案
- D.约 20.09,漏乘先验密度
答案:C。由变量替换公式,log p_X = log p_Z + 2 + 1 = log 0.05 + 3,故 p_X = 0.05 × e³ ≈ 1.00。A 错在忽略行列式;B 只乘了 e¹ ≈ 2.72;D 少了先验 0.05。这道题对应正文“对数似然目标”一节的核心公式。