| 第6行: |
第6行: |
| | | | |
| | RealNVP 建立在早期标准化流工作之上,其发展有两条主线。 | | RealNVP 建立在早期标准化流工作之上,其发展有两条主线。 |
| | + | |
| | + | |
| | | | |
| | 第一条主线是可逆变换的"分层堆叠"思想。从 1990 年代的独立成分分析(Independent Component Analysis,ICA),到 2000 年 Chen 与 Gopinath 的'''高斯化'''(Gaussianization)<ref name="Chen2000">{{cite conference|author1=Chen S. S.|author2=Gopinath R. A.|title=Gaussianization|conference=Advances in Neural Information Processing Systems (NIPS)|year=2000}}</ref>,研究者一直尝试用可逆变换将复杂数据"[[归一化]]"到简单分布。2010 年,Tabak 与 Vanden-Eijnden 正式提出了"标准化流"(normalizing flow)的数学框架——通过一系列可逆映射,让基分布像水流一样"流动"成目标分布<ref name="Tabak2010">{{cite journal|author1=Tabak E. G.|author2=Vanden-Eijnden E.|title=Density Estimation by Dual Ascent of the Log-Likelihood|journal=Communications in Mathematical Sciences|year=2010|volume=8|issue=1|pages=217-233}}</ref>。 | | 第一条主线是可逆变换的"分层堆叠"思想。从 1990 年代的独立成分分析(Independent Component Analysis,ICA),到 2000 年 Chen 与 Gopinath 的'''高斯化'''(Gaussianization)<ref name="Chen2000">{{cite conference|author1=Chen S. S.|author2=Gopinath R. A.|title=Gaussianization|conference=Advances in Neural Information Processing Systems (NIPS)|year=2000}}</ref>,研究者一直尝试用可逆变换将复杂数据"[[归一化]]"到简单分布。2010 年,Tabak 与 Vanden-Eijnden 正式提出了"标准化流"(normalizing flow)的数学框架——通过一系列可逆映射,让基分布像水流一样"流动"成目标分布<ref name="Tabak2010">{{cite journal|author1=Tabak E. G.|author2=Vanden-Eijnden E.|title=Density Estimation by Dual Ascent of the Log-Likelihood|journal=Communications in Mathematical Sciences|year=2010|volume=8|issue=1|pages=217-233}}</ref>。 |
| | + | |
| | + | |
| | | | |
| | 第二条主线是耦合层的发明与升级。2014 年,Dinh 等人提出了 '''NICE'''(Non-linear Independent Components Estimation),首次使深度可逆网络可训练<ref name="NICE2014">{{cite journal|author1=Dinh L.|author2=Krueger D.|author3=Bengio Y.|title=NICE: Non-linear Independent Components Estimation|journal=ICLR 2015 Workshop|year=2015|url=https://arxiv.org/abs/1410.8516}}</ref>。NICE 的关键创新是'''[[加性耦合层]]''':将输入分成两半,其中一半直接保持不变,另一半则加上一个以第一半为条件的神经网络输出。由于该变换的雅可比行列式恒为 1,它'''保持体积'''(volume preserving),但表达能力因此受限。 | | 第二条主线是耦合层的发明与升级。2014 年,Dinh 等人提出了 '''NICE'''(Non-linear Independent Components Estimation),首次使深度可逆网络可训练<ref name="NICE2014">{{cite journal|author1=Dinh L.|author2=Krueger D.|author3=Bengio Y.|title=NICE: Non-linear Independent Components Estimation|journal=ICLR 2015 Workshop|year=2015|url=https://arxiv.org/abs/1410.8516}}</ref>。NICE 的关键创新是'''[[加性耦合层]]''':将输入分成两半,其中一半直接保持不变,另一半则加上一个以第一半为条件的神经网络输出。由于该变换的雅可比行列式恒为 1,它'''保持体积'''(volume preserving),但表达能力因此受限。 |
| | + | |
| | + | |
| | | | |
| | 2017 年的 RealNVP 将加性耦合扩展为仿射耦合,即以前一半变量为条件,对后一半变量先进行缩放再进行平移。这一改动使变换不再保持体积(non-volume preserving),增强了模型的表达能力,同时保留了计算上的便利性。后续的理论工作(Draxler et al., 2024)证明:[[体积保持]]的流'''不是'''分布的普适逼近器,而仿射耦合流在良好条件下是<ref name="Draxler2024">{{cite journal|author1=Draxler F.|author2=Wahl S.|author3=Schnörr C.|author4=Köthe U.|title=On the Universality of Volume-Preserving and Coupling-Based Normalizing Flows|journal=Proceedings of the 41st International Conference on Machine Learning (ICML)|year=2024|publisher=PMLR 235}}</ref>。这从理论上解释了 RealNVP 相对于 NICE 的优势。 | | 2017 年的 RealNVP 将加性耦合扩展为仿射耦合,即以前一半变量为条件,对后一半变量先进行缩放再进行平移。这一改动使变换不再保持体积(non-volume preserving),增强了模型的表达能力,同时保留了计算上的便利性。后续的理论工作(Draxler et al., 2024)证明:[[体积保持]]的流'''不是'''分布的普适逼近器,而仿射耦合流在良好条件下是<ref name="Draxler2024">{{cite journal|author1=Draxler F.|author2=Wahl S.|author3=Schnörr C.|author4=Köthe U.|title=On the Universality of Volume-Preserving and Coupling-Based Normalizing Flows|journal=Proceedings of the 41st International Conference on Machine Learning (ICML)|year=2024|publisher=PMLR 235}}</ref>。这从理论上解释了 RealNVP 相对于 NICE 的优势。 |
| 第21行: |
第27行: |
| | RealNVP 把若干可逆模块按顺序堆叠,形成从数据空间到潜在空间的完整映射。其网络主体由四个功能模块组成:'''[[仿射耦合层]]'''(affine coupling layer)负责可逆的特征变换,每个耦合层输出后接'''[[批量归一化]]'''(batch normalization)以稳定训练;'''[[压缩]]'''(squeeze)负责降低空间分辨率并把信息重排到通道;'''[[变量分解]]'''(factor out)负责在每个尺度末尾抽取变量作为潜在变量。其中,仿射耦合层通过空间[[棋盘掩码]](checkerboard masking)与[[通道级掩码]](channel-wise masking)实现,二者交替使用。 | | RealNVP 把若干可逆模块按顺序堆叠,形成从数据空间到潜在空间的完整映射。其网络主体由四个功能模块组成:'''[[仿射耦合层]]'''(affine coupling layer)负责可逆的特征变换,每个耦合层输出后接'''[[批量归一化]]'''(batch normalization)以稳定训练;'''[[压缩]]'''(squeeze)负责降低空间分辨率并把信息重排到通道;'''[[变量分解]]'''(factor out)负责在每个尺度末尾抽取变量作为潜在变量。其中,仿射耦合层通过空间[[棋盘掩码]](checkerboard masking)与[[通道级掩码]](channel-wise masking)实现,二者交替使用。 |
| | | | |
| | + | |
| | RealNVP 的多尺度架构如下图所示。输入图像 <math>\mathbf{x}</math> 首先进入第 1 尺度。每个非末尺度内部依次经过 3 个空间棋盘掩码的耦合层(每个耦合层输出后接批量[[归一化]])、压缩块、再 3 个通道级掩码的耦合层(同样每个后接批量归一化),最后进行变量分解;末尺度则只经过 4 个空间棋盘掩码耦合层(同样每个后接批量归一化),随后把全部变量抽出作为 <math>\mathbf{z}^{(L)}</math>,不再保留传递变量。非末尺度的变量分解把当前特征一分为二:一半作为 <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>,因此整体变换保持维度不变。这种分层设计的意图是:早期尺度保留高分辨率的局部细节,后期尺度处理低分辨率的全局结构,并通过逐步分解减少后续层的计算量。 | | RealNVP 的多尺度架构如下图所示。输入图像 <math>\mathbf{x}</math> 首先进入第 1 尺度。每个非末尺度内部依次经过 3 个空间棋盘掩码的耦合层(每个耦合层输出后接批量[[归一化]])、压缩块、再 3 个通道级掩码的耦合层(同样每个后接批量归一化),最后进行变量分解;末尺度则只经过 4 个空间棋盘掩码耦合层(同样每个后接批量归一化),随后把全部变量抽出作为 <math>\mathbf{z}^{(L)}</math>,不再保留传递变量。非末尺度的变量分解把当前特征一分为二:一半作为 <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> | | <math> |
| | \mathbf{x} = \mathbf{h}^{(0)} \;\xrightarrow{\text{耦合层} \times n}\; \xrightarrow{\text{压缩}}\; \xrightarrow{\text{耦合层} \times n}\; \xrightarrow{\text{分解出一半}}\; \mathbf{z}^{(1)} \;\longrightarrow\; \cdots \;\longrightarrow\; \mathbf{z} | | \mathbf{x} = \mathbf{h}^{(0)} \;\xrightarrow{\text{耦合层} \times n}\; \xrightarrow{\text{压缩}}\; \xrightarrow{\text{耦合层} \times n}\; \xrightarrow{\text{分解出一半}}\; \mathbf{z}^{(1)} \;\longrightarrow\; \cdots \;\longrightarrow\; \mathbf{z} |
| | </math> | | </math> |
| | | | |
| | + | |
| | 由于每个压缩和分解步骤都要对空间或通道维度进行对半划分,各尺度的空间尺寸与通道数都必须是偶数;实际应用中通常把图像尺寸调整为偶数,或通过填充、裁剪等预处理满足该条件。 | | 由于每个压缩和分解步骤都要对空间或通道维度进行对半划分,各尺度的空间尺寸与通道数都必须是偶数;实际应用中通常把图像尺寸调整为偶数,或通过填充、裁剪等预处理满足该条件。 |
| | | | |
| 第81行: |
第91行: |
| | | | |
| | 批量[[归一化]](Batch Normalization,BN)应用于每个[[耦合层]]的输出之后。其映射为 | | 批量[[归一化]](Batch Normalization,BN)应用于每个[[耦合层]]的输出之后。其映射为 |
| | + | |
| | + | |
| | | | |
| | <math> | | <math> |
| | \mathbf{x} \mapsto \frac{\mathbf{x} - \tilde{\boldsymbol{\mu}}}{\sqrt{\tilde{\boldsymbol{\sigma}}^2 + \epsilon}} | | \mathbf{x} \mapsto \frac{\mathbf{x} - \tilde{\boldsymbol{\mu}}}{\sqrt{\tilde{\boldsymbol{\sigma}}^2 + \epsilon}} |
| | </math>, | | </math>, |
| | + | |
| | + | |
| | + | |
| | 其中 <math>\tilde{\boldsymbol{\mu}}</math>、<math>\tilde{\boldsymbol{\sigma}}</math> 为均值与标准差——训练时按当前批次估计,推理时改用滑动平均(原因见下文)。由于 BN 对每个维度独立地缩放和平移,它本身也是一个可逆变换:其雅可比矩阵为对角阵,[[雅可比行列式]]即各维度缩放因子的乘积,可直接加入[[对数似然]]——这使 BN 可以像耦合层一样作为流中的一层。引入 BN 主要是为了稳定深层训练:它抑制了由缩放参数 <math>\exp(\mathbf{s})</math> 引起的数值爆炸,使梯度稳定传播。使用 BN 有一个容易忽略的细节:训练时均值与方差是从当前这一批样本中估计的,因此单个样本的输出会依赖同批次的其他样本——此时的 BN 并不是严格意义上逐样本的可逆变换,其行列式也与整个批量耦合。只有在推理阶段改用训练过程中滑动平均得到的固定统计量,BN 才成为逐样本的、严格可逆的仿射变换,其行列式才能精确计入对数似然。换言之,用训练好的模型评估密度时若忘了做这一切换,同一个输入会因同批样本不同而得到不同的密度值,结果既不可复现也不正确。 | | 其中 <math>\tilde{\boldsymbol{\mu}}</math>、<math>\tilde{\boldsymbol{\sigma}}</math> 为均值与标准差——训练时按当前批次估计,推理时改用滑动平均(原因见下文)。由于 BN 对每个维度独立地缩放和平移,它本身也是一个可逆变换:其雅可比矩阵为对角阵,[[雅可比行列式]]即各维度缩放因子的乘积,可直接加入[[对数似然]]——这使 BN 可以像耦合层一样作为流中的一层。引入 BN 主要是为了稳定深层训练:它抑制了由缩放参数 <math>\exp(\mathbf{s})</math> 引起的数值爆炸,使梯度稳定传播。使用 BN 有一个容易忽略的细节:训练时均值与方差是从当前这一批样本中估计的,因此单个样本的输出会依赖同批次的其他样本——此时的 BN 并不是严格意义上逐样本的可逆变换,其行列式也与整个批量耦合。只有在推理阶段改用训练过程中滑动平均得到的固定统计量,BN 才成为逐样本的、严格可逆的仿射变换,其行列式才能精确计入对数似然。换言之,用训练好的模型评估密度时若忘了做这一切换,同一个输入会因同批样本不同而得到不同的密度值,结果既不可复现也不正确。 |
| | | | |
| 第198行: |
第213行: |
| | == [[异常检测]] == | | == [[异常检测]] == |
| | | | |
| − | RealNVP 能够给出数据的精确似然,这使它天然适合无监督异常检测:在仅含正常样本的数据上训练流模型,测试时将似然显著低于正常水平的样本判为异常。也可以把流与重建类模型结合起来,综合似然与[[重建误差]]构造异常分数——下文的 AE-FLOW 即属此类。医学影像领域尤其典型——正常扫描数量庞大,而病变样本稀少且难以标注。 | + | RealNVP 能够给出数据的精确似然,这使它天然适合无监督异常检测:在仅含正常样本的数据上训练流模型,测试时将似然显著低于正常水平的样本判为异常。也可以把流与重建类模型结合起来,综合似然与[[重建误差]]构造异常分数——下文的 AE-FLOW 即属此类。医学影像领域尤其典型——正常扫描数量庞大,而病变样本稀少且难以标注。AE-FLOW 将自编码器与以 RealNVP [[仿射耦合层]]为核心的[[标准化流]]瓶颈相结合,在胸部 X 光、光学相干断层扫描、皮肤镜与脑部核磁共振等多种医学影像数据上检测异常。模型同时利用重建误差与流模型给出的[[负对数似然]]构造异常分数:正常样本能被准确重建并获得较高似然,而病变区域会产生高重建残差与低似然<ref name="AEFLOW2023">{{cite journal|author1=Zhao Y.|author2=Ding Q.|author3=Zhang X.|title=AE-FLOW: Autoencoders with Normalizing Flows for Medical Images Anomaly Detection|journal=International Conference on Learning Representations (ICLR)|year=2023|url=https://openreview.net/forum?id=9OmCr1q54Z}}</ref>。 |
| − |
| + | |
| − | AE-FLOW 将自编码器与以 RealNVP [[仿射耦合层]]为核心的[[标准化流]]瓶颈相结合,在胸部 X 光、光学相干断层扫描、皮肤镜与脑部核磁共振等多种医学影像数据上检测异常。模型同时利用重建误差与流模型给出的[[负对数似然]]构造异常分数:正常样本能被准确重建并获得较高似然,而病变区域会产生高重建残差与低似然<ref name="AEFLOW2023">{{cite journal|author1=Zhao Y.|author2=Ding Q.|author3=Zhang X.|title=AE-FLOW: Autoencoders with Normalizing Flows for Medical Images Anomaly Detection|journal=International Conference on Learning Representations (ICLR)|year=2023|url=https://openreview.net/forum?id=9OmCr1q54Z}}</ref>。
| |
| | | | |
| | 下图展示了 AE-FLOW 在胸部 X 光数据上的结果。左列为异常(肺炎)样本,右列为正常样本;每列自上而下依次为原图、重建图与残差图。正常样本的残差整体较暗,而异常样本的肺部区域出现明显亮斑,直观地反映了模型对异常模式的识别能力。 | | 下图展示了 AE-FLOW 在胸部 X 光数据上的结果。左列为异常(肺炎)样本,右列为正常样本;每列自上而下依次为原图、重建图与残差图。正常样本的残差整体较暗,而异常样本的肺部区域出现明显亮斑,直观地反映了模型对异常模式的识别能力。 |
| 第208行: |
第222行: |
| | | | |
| | 由于编码器 <math>f</math> 与解码器 <math>g</math> 互为逆映射(<math>\mathbf{x} = g(f(\mathbf{x}))</math>),RealNVP 天然适合[[图像修复]]、去噪、着色等重建设置。以图像修复为例:已知像素 <math>\mathbf{x}_O</math> 固定,对缺失像素 <math>\mathbf{x}_H</math> 用梯度上升最大化 <math>\log p_X(\mathbf{x}_O, \mathbf{x}_H)</math>,并加入少量高斯噪声扰动: | | 由于编码器 <math>f</math> 与解码器 <math>g</math> 互为逆映射(<math>\mathbf{x} = g(f(\mathbf{x}))</math>),RealNVP 天然适合[[图像修复]]、去噪、着色等重建设置。以图像修复为例:已知像素 <math>\mathbf{x}_O</math> 固定,对缺失像素 <math>\mathbf{x}_H</math> 用梯度上升最大化 <math>\log p_X(\mathbf{x}_O, \mathbf{x}_H)</math>,并加入少量高斯噪声扰动: |
| | + | |
| | + | |
| | | | |
| | <math> | | <math> |
| | \mathbf{x}_{H}^{(t+1)} = \mathbf{x}_{H}^{(t)} + \alpha_t \left(\frac{\partial \log p_X(\mathbf{x}_O, \mathbf{x}_{H}^{(t)})}{\partial \mathbf{x}_H} + \boldsymbol{\epsilon}\right) | | \mathbf{x}_{H}^{(t+1)} = \mathbf{x}_{H}^{(t)} + \alpha_t \left(\frac{\partial \log p_X(\mathbf{x}_O, \mathbf{x}_{H}^{(t)})}{\partial \mathbf{x}_H} + \boldsymbol{\epsilon}\right) |
| | </math> | | </math> |
| | + | |
| | + | |
| | | | |
| | 由于模型学习了全数据分布的精确密度,它能对任意形状的掩码产生合理的语义补全,而非仅记忆特定训练掩码<ref name="Dinh2017" />。在 LSUN 卧室数据集上,RealNVP 对缺失区域(红框)的补全结果在语义和视觉上均保持合理(见下图)。 | | 由于模型学习了全数据分布的精确密度,它能对任意形状的掩码产生合理的语义补全,而非仅记忆特定训练掩码<ref name="Dinh2017" />。在 LSUN 卧室数据集上,RealNVP 对缺失区域(红框)的补全结果在语义和视觉上均保持合理(见下图)。 |