四种归一化方法BN,LN,IN,GN的比较

本文对比了四种深度学习中的归一化方法:BatchNorm、LayerNorm、InstanceNorm和GroupNorm。通过在PyTorch中的实现以及在CIFAR10数据集上使用VGG16网络的实验,展示了它们在不同batch size下的性能差异。实验结果显示,BatchNorm在较大batch size时效果最佳,而GroupNorm在小batch size时表现优于其他方法,但存在平台期问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.计算方法的不同

BatchNorm:batch方向做归一化,算NHW的均值
LayerNorm:channel方向做归一化,算CHW的均值。为了能够在只有当前一个训练实例下,找到一个合理的统计范围,一个直接的想法是:把同一个卷积层作为集合,求均值和方差;对于RNN,就是把同层隐层神经元的响应值(不同时刻)作为集合,再求均值和方差。
InstanceNorm:一个channel内做归一化,算H*W的均值。LN是对所有的通道,那对一个通道做归一化就是IN,单个通道的feature map作为集合,并在此集合上求均值和方差,这种像素级上的操作,使得IN对于一些图片生成类的任务效果明显优于BN,比如图片风格转换。
GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值。LN是对于所有的通道,IN是对于单个通道,如果把所有通道分组,再各个组上做归一化,这就是GN。通道分组也是CNN常用的优化技巧。GN在mini-batch比较小的场景或者物体检测、视频分类等场景下效果优于BN。

2.各个归一化方法在pytorch里的函数

  • class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
  • class torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
  • class torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
  • class torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)

3.实验验证各个方法的效果

在cifar10数据集,用VGG16网络,只改变batchsize和归一化的函数,各个归一化方法的效果(时间单位是秒):
BN
BatchSize=128时,epoch = 10,train acc = 88.378%,test acc = 84.810%,每个epoch时间= 12.721679000000002
BatchSize=32时,epoch = 20,train acc = 85.792%,test acc = 84.470%,每个epoch时间= 26.749455000000125
BatchSize=16时,epoch = 20,train acc = 80.408%,test acc = 79.260%,每个epoch时间= 44.35883400000057
BatchSize=8时,epoch = 20,train acc = 71.272%,test acc = 73.980%,每个epoch时间= 44.35883400000057
BatchSize=2时,epoch = 10,train acc = 10.206%,test acc = 10.000%,每个epoch时间= 252.75724199999968

LN
BatchSize=1

### 不同深度学习归一化方法的特点及对比 #### 批量归一化 (Batch Normalization, BN) 批量归一化是一种广泛应用于卷积神经网络的技术,它通过对每一批数据进行标准化来减少内部协变量偏移。这种方法在大、中批处理场景中表现出色,在多种视觉任务上具有良好的泛化能力[^1]。然而,当批次大小较小时,BN 的性能会显著下降,因为此时估计均值和方差的准确性较低。 #### 层归一化 (Layer Normalization, LN) 层归一化是对单一样本的所有特征维度计算均值和标准差来进行规范化的方法。相比 BNLN 对于小批量训练更加稳定,因为它不依赖于批次统计信息。这种特性使得 LN 成为序列建模任务(如自然语言处理)的理想选择[^2]。 #### 实例归一化 (Instance Normalization, IN) 实例归一化针对的是图像风格迁移领域的问题,其中每个样本被独立地按通道进行归一化操作而不考虑其他样本的影响。这有助于保留输入图片的空间结构并突出纹理细节。 #### 组归一化 (Group Normalization, GN) 组归一化将通道划分为若干组并对每一组单独执行归一化过程。这种方式既避免了 BN 中的小批量问题又保持了一定程度上的效率提升;因此适用于各种规模的数据集以及不同的硬件环境下的模型部署需求。 #### 谱归一化 (Spectral Normalization, SN) 谱归一化的目的是控制权重矩阵的最大奇异值以实现 Lipschitz 连续性的约束条件,主要用于生成对抗网络(GANs)的研究当中。通过限制判别器函数的变化范围可以有效缓解模式崩溃现象的发生概率。 #### 幂次归一化 (PowerNorm, PN) 幂次归一化引入了一个额外参数 k 来调整激活值分布形状从而达到更好的优化效果。相比于传统的 BN 或者 LN 方法来说,它可以更灵活地适应不同类型的任务要求。 #### 双重分组归一化 (Biased Group Normalization, BGN) 双重分组归一化扩展了普通的 GN 结构,允许在同一时间应用两个不同类型的归一化策略——即先做全局级别的再局部级别或者反过来顺序也可以互换。这样的设计能够进一步增强表达力同时维持数值稳定性。 #### 条件批量归一化 (Conditional Batch Normalization, CBN) 条件批量归一化允许外部信号(比如类别标签或其他上下文信息)动态调节归一化过程中使用的缩放和平移因子 gamma 和 beta 。这对于构建可解释性强且交互友好的 AI 应用程序非常有用。 #### 频率响应归一化 (Frequency Response Normalization, FRN) 频率响应归一化旨在解决传统归一化技术可能破坏原始信号频域特性的缺陷。具体而言,它是基于傅里叶变换后的幅度谱定义新的归一化准则,进而更好地保护高频成分免受不必要的抑制作用影响。 #### 自适应批量归一化 (Self-Attention Batch Normalization, SaBN) 自适应批量归一化结合注意力机制来自动生成适合当前 mini-batch 特征表示的最佳归一化方案。该方法不仅提高了收敛速度还增强了最终预测精度水平。 ```python import torch.nn as nn class CustomNormalization(nn.Module): def __init__(self, norm_type='bn'): super(CustomNormalization, self).__init__() if norm_type == 'bn': self.norm_layer = nn.BatchNorm2d(num_features=64) elif norm_type == 'ln': self.norm_layer = nn.LayerNorm(normalized_shape=[64]) # Add other normalization types here... def forward(self, x): return self.norm_layer(x) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值