想象一位顶级的调酒师,面前摆着C瓶颜色各异的基酒,它们代表神经网络里C个通道的信息。他的任务不是简单调一杯酒,而是要把这些基酒倒来倒去、混合再分装,最终让酒柜呈现出想要的“风味分布”。但这家酒吧有一条铁规矩:每一次混合操作都必须能完整还原——因为最终结账时要倒推每一步,精确算出这杯酒里每种基酒的“概率贡献”。这条规矩在深度学习里叫“标准化流”(Normalizing Flows):用一串可逆变换,把简单的概率分布一步步塑造成复杂的数据分布。 调酒师先学会了最笨的“换瓶子”:1号跟2号换、3号跟4号换,这叫固定置换,简单但死板。后来他得到一张神奇的“混合配方表”W——也就是可逆1x1卷积——每个输出瓶子里的酒,是所有输入瓶子按比例混合的产物。只要配方不塌缩(行列式非零),想还原随时可以。更妙的是,他还把复杂的配方拆成“先换序、再逐瓶混入、最后调比例”三步工序(LU分解),让“体积账”(行列式)的核账成本从清点整间仓库,变成只看几个标签。Glow模型能在大规模图像生成中又快又准,秘密就在这里。

岗位关联

掌握可逆1x1卷积,是读懂Glow等流模型“灵活混合+低成本可逆”设计哲学的关键,也是生成模型研究者理解密度估计与精确似然训练的基本功。

目录
  1. 可视化演示
  2. 标准化流基石
  3. 卷积矩阵本质
  4. 可逆性满秩条件
  5. LU分解降开销
  6. 行列式快速算法
  7. 固定置换升级
  8. Glow工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

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

标准化流基石

调酒师的配方簿上写着一行行“记账规则”:每做一次混合,都要记下这杯酒里每种基酒的“占比变化”。如果某一步只换瓶子不混合,账很好记;但如果想做更复杂的调制,就得保证每一步都“可逆”——能从成品倒推回原料。标准化流就是把这种记账逻辑搬进神经网络:模型由一串可逆函数组成,输入数据x经过层层变换,最终变成一个简单分布(比如高斯分布)里的z。关键就在“可逆”二字:只有一一映射,才能用变量替换定理精确计算对数似然。

在流模型中,每一次可逆变换都会改变数据的概率密度。假设变换为f,输入密度是p_x(x),输出密度是p_z(z),两者之间隔着一个“体积膨胀率”——雅可比行列式。你可以把它理解成调酒时“这一杯总量被放大了多少倍”:如果体积膨胀,单位体积里的“风味浓度”自然就变稀了。公式如下:

Glow模型把这条“记账规则”用在通道维度上。它的每一层基本结构是:先做激活归一化,再做可逆1x1卷积,最后接仿射耦合层。其中可逆1x1卷积负责让C个通道的信息充分混合——就像调酒师把C瓶基酒按配方倒在一起再分装,让彼此“认识”彼此。这件事看似简单,却是整个流模型能否表达复杂分布的关键。

回到比喻:如果调酒师每一步都只换瓶子不混合,那成品永远只是基酒的排列组合,层次感十分有限;可逆1x1卷积让他敢于“真混合”,因为配方表保证了一切都能原样还原,账本清清楚楚。

log⁡pz(z)=log⁡px(x)−log⁡∣det⁡(Jf)∣\log p_z(z) = \log p_x(x) - \log |\det(J_f)|
这个式子说:每过一次变换,对数概率密度就减去对数体积变化量。雅可比行列式就是“体积账本”。
  1. p_x(x)输入数据x的概率密度,相当于调酒前每种基酒的“浓度”。
    px(x)\displaystyle p_x(x)
  2. p_z(z)经过变换后z的概率密度,即成品酒的风味浓度。
    pz(z)\displaystyle p_z(z)
  3. det(J_f)雅可比行列式,衡量变换f在x处的体积膨胀倍数。
    det⁡(Jf)=∣∂z1∂x1⋯∂z1∂xC⋮⋱⋮∂zC∂x1⋯∂zC∂xC∣\displaystyle \det(J_f) = \left|\begin{matrix}\frac{\partial z_1}{\partial x_1} & \cdots & \frac{\partial z_1}{\partial x_C}\\ \vdots & \ddots & \vdots \\ \frac{\partial z_C}{\partial x_1} & \cdots & \frac{\partial z_C}{\partial x_C}\end{matrix}\right|
  4. 减号与对数膨胀时密度被稀释,所以用减号;取对数把乘法变加法,数值更稳定。
    log⁡∣det⁡(Jf)∣\displaystyle \log |\det(J_f)|

卷积矩阵本质

调酒师手里的“混合配方表”长什么样?它是一张C行C列的表格W:第i行第j列的数字,表示第j瓶基酒往第i个新瓶子里倒多少比例。有了这张表,每个输出瓶子的内容就是所有输入瓶子按列取数、加总混合。这张配方表在数学上就是权重矩阵W——可逆1x1卷积的核心。

所谓1x1卷积,是指卷积核的空间尺寸是1×1,它不扫描邻域像素,只在通道维度上做“全连接混合”。对特征图某个空间位置上的向量x(长度为C),1x1卷积输出y(长度也是C),两者的关系就是一次矩阵乘法:

在Glow中,这一步对特征图的每个空间位置同时生效,相当于把所有像素的通道都做一次相同的“统一配方混合”。由于卷积核只有1×1,它不改变空间尺寸,只改变通道之间的信息分布——这正是它在标准化流中承担“通道混洗”职责的原因。

调酒师发现,这张配方表比“换瓶子”高级得多:换瓶子只能整体对调,而配方表可以让每一种基酒的味道渗透到所有输出瓶子里。1x1卷积的"1",恰恰意味着它专注做通道混合这一件事,把空间信息留给其他组件去处理。

y=Wxy = W x
这里x是某像素上C个通道的值,W是C×C的混合矩阵,y是混合后的新通道值。卷积核1x1意味着每个空间位置独立执行这条公式。
  1. 输入向量x某像素位置上C个通道的取值,好比C瓶基酒各自的分量。
    x=[x1,x2,…,xC]T\displaystyle x = [x_1, x_2, \dots, x_C]^T
  2. 权重矩阵WC×C配方表,第(i,j)个元素是“第j瓶酒倒进第i瓶的比例”。
    W=[wij]C×C\displaystyle W = [w_{ij}]_{C \times C}
  3. 输出向量y混合后C个新通道的值,等价于对每个i求加权和。
    yi=∑j=1Cwijxj\displaystyle y_i = \sum_{j=1}^{C} w_{ij} x_j

可逆性满秩条件

配方表写好了,但调酒师必须回答一个灵魂问题:这配方能还原吗? 如果两种不同的基酒组合,最后调出了同一种味道,那就不可能从成品推出原料。数学上,这要求变换y = Wx是一一映射,也就是W必须“满秩”。

首先,W必须是方阵——输入输出通道数都是C,像调酒一样,倒进去C瓶、倒出来也是C瓶,总量不变。其次,矩阵的行列式不能为零。行列式就是配方整体的“体积缩放系数”:若det(W)=0,说明某个方向的信息被压扁成零,像两种基酒被彻底混成了同一种味,再也拆不开。满秩条件等价地写为:

为什么“满秩”这么重要?因为标准化流的训练依赖精确的逆变换。训练时网络要同时做前向(数据→隐变量)和反向(隐变量→数据),如果W不满秩,反向时就会出现“一瓶酒对应两杯成品”的歧义,梯度也说不清该往哪走。所以Glow在初始化时会特意让W远离奇异矩阵。

想象调酒师把红黄蓝三瓶酒按“红+黄=橙”的方式混合:如果配方里恰好写着“红和黄的混合比例相同”,那橙色的成品就无法判断原来红黄各是多少——配方塌缩了。满秩条件就是提醒调酒师:任何两瓶原料的“混合指纹”都必须不同,这样还原才有唯一答案。

det⁡(W)≠0  ⟺  rank(W)=C\det(W) \neq 0 \iff \text{rank}(W) = C
满秩意味着W的C个行(或列)线性无关,映射不把任何两个不同的x压到同一个y,因此可逆。
  1. 矩阵的行列式det(W)所有特征值的乘积,反映线性变换对体积的缩放倍数。
    det⁡(W)=∏k=1Cλk\displaystyle \det(W) = \prod_{k=1}^{C} \lambda_k
  2. 非零条件det(W)=0时,至少一个方向被压缩为零,信息发生不可逆丢失。
    det⁡(W)≠0\displaystyle \det(W) \neq 0
  3. 秩rank(W)矩阵线性无关的行(或列)的个数;满秩即等于阶数C。
    rank(W)=C\displaystyle \text{rank}(W) = C

LU分解降开销

配方表W虽然强大,但直接在训练中使用它有一个麻烦:每一次前向都要算一遍行列式。C个通道时,朴素行列式计算的复杂度高达O(C³),相当于调酒师每调一杯酒就要把整间仓库的酒瓶全数一遍——通道数一大,训练就慢得不可接受。聪明的解法是对W做LU分解,把复杂配方拆成三步简单工序:

在Glow的实现中,P在初始化时随机生成并固定不动,L的对角线固定为1(避免与U的对角线产生冗余),U的对角线则作为可训练参数参与学习。这样,网络要学习的参数不再是C×C个元素,而是同样数量但结构更简单的参数——关键在于,行列式和逆矩阵的计算都因此变得极其廉价。

调酒师把“一锅乱炖”的配方改成了流水线:先按顺序摆瓶(P),再让每瓶依次取前面瓶子的酒(L),最后统一调比例(U)。每一道工序单独看都简单规矩,合起来却能表达任意复杂的混合配方——这就是LU分解的精妙之处:复杂度不牺牲表达力,只降低核账成本。

W=PLUW = P L U
P是置换矩阵,负责“换瓶顺序”;L是下三角矩阵(对角线为1),表示“只从序号更小的瓶子取酒”;U是上三角矩阵(对角线非零),表示“每瓶先做比例缩放,再与后面的瓶子微调”。
  1. 置换矩阵P每行每列恰有一个1,像调酒师先把酒瓶按新的顺序摆好。
    P=[01⋯10⋯⋮⋮⋱]\displaystyle P = \begin{bmatrix}0&1&\cdots\\1&0&\cdots\\ \vdots&\vdots&\ddots\end{bmatrix}
  2. 下三角矩阵L主对角线全为1,只允许第i瓶从第1到第i-1瓶取酒。
    L=[10⋯∗1⋯∗∗⋱]\displaystyle L = \begin{bmatrix}1&0&\cdots\\*&1&\cdots\\*&*&\ddots\end{bmatrix}
  3. 上三角矩阵U主对角线非零,表示每瓶独立的缩放系数以及向更靠后瓶子的微调。
    U=[u11∗⋯0u22⋯00⋱]\displaystyle U = \begin{bmatrix}u_{11}&*&\cdots\\0&u_{22}&\cdots\\0&0&\ddots\end{bmatrix}

行列式快速算法

拆成PLU三件套后,“体积账”变得一目了然。行列式有个漂亮的性质:三角矩阵的行列式等于对角线元素之积。对于W = PLU,两边取行列式:

这个公式直接嵌入训练损失函数。标准化流的目标函数是最大化数据的对数似然,而每一层可逆1x1卷积都要贡献一项log|det|。LU分解后,这一项的GPU计算可以做到近乎“零成本”——只读取C个对角线数值,做一次求和。相比之下,如果用完整矩阵直接算行列式,每层每步都要做矩阵分解级别的运算,训练速度会慢一个数量级。

调酒师的账本从“清点整间仓库”变成了“扫一眼U矩阵对角线上的C个标签”。标签上写着每瓶酒的最终缩放系数,它们的乘积就是整体体积变化。核账快了,他才有余力把配方调得更精细——这正是Glow能在高分辨率图像上训练成功的底气之一。

log⁡∣det⁡(W)∣=log⁡∣det⁡(P)∣+log⁡∣det⁡(L)∣+log⁡∣det⁡(U)∣=∑i=1Clog⁡∣uii∣\log |\det(W)| = \log |\det(P)| + \log |\det(L)| + \log |\det(U)| = \sum_{i=1}^{C} \log |u_{ii}|
因为det(P)=±1、det(L)=1,最终只需把U的对角线元素取绝对值、取对数、求和。行列式的复杂度从O(C³)直降为O(C)。
  1. det(P)=±1置换矩阵是正交矩阵,每换一次序只改变符号,不改变体积。
    ∣det⁡(P)∣=1\displaystyle |\det(P)| = 1
  2. det(L)=1下三角矩阵对角线全为1,行列式就是对角线乘积,等于1。
    det⁡(L)=∏i=1C1=1\displaystyle \det(L) = \prod_{i=1}^{C} 1 = 1
  3. det(U)=对角线乘积上三角矩阵的行列式只由对角线决定。
    det⁡(U)=∏i=1Cuii\displaystyle \det(U) = \prod_{i=1}^{C} u_{ii}
  4. 连乘变连加取对数后,乘积变成求和,既能防止数值溢出,又让每一维的贡献独立可加。
    log⁡∣det⁡(W)∣=∑i=1Clog⁡∣uii∣\displaystyle \log |\det(W)| = \sum_{i=1}^{C} \log |u_{ii}|

固定置换升级

在可逆1x1卷积出现之前,流模型常用的通道混合手段是固定置换(shuffle):预先规定一个固定的换瓶顺序,比如1号瓶和2号瓶对调、3号和4号对调,每次前向都照做。固定置换对应的矩阵是置换矩阵P_shuffle——每行每列恰好一个1。它是一个特殊的正交矩阵,行列式恒为±1,因此log|det|恒为0,不改变体积。

可逆1x1卷积与固定置换之间是“一般与特殊”的关系。如果把可逆1x1卷积的权重矩阵W取成某个置换矩阵,得到的变换就和固定置换完全等价;反过来,可逆1x1卷积却可以表达置换矩阵之外的一切满秩线性混合。这意味着,可逆1x1卷积覆盖了固定置换的整个能力集合,并且扩大了搜索空间:

在图像密度估计任务上,Glow论文的实验表明:用可逆1x1卷积替代固定置换后,模型在同等参数预算下取得了更高的测试对数似然。原因不难理解——自然图像中不同颜色通道之间的依赖关系往往是不均匀的,固定置换只能硬生生换位,而可逆1x1卷积可以学到“红色通道的信息大部分保留、少量融入绿色”这类细腻的混合模式。

调酒师终于体会到“换瓶子”和“调配方”的天壤之别:前者是有限种排列组合,翻来覆去就那几招;后者是在一个连续空间里搜索最佳比例,每一次梯度更新都像一次小型品尝实验,不断逼近最优风味。可逆1x1卷积就是把“离散的换瓶权”升级成了“连续的学习权”。

{固定置换矩阵}⊂{W∈RC×C∣det⁡(W)≠0}\{\text{固定置换矩阵}\} \subset \{W \in \mathbb{R}^{C\times C} \mid \det(W) \neq 0\}
固定置换只是可逆1x1卷积的一个特例。后者的参数是连续的、可微的,因此能在训练中通过梯度下降自动找到最优的“混合配方”,而置换的离散性让它无法被梯度优化。

Glow工程实践

理论说通了,落地还需要几个工程诀窍。第一个问题是初始化:如果W初始值离奇异矩阵太近,训练早期就会数值爆炸。Glow的做法是先用标准正态分布采样一个随机矩阵,再做QR分解得到一个正交矩阵Q,用它作为W的初始值——正交矩阵一定可逆,且初始行列式为±1,对数似然的校正项从零附近起步,非常稳定。

第二个诀窍是“直接参数化PLU”。训练时glow并不存储完整的W,而是存储P、L、U三件套:P存为固定的索引张量(不参与梯度),L存下三角部分(前向时补上对角线1),U存上三角部分(对角线自由可训)。这样每次前向只需做两次三角矩阵乘法就能得到W,同时顺手拿到log|det|,一举两得。权重重参数化让“可逆性”从硬约束变成了软结构:无论参数怎么更新,只要U对角线保持非零,W就永远可逆。

在完整训练流程里,可逆1x1卷积被安插在actnorm之后、仿射耦合层之前,三者组成一个Glow step。每一层负责不同的职责:actnorm做通道级的尺度平移稳定训练,1x1卷积做通道间的线性混合,耦合层负责非线性变换。多个step堆叠起来,就构成一条深层的可逆变换链。

调酒师的整套流水线最终运转起来了:随机正交初始化等于“开业前把每瓶酒都调到标准刻度”,PLU参数化让“无论怎么调整配方都保证能还原”,而把混合步骤放在耦合层之前,就像“先让基酒充分融合,再做风味的非线性点睛”。每一步各司其职,整套配方既灵活又稳健——这就是Glow可逆1x1卷积从理论走向工程的全部奥秘。

AI 应用场景

图像生成中的精确密度建模

阶段:模型训练与推理

解决的问题:传统生成模型(如GAN)无法直接计算生成样本的概率,而标准化流要求每一层变换可逆且能算出精确的log|det|。可逆1x1卷积让高分辨率图像生成时通道混合可逆且行列式开销极低,使得Glow能在256×256人脸图像上训练出精确的密度模型。

具体案例:OpenAI发布的Glow模型在人脸生成、图像插值等任务中表现出色。模型内部用可逆1x1卷积替代固定置换,在同等计算预算下取得了更高的对数似然,生成的图像细节更丰富、插值过渡更平滑。

异常检测中的密度估计

阶段:特征表征与评估

解决的问题:异常检测的核心是估计“正常数据”的概率密度,密度低的样本视为异常。标准化流提供精确的似然值,而可逆1x1卷积保证通道级变换可逆且高效,让流模型能在工业传感器数据上稳定训练。

具体案例:在工业质检场景中,用正常产品的多通道传感特征训练一个流模型,推理时计算每个样本的对数似然。可逆1x1卷积负责混合不同传感器的信号通道,并精确记录体积变化,使“正常”与“瑕疵”样本的似然差异清晰可分。

语音合成中的WaveGlow流模型

阶段:模型推理加速

解决的问题:语音合成需要高质量、可并行的波形生成。WaveGlow将可逆1x1卷积用在音频特征与噪声的通道混合上,利用LU分解把行列式成本降到O(C),让流模型在实时合成中保持低延迟。

具体案例:NVIDIA的WaveGlow在Tacotron 2下游生成语音波形,每层可逆1x1卷积对多个音频流通道做混合,配合LU分解参数化,使合成速度达到实时以上,同时保持接近WaveNet的音质。

Python 演示

python51 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class Invertible1x1Conv(nn.Module):    """可逆1x1卷积: y = W x, 用LU分解参数化."""     def __init__(self, channels):        super().__init__()        w0 = torch.randn(channels, channels)        q, _ = torch.linalg.qr(w0)        lu, pivots = torch.linalg.lu(q)        p, l, u = torch.lu_unpack(lu, pivots)        self.register_buffer("p", p)        self.l = nn.Parameter(l)        self.u = nn.Parameter(u)     def _get_w_and_logdet(self):        c = self.l.size(0)        eye = torch.eye(c, device=self.l.device)        l_tril = torch.tril(self.l, -1) + eye        u_triu = torch.triu(self.u)        w = self.p @ l_tril @ u_triu        logdet = torch.sum(torch.log(torch.abs(torch.diag(u_triu))))        return w, logdet     def forward(self, x, reverse=False):        w, logdet = self._get_w_and_logdet()        weight = w.view(w.size(0), w.size(1), 1, 1)        if not reverse:            z = F.conv2d(x, weight)            return z, logdet        w_inv = torch.inverse(w).view_as(weight)        z = F.conv2d(x, w_inv)        return z, -logdet  def main():    torch.manual_seed(42)    layer = Invertible1x1Conv(channels=8)    x = torch.randn(4, 8, 8, 8)    z, logdet = layer(x)    x_hat, neg_logdet = layer(z, reverse=True)    print("重建误差:", (x - x_hat).abs().max().item())    print("前向log|det|:", logdet.item())    print("反向log|det|:", neg_logdet.item())  if __name__ == "__main__":    main()
目的:用PyTorch从零实现Glow中的可逆1x1卷积,验证LU分解参数化的前向混合、逆变换还原,以及log|det|高效计算。
  1. w0 = torch.randn(channels, channels)先丢一个随机的“配方草稿”
  2. q, _ = torch.linalg.qr(w0)QR分解把草稿转成正交矩阵,保证初始W一定可逆
  3. p, l, u = torch.lu_unpack(lu, pivots)把正交矩阵拆成换序P、下三角L、上三角U三件套
  4. l_tril = torch.tril(self.l, -1) + eye强制L对角线为1,只保留下三角
  5. u_triu = torch.triu(self.u)强制U为上三角结构
  6. logdet = torch.sum(torch.log(torch.abs(torch.diag(u_triu))))行列式只取决于U对角线,O(C)完成
  7. weight = w.view(w.size(0), w.size(1), 1, 1)把矩阵W变成1x1卷积核形状
  8. z = F.conv2d(x, weight)用1x1卷积完成所有通道的加权混合
  9. w_inv = torch.inverse(w).view_as(weight)逆变换用W的逆矩阵,保证精确还原

常见误区

误区1x1卷积不看周围像素,只处理一个点,应该做不了什么有用的事,为什么不用3x3卷积?

正解1x1卷积的职责本就不是提取空间特征,而是在通道维度上做“线性混合”——就像调酒师专门负责把基酒混合均匀,不需要关心酒瓶的摆放位置。空间信息由后面的耦合层等组件负责。在标准化流中,通道混合恰好是刚需,1x1卷积“只混通道”反而是它高效可逆的原因。

为何常见:人们习惯用卷积核大小衡量能力,忽略了“通道混合”本身是一项关键的独立操作。

误区LU分解听起来像是只有数值计算专家才能懂的复杂技巧,普通人直接用完整矩阵W不就行了?

正解LU分解的本质只是把矩阵拆成“换序P、下三角L、上三角U”三个简单因子,高中生都能理解三角矩阵。它的核心收益非常朴素:三角矩阵的行列式等于对角线乘积,让log|det|的计算从O(C³)降到O(C)。这不是黑魔法,而是“把复杂工序拆成简单步骤”的工程智慧。

为何常见:矩阵分解往往被教材包装得抽象难懂,实际上它和“分解质因数”一样是拆解思维。

误区反正都是让通道之间发生信息交换,固定置换每个epoch换一次就行,为什么要用可训练矩阵?

正解固定置换是离散的、不可微的,梯度无法优化它;它的表达范围只有C!种排列。可逆1x1卷积是连续的,可以从任意满秩矩阵中学习,覆盖并超越了置换集合。Glow实验显示,在相同条件下可逆1x1卷积能带来更高的对数似然——就像“只会换瓶子”永远比不上“按比例混合基酒”。

为何常见:人们容易忽略“可学习”与“固定”之间的本质差异,觉得结果都是打乱通道。

误区初始化时保证行列式不为零,训练中就不用担心可逆性了,随便更新参数都行。

正解行列式非零只是数学上的可逆底线,不等于数值稳定。如果W的条件数很大,接近奇异的矩阵会让逆变换产生巨大误差,梯度也可能爆炸。所以Glow选择正交矩阵初始化,并且用PLU结构约束W的形状,让参数在训练中尽量远离奇异区域。可逆是底线,稳定才是目标。

为何常见:把“理论上可逆”等同于“数值上稳定”,忽略了浮点计算中条件数带来的风险。

面试题

Q1. 在Glow的可逆1x1卷积中,卷积核的尺寸是多少?

单选题 · easy

  • A.1x1,只混合通道不混合空间← 正确答案
  • B.3x3,混合局部邻域像素
  • C.与输入同尺寸,混合全部像素
  • D.1xC,混合不同通道信息

答案:A。可逆1x1卷积的核尺寸是1×1,只在通道维度做全连接混合,不涉及空间邻域。这就像调酒师只管混合基酒,不负责移动酒瓶的位置。B、C都涉及空间混合,D的"1×C"不是卷积核的标准写法。

Q2. 可逆1x1卷积的权重矩阵W是什么形状?

单选题 · easy

  • A.形状为C×1的列向量
  • B.即C×C的方形矩阵← 正确答案
  • C.是1×C行向量形状
  • D.与输入图像同尺寸矩阵

答案:B。输入输出通道数都为C,W必须是C×C方阵,才能保证变换前后数据维度不变且可逆。就像调酒倒进C瓶、倒出也必须C瓶。A、C都少了维度,D把空间尺寸混入权重矩阵,均不对。

Q3. 为了保证可逆1x1卷积可逆,权重矩阵W必须满足什么条件?

单选题 · mid

  • A.每行元素之和为1即可
  • B.行列式不为零(满秩)← 正确答案
  • C.全部元素必须是正数
  • D.对角线元素全为1

答案:B。det(W)≠0是满秩的等价条件,保证映射是一一对应、可以还原。就像调酒配方不能把两种不同基酒组合调成同一味道。元素为正、行和为1、对角线为1都不保证可逆。

Q4. 关于LU分解,下列说法正确的是?

多选题 · mid

  • A.W分解为PLU,P是置换矩阵← 正确答案
  • B.L是下三角,U是上三角← 正确答案
  • C.分解后行列式计算更高效← 正确答案
  • D.分解后矩阵W变得不可逆了

答案:ABC。LU分解把W拆成置换P、下三角L、上三角U三个因子的乘积,PLU的乘积仍然等于W,可逆性不变,所以D错误。分解后行列式只需看U对角线,复杂度从O(C³)降到O(C),因此C正确。

Q5. LU分解后,log|det(W)|最简洁高效的计算方式是?

单选题 · hard

  • A.对W做奇异值分解来计算
  • B.把W的元素平方后相加
  • C.U对角元取对数绝对值求和← 正确答案
  • D.计算W对角线元素的乘积

答案:C。det(W)=det(P)·det(L)·det(U),P贡献±1,L贡献1,只剩U的对角线乘积。所以log|det(W)|等于对U的每个对角元取绝对值对数再求和,复杂度O(C)。A的SVD更贵,B是Frobenius范数与行列式无关,D忽略了对数且对角线元素可能为负。

Q6. 固定置换(shuffle)与可逆1x1卷积的关系是?

单选题 · mid

  • A.两者完全独立,没有关系
  • B.置换矩阵是前者一个特例← 正确答案
  • C.可逆卷积是置换的特例
  • D.两者都是一种非线性变换

答案:B。置换矩阵每行每列恰有一个1,本身就是一个特殊的正交可逆矩阵。当可逆1x1卷积的W取为置换矩阵时,两者完全等价,因此置换是可逆1x1卷积的特例。可逆卷积本质是线性变换,D错误。

Q7. 关于计算代价,下列说法正确的是?

多选题 · hard

  • A.朴素行列式计算复杂度是O(C³)← 正确答案
  • B.LU分解后行列式复杂度降为O(C)← 正确答案
  • C.置换矩阵行列式绝对值恒为1← 正确答案
  • D.逆运算比前向运算更便宜

答案:ABC。朴素行列式计算需要对C×C矩阵做消元,复杂度O(C³);LU分解后只看U对角线,O(C)。置换矩阵是正交矩阵,|det|=1。逆运算需要求矩阵逆,通常比前向矩阵乘法更贵,因此D错误。

Q8. 标准化流中每一步变换都必须可逆的根本原因是什么?

单选题 · easy

  • A.为了节省显存占用
  • B.精确计算对数似然的需要← 正确答案
  • C.为了减少参数的数量
  • D.为了让网络层数变浅

答案:B。变量替换定理要求变换是一一映射,才能从先验密度的对数似然精确反推数据密度。如果变换不可逆,概率密度会因信息丢失而无法精确计算。这就像调酒账本必须能从成品倒推回原料,否则没法记账。

Q9. 为什么置换矩阵的行列式绝对值恒为1?

单选题 · mid

  • A.每行每列恰一个1且正交← 正确答案
  • B.置换矩阵中所有元素都为1
  • C.置换矩阵必然等于单位矩阵
  • D.置换矩阵的对角线元素全为1

答案:A。置换矩阵每行每列恰有一个1,且满足P·Pᵀ=I,是正交矩阵。正交矩阵的行列式平方为1,所以绝对值恒为1,对应的log|det|为0。B、C、D都是对置换矩阵的错误描述。

Q10. 在Glow的工程实现中,关于可逆1x1卷积的说法正确的是?

多选题 · hard

  • A.初始化为可逆正交矩阵← 正确答案
  • B.LU分解后存PLU三件套← 正确答案
  • C.训练时P保持固定不学← 正确答案
  • D.输出通道数必须大于输入

答案:ABC。Glow用随机矩阵QR分解得到正交矩阵作为W初值,保证可逆。训练时直接参数化P、L、U,P为固定置换不参与梯度更新。输入输出通道数必须相等(方阵),D错误。