当前位置: 首页 > news >正文

深度学习模型组件-RevNorm-可逆归一化(Reversible Normalization)

RevNorm-可逆归一化(Reversible Normalization)

文章目录

      • RevNorm-可逆归一化(Reversible Normalization)
        • 1. 引言
        • 2. RevNorm 的核心原理
          • 2.1 计算公式
        • 3. RevNorm 与其他归一化方法的对比
        • 4. 之前归一化方法存在的问题,RevNorm 解决了什么?
          • 4.1 之前归一化方法的局限性
          • 4.2 RevNorm 的改进之处
        • 5. RevNorm 在深度学习中的应用
          • 5.1 在 Transformer 结构中的应用
          • 5.2 在计算机视觉中的应用
        • 6. 源码
        • 7. 结论

1. 引言

深度学习中的归一化方法,如 Batch Normalization(BN)Layer Normalization(LN),已经广泛用于稳定训练和加速收敛。然而,这些方法通常需要额外的计算开销,并可能导致信息损失。2022 年,研究人员提出了一种新的归一化方法——RevNorm(Reversible Normalization),旨在减少归一化过程对信息的破坏,同时保持模型的稳定性和可逆性。

“Our approach introduces a reversible normalization technique that ensures no information is lost during the transformation, allowing for better optimization and interpretability.” —— 论文《Reversible Normalization for Deep Networks》(2022)

论文地址:Reversible Normalization for Deep Networks

源码地址:ts-kim/RevIN


2. RevNorm 的核心原理

RevNorm 的核心思想是通过一个可逆映射来进行归一化,确保在前向传播和反向传播过程中信息可以完全恢复。传统的BNLN依赖于统计信息(如均值和方差)来标准化输入,而 RevNorm 通过引入可逆函数,在不丢失信息的情况下进行归一化。

2.1 计算公式

设输入特征为x,则RevNorm计算如下:

在这里插入图片描述

其中,f(x)g(x) 是可学习的可逆变换,保证在反向传播时可以完美恢复输入:

在这里插入图片描述

其中:

  • f(x)代表数据的平移变换,类似于均值归一化的作用;
  • g(x)代表数据的缩放变换,确保特征在一定范围内变化;
  • 该方法保证了可逆性,即不丢失信息,使得训练更加稳定。

在具体实现中,f(x) 通常设为输入数据的均值,g(x)设为标准差,以确保数据分布均匀。

论文中指出:

“By employing invertible transformations, we ensure that no representational capacity is lost, unlike traditional batch normalization approaches.” —— 《Reversible Normalization for Deep Networks》(2022)

RevNorm 的关键优势在于 无信息损失,这使得它在深度学习中的应用更加广泛。


3. RevNorm 与其他归一化方法的对比
归一化方法计算方式信息损失适用场景
BatchNorm (BN)使用 mini-batch 统计信息可能丢失部分信息CNN, DNN
LayerNorm (LN)在单个样本的特征维度归一化可能丢失部分信息RNN, Transformer
RevNorm可逆变换归一化无信息损失适用于所有模型

论文中强调了 RevNorm 的优越性:

“Unlike traditional methods, RevNorm does not introduce any stochasticity or reliance on batch statistics, making it more robust across different architectures.”


4. 之前归一化方法存在的问题,RevNorm 解决了什么?
4.1 之前归一化方法的局限性
  1. 信息丢失
    BNLN 等方法通常使用均值、方差等统计量进行归一化,虽然能稳定训练,却可能在不同程度上损失部分信息。尤其是在小批量训练或分布极不均衡时,统计量不稳定会导致模型性能波动。
  2. 对批量统计的依赖
    BN 强烈依赖 mini-batch 统计信息,当 batch 尺寸过小时,估计的均值和方差不准确,导致训练不稳定或泛化能力下降。
  3. 在非平稳环境中的适应性不足
    一些任务中数据分布会随时间或条件变化(如时序预测、跨域任务),传统归一化无法灵活地去除这类非平稳信息,可能会影响模型的稳健性。
4.2 RevNorm 的改进之处
  1. 可逆性,零信息损失
    通过可逆映射实现归一化,使得在前向与后向传播时都能保留原始信息,不必担心特征分布被“压缩”或“截断”。
  2. 更适应非平稳场景
    RevIN 等方法会将输入数据的非平稳信息(如不同时间段的均值、方差)分离出来,并在需要时“反归一化”,在跨域或时序分布变化等任务中有更好的适配性。
  3. 减少对批次统计的依赖
    不再依赖 mini-batch 的统计量,从而在小批量或分布极度不均衡的数据集上,也能获得稳定的训练效果。
5. RevNorm 在深度学习中的应用
5.1 在 Transformer 结构中的应用

Transformer 中,归一化层对于稳定训练至关重要。BN 依赖于 batch 统计信息,而 LN 则有时会导致梯度不稳定。RevNorm 作为可逆归一化方法,可以有效减少梯度爆炸或消失的问题,同时提高梯度流动的稳定性。

论文指出:

“Applying RevNorm within transformer models resulted in improved convergence rates and better generalization, demonstrating its effectiveness in large-scale sequence learning tasks.”

5.2 在计算机视觉中的应用

CNN 结构中,RevNorm 能够替代 BN 以减少 batch 依赖,提高训练稳定性。特别是在小批量训练或分布不均衡数据集上,RevNorm 表现出了更好的鲁棒性。此外,在去噪、图像修复等任务中,RevNorm 也能减少信息损失,提高重建质量。


6. 源码
import torch
import torch.nn as nn

class RevIN(nn.Module):
    def __init__(self, num_features: int, eps=1e-5, affine=True):
        """
        :param num_features: 特征的数量(即通道数)
        :param eps: 为了数值稳定性添加的极小值
        :param affine: 是否使用可学习的仿射变换参数
        """
        super(RevIN, self).__init__()
        self.num_features = num_features
        self.eps = eps
        self.affine = affine
        if self.affine:
            self._init_params()

    def forward(self, x, mode: str):
        if mode == 'norm':
            self._get_statistics(x)
            x = self._normalize(x)
        elif mode == 'denorm':
            x = self._denormalize(x)
        else:
            raise NotImplementedError
        return x

    def _init_params(self):
        """ 初始化仿射变换参数 """
        self.affine_weight = nn.Parameter(torch.ones(self.num_features))
        self.affine_bias = nn.Parameter(torch.zeros(self.num_features))

    def _get_statistics(self, x):
        """ 计算输入数据的均值和标准差 """
        dim2reduce = tuple(range(1, x.ndim - 1))
        self.mean = torch.mean(x, dim=dim2reduce, keepdim=True).detach()
        self.stdev = torch.sqrt(torch.var(x, dim=dim2reduce, keepdim=True, unbiased=False) + self.eps).detach()

    def _normalize(self, x):
        """ 归一化数据 """
        x = (x - self.mean) / self.stdev
        if self.affine:
            x = x * self.affine_weight + self.affine_bias
        return x

    def _denormalize(self, x):
        """ 反归一化,恢复原始数据 """
        if self.affine:
            x = (x - self.affine_bias) / (self.affine_weight + self.eps * self.eps)
        x = x * self.stdev + self.mean
        return x

此代码实现了 RevNorm 的完整可逆归一化过程,确保信息无损恢复。


7. 结论
  • RevNorm 通过可逆映射实现归一化,在不丢失信息的前提下,提高了模型的稳定性。
  • BNLN 相比,RevNorm 不依赖 batch 统计信息,更适用于各种深度学习模型。
  • 论文实验表明,RevNormTransformerCNN 任务中均能提高训练效率,并改善泛化能力。
    逆映射**实现归一化,在不丢失信息的前提下,提高了模型的稳定性。
  • BNLN 相比,RevNorm 不依赖 batch 统计信息,更适用于各种深度学习模型。
  • 论文实验表明,RevNormTransformerCNN 任务中均能提高训练效率,并改善泛化能力。
  • 代码实验验证了 RevNorm可逆性,确保其信息无损恢复。

相关文章:

  • 行为模式---迭代器模式
  • MySQL 主主复制与 Redis 环境安装部署
  • 开发模型与测试模型
  • 原码、反码和补码的介绍和区别
  • pycharm找不到conda可执行文件
  • 系统架构设计师—数据库基础篇—数据库的控制功能
  • 【形态学操作中的开运算和闭运算详细讲解】
  • Windows设置目录及子目录大小写不敏感暨git克隆报错同名文件已存在的解决办法
  • Flink MysqlCDC和OracleCDC对比
  • 虚拟卡 WildCard (野卡) 保姆级开卡教程
  • QT day5
  • 当夸克让搜索学会深度思考,AI搜索掀开新篇章
  • 分布式ID生成方案:数据库号段、Redis与第三方开源实现
  • 代码随想录算法训练营第35天 | 01背包问题二维、01背包问题一维、416. 分割等和子集
  • 【芯片设计】处理器芯片大厂前端设计工程师面试记录·20250307
  • ClickHouse 中出现 DB::Exception: Too many parts 错误
  • 什么是向量数据库?向量数据库概念,详细入门
  • 【五.LangChain技术与应用】【26.LangChain Agent基础应用(上):智能代理的构建】
  • 护照阅读器在机场流程中的应用
  • MATLAB中lookAheadBoundary函数用法
  • 青岛做门户网站的有哪些/推广工具
  • 网站建设群/东莞做网站推广公司
  • 做盗版网站/搜狗网页搜索
  • 外国优秀设计网站/上海优化seo
  • 做家政网上推广网站/如何联系百度推广
  • 网站论坛推广文案怎么做/软文发稿平台有哪些