归一化方法
常用归一化方法
1. BatchNorm
BatchNorm
是一种归一化方法,用于对神经网络中的特征进行标准化处理。可以加速深层神经网络的训练,防止梯度消失和爆炸问题,并提高模型的泛化能力。
在深层神经网络中,由于各层之间的输出分布可能会变化,导致模型难以训练。而BatchNorm
通过对每个batch的特征进行标准化处理,使得每个特征的均值接近0,方差接近1,从而使得各层之间的输出分布更加稳定,加速模型的训练。
BatchNorm
的计算方式如下:
其中,x
表示输入的特征,mean
和var
表示每个batch的特征的均值和方差,gamma
和beta
是可学习的参数,eps
是一个小的常数,用于防止分母为0。
优点:
- 加速模型训练
- 提高模型泛化能力
- 不同样本之间不会相互影响
缺点:
- 对batch size的依赖
- 对网络架构的限制
- 可能引入额外的计算
LazyBatchNorm
是一种类似于BatchNorm
的归一化方法,但是它可以在训练和推理时都使用相同的统计信息,从而加速模型的推理过程。与BatchNorm
不同,LazyBatchNorm
不会在每个batch中计算均值和方差,而是只在第一个batch中计算并存储下来,然后在后续的训练和推理中共享这些统计信息。这样可以避免在每个batch中计算均值和方差的开销,从而加速模型的推理过程。
nn.BatchNorm1d()
nn.BatchNorm2d()
nn.BatchNorm3d()
主要参数如下:
num_features
:一个整数,表示输入张量的通道数。eps
:一个小的常数,用于防止分母为0,通常取\(10^{-5}\)。momentum
:用于计算滑动平均值的动量,默认为0.1。affine
:是否对归一化后的特征进行仿射变换,默认为True。如果设置为False,则不会学习gamma
和beta
两个参数。track_running_stats
:是否跟踪输入张量的统计信息,默认为True。如果设置为False,则不会计算滑动平均值和方差,而是使用当前batch的均值和方差进行归一化处理。lazy
:是否使用LazyBatchNorm
,默认为False。如果设置为True,则使用LazyBatchNorm
进行归一化处理。
2. LayerNorm
LayerNorm,即Layer Normalization,是一种用于对神经网络中每一层的输出进行标准化处理的方法。与BatchNorm(批标准化)不同,LayerNorm是在每个样本上对每个特征进行标准化,而不是在每个批次上对每个特征进行标准化。
优点:
- 适用范围广
- 不受batch size影响
- 不同样本之间不会相互影响
缺点:
- 需要更多的计算
- 可能引入过度平滑
nn.LayerNorm()
主要参数如下:
normalized_shape
: 一个整数或一个元组,表示标准化处理时特征张量的shape,例如对于形状为\((N, C, H, W)\)的输入张量,可以将normalized_shape设置为(1, C, 1, 1)表示对第二个维度进行标准化处理。eps
: 一个小的常数,用于防止分母为0,通常取\(10^{-5}\)。elementwise_affine
: 一个布尔值,表示是否学习可学习的缩放因子和偏移量,如果为False,则不学习。
3. InstanceNorm
InstanceNorm,即Instance Normalization,是一种用于对神经网络中每个样本的每个通道进行标准化处理的方法。与BatchNorm(批标准化)不同,InstanceNorm是在每个样本上对每个通道进行标准化,而不是在每个批次上对每个通道进行标准化。
优点:
- 不同样本之间不会相互影响
- 对batch size的依赖性较小
- 适用于图像风格转换等任务
缺点:
- 对小批量数据的处理不稳定
- 不适用于循环神经网络
- 可能引入额外的计算
nn.InstanceNorm1d()
nn.InstanceNorm2d()
nn.InstanceNorm3d()
主要参数如下:
num_features
: 一个整数,表示输入张量的通道数。eps
: 一个小的常数,用于防止分母为0,通常取\(10^{-5}\)。momentum
: 一个小的常数,用于计算均值和方差的滑动平均值,通常取0。当momentum不为0时,InstanceNorm可以看作是一种带有记忆能力的BatchNorm。
4. GroupNorm
GroupNorm是一种将特征图分成多个组,对每个组内的特征进行标准化的归一化方法。
优点:
- 对小批量数据的处理稳定
- 适用于小batch size
- 对batch size的依赖性较小
- 可以处理循环神经网络
缺点:
- 计算量大
- 不适用于图像风格转换等任务
- 需要手动设置组数
nn.GroupNorm()
主要参数如下:
num_features
: 一个整数,表示输入张量的通道数。num_groups
: 一个整数,表示将通道分成的组数。通常取值为32或64。eps
: 一个小的常数,用于防止分母为0,通常取\(10^{-5}\)。
5. 其他归一化方法
- Weight Normalization
https://arxiv.org/abs/1602.07868
- Spectrum Normalization