更改

删除3字节 、 2026年7月23日 (星期四)
小
调整图片位置
第20行: 第20行:     
= 算法框架 =
 
= 算法框架 =
 +
 +
[[文件:Realnvp multiscale.svg|缩略图|RealNVP 多尺度分层架构示意图。BN 为批量归一化(Batch Normalization)操作的简写。|替代=|753x753像素]]
    
RealNVP 把若干可逆模块按顺序堆叠,形成从数据空间到潜在空间的完整映射。其网络主体由四个功能模块组成:'''仿射耦合层'''(coupling)负责可逆的特征变换,每个耦合层输出后接'''批量归一化'''(batch normalization)以稳定训练;'''压缩'''(squeeze)负责降低空间分辨率并把信息重排到通道;'''变量分解'''(factor out)负责在每个尺度末尾抽取一部分变量作为潜在编码。其中,仿射耦合层通过 空间棋盘(checkerboard)与通道级(channel-wise)两种掩码实现,二者交替使用。
 
RealNVP 把若干可逆模块按顺序堆叠,形成从数据空间到潜在空间的完整映射。其网络主体由四个功能模块组成:'''仿射耦合层'''(coupling)负责可逆的特征变换,每个耦合层输出后接'''批量归一化'''(batch normalization)以稳定训练;'''压缩'''(squeeze)负责降低空间分辨率并把信息重排到通道;'''变量分解'''(factor out)负责在每个尺度末尾抽取一部分变量作为潜在编码。其中,仿射耦合层通过 空间棋盘(checkerboard)与通道级(channel-wise)两种掩码实现,二者交替使用。
−
  −
[[文件:Realnvp multiscale.svg|缩略图|RealNVP 多尺度分层架构示意图。BN 为批量归一化(Batch Normalization)操作的简写。|替代=|753x753像素]]
      
如上图所示,输入图像 <math>\mathbf{x}</math> 首先进入第一层 Scale 1。每个非末尺度内部依次经过 3 个 checkerboard 掩码的耦合层Coupling(每个耦合层输出后接批量归一化BN)、压缩块Squeeze 、再 3 个 channel-wise 掩码的耦合层(同样每个后接批量归一化),最后通过变量分解 Factor Out 把当前特征一分为二;末尺度则只经过 4 个 checkerboard 耦合层(同样每个后接批量归一化)就进行 Factor Out。一半结果作为 <math>\mathbf{z}^{(i)}</math> 抽出,另一半 <math>\mathbf{h}^{(i)}</math> 继续传入下一尺度。不同尺度之间通过折线连接,最终把每个 <math>\mathbf{z}^{(i)}</math> 展平为向量后按顺序拼接成完整潜变量 <math>\mathbf{z}</math>。虽然各 <math>\mathbf{z}^{(i)}</math> 的展平长度不同(依次为 <math>HWC/2, HWC/4, \dots, HWC/2^{L-1}</math>),但它们的总和恰好等于输入维度 <math>HWC</math>,因此整体变换保持维度不变。这种分层设计的意图是:早期尺度保留高分辨率的局部细节,后期尺度处理低分辨率的全局结构,并通过逐步分解减少后续层的计算量。
 
如上图所示,输入图像 <math>\mathbf{x}</math> 首先进入第一层 Scale 1。每个非末尺度内部依次经过 3 个 checkerboard 掩码的耦合层Coupling(每个耦合层输出后接批量归一化BN)、压缩块Squeeze 、再 3 个 channel-wise 掩码的耦合层(同样每个后接批量归一化),最后通过变量分解 Factor Out 把当前特征一分为二;末尺度则只经过 4 个 checkerboard 耦合层(同样每个后接批量归一化)就进行 Factor Out。一半结果作为 <math>\mathbf{z}^{(i)}</math> 抽出,另一半 <math>\mathbf{h}^{(i)}</math> 继续传入下一尺度。不同尺度之间通过折线连接,最终把每个 <math>\mathbf{z}^{(i)}</math> 展平为向量后按顺序拼接成完整潜变量 <math>\mathbf{z}</math>。虽然各 <math>\mathbf{z}^{(i)}</math> 的展平长度不同(依次为 <math>HWC/2, HWC/4, \dots, HWC/2^{L-1}</math>),但它们的总和恰好等于输入维度 <math>HWC</math>,因此整体变换保持维度不变。这种分层设计的意图是:早期尺度保留高分辨率的局部细节,后期尺度处理低分辨率的全局结构,并通过逐步分解减少后续层的计算量。
第46行: 第46行:  
\end{cases}
 
\end{cases}
 
</math>
 
</math>
−
|{{EquationRef|1}}}}
+
|{{EquationRef|1}}}}[[文件:仿射耦合.png|缩略图|仿射耦合层示意图:正向(从左到右)将输入分块并变换,反向(从右到左)逐块还原。|替代=]]这里 <math>\mathbf{s}</math>(scale,缩放)和 <math>\mathbf{t}</math>(translation,平移)是两个深度神经网络(通常是 CNN)。<math>\odot</math> 为逐元素乘积。由于 <math>\mathbf{s}</math> 和 <math>\mathbf{t}</math> 的输入只来自不变的那一半,输出只作用在可变的那一半,整个变换的雅可比矩阵是下三角块结构,行列式即为对角线元素的乘积——计算复杂度从 <math>O(D^3)</math> 降到 <math>O(D)</math>。此外,逆变换为:
−
这里 <math>\mathbf{s}</math>(scale,缩放)和 <math>\mathbf{t}</math>(translation,平移)是两个深度神经网络(通常是 CNN)。<math>\odot</math> 为逐元素乘积。由于 <math>\mathbf{s}</math> 和 <math>\mathbf{t}</math> 的输入只来自不变的那一半,输出只作用在可变的那一半,整个变换的雅可比矩阵是下三角块结构,行列式即为对角线元素的乘积——计算复杂度从 <math>O(D^3)</math> 降到 <math>O(D)</math>。此外,逆变换为:
      
{{NumBlk|:|
 
{{NumBlk|:|
第57行: 第56行:  
</math>
 
</math>
 
|{{EquationRef|2}}}}
 
|{{EquationRef|2}}}}
−
  −
[[文件:仿射耦合.png|缩略图|仿射耦合层示意图:正向(从左到右)将输入分块并变换,反向(从右到左)逐块还原。|替代=]]
      
无需对 <math>\mathbf{s}</math> 或 <math>\mathbf{t}</math> 求逆,只需按逆变换公式进行减法和除法即可。因此'''编码(求密度)和解码(采样)同样高效'''。
 
无需对 <math>\mathbf{s}</math> 或 <math>\mathbf{t}</math> 求逆,只需按逆变换公式进行减法和除法即可。因此'''编码(求密度)和解码(采样)同样高效'''。
50

个编辑