说明:
1.此仅为个人学习过程中之笔记,可能会有错误,如若读者发现错误,欢迎指出。
2.不定期更新
BN,LN,IN,GN从学术化上解释差异:
BatchNorm:batch方向做归一化,算NHW的均值,对小batchsize效果不好;BN主要缺点是对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布
LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用明显;
InstanceNorm:一个channel内做归一化,算H*W的均值,用在风格化迁移;因为在图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值;这样与batchsize无关,不受其约束。
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
1.BatchNorm
Batch Normalization (BN) 是最早出现的,也通常是效果最好的归一化方式。feature map: x ∈ R N × C × H × W x\in\mathbb{R}^{N\times C\times H\times W} x∈RN×C×H×W 包含 N 个样本,每个样本通道数为 C,高为 H,宽为 W。对其求均值和方差时,将在 N、H、W上操作,而保留通道 C 的维度。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。具体公式为:
μ c ( x ) = 1 N H W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W x n c h w \mu_c(x)=\frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw} μc(x)=NHW1∑n=1N∑h=1H∑w=1Wxnchw
σ c ( x ) = 1 N H W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( x n c h w − μ c ( x ) ) 2 + ϵ \sigma_c(x)=\sqrt{\frac{1}{NHW}\sum_{n=1}^{N}\sum_{h=1}^{H}\sum_{w=1}^{W}(x_{nchw}-\mu_c(x))^2+\epsilon} σc(x)=NHW1∑n=1N∑h=1H∑w=1W(xnchw−μc(x))2+ϵ
y = x − μ c ( x ) σ c ( x ) × γ + β y=\frac{x-\mu_c(x)}{\sigma_c(x)}\times\gamma+\beta y=σc(x)x−μc(x)×γ+β
如果把 x ∈ R N × C × H × W x\in\mathbb{R}^{N\times C\times H\times W} x∈RN×C×H×W类比为一摞书,这摞书总共有 N 本,每本有 C 页,每页有 H 行,每行 W 个字符。BN 求均值时,相当于把这些书按页码一一对应地加起来(例如第1本书第36页,第2本书第36页…),再除以每个页码下的字符总数:N×H×W,因此可以把 BN 看成求“平均书”的操作(注意这个“平均书”每页只有一个字),求标准差时也是同理。
torch.nn.BatchNorm1d
(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm2d
(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm3d
(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
参数定义:
num_features: 来自期望输入的特征数,即上述的C
eps:为保证数值稳定(分母不能趋近或取0),给分母加上的值,默认为1e-5
momentum:动态均值和动态方差所使用的动量,默认为0.1
affine:布尔值,当设为True时,给该层添加可学习的仿射变换的参数
track_running_stats:布尔值,当设为True时,记录训练过程中的均值和方差
2.LayerNorm
BN 的一个缺点是需要较大的 batchsize 才能合理估训练数据的均值和方差,这导致内存很可能不够用,同时它也很难应用在训练数据长度不同的 RNN 模型上。Layer Normalization (LN) 的一个优势是不需要批训练,在单条数据内部就能归一化。
对于 x ∈ R N × C × H × W x\in\mathbb{R}^{N\times C\times H\times W} x∈RN×C×H×W,LN 对每个样本的 C、H、W 维度上的数据求均值和标准差,保留 N 维度。其均值和标准差公式为:
μ c ( x ) = 1 C H W ∑ c = 1 C ∑ h = 1 H ∑ w = 1 W x n c h w \mu_c(x)=\frac{1}{CHW}\sum_{c=1}^{C}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw} μc(x)=CHW1∑c=1C∑h=1H∑w=1Wxnchw
σ c ( x ) = 1 N H W ∑ c = 1 C ∑ h = 1 H ∑ w = 1 W ( x n c h w − μ c ( x ) ) 2 + ϵ \sigma_c(x)=\sqrt{\frac{1}{NHW}\sum_{c=1}^{C}\sum_{h=1}^{H}\sum_{w=1}^{W}(x_{nchw}-\mu_c(x))^2+\epsilon} σc(x)=NHW1∑c=1C∑h=1H∑w=1W(xnchw−μc(x))2+ϵ
y = x − μ c ( x ) σ c ( x ) × γ + β y=\frac{x-\mu_c(x)}{\sigma_c(x)}\times\gamma+\beta y=σc(x)x−μc(x)×γ+β
继续采用上一节的类比,把一个 batch 的 feature 类比为一摞书。LN 求均值时,相当于把每一本书的所有字加起来,再除以这本书的字符总数:C×H×W,即求整本书的“平均字”,求标准差时也是同理。
torch.nn.LayerNorm(normalized_shape, eps=1e-5, elementwise_affine=True)
normalized_shape: 输入尺寸
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值,默认取1e-5
elementwise_affine: 布尔值,当设为True时,给该层添加可学习的仿射变换参数
3.InstanceNorm
Instance Normalization (IN) 最初用于图像的风格迁移。作者发现,在生成模型中, feature map 的各个 channel 的均值和方差会影响到最终生成图像的风格,因此可以先把图像在 channel 层面归一化,然后再用目标风格图片对应 channel 的均值和标准差“去归一化”,以期获得目标图片的风格。IN 操作也在单个样本内部进行,不依赖 batch。
对于 x ∈ R N × C × H × W x\in\mathbb{R}^{N\times C\times H\times W} x∈RN×C×H×W,IN 对每个样本的 H、W 维度的数据求均值和标准差,保留 N 、C 维度,也就是说,它只在 channel 内部求均值和标准差,其公式为:
μ n c ( x ) = 1 H W ∑ h = 1 H ∑ w = 1 W x n c h w \mu_{nc}(x)=\frac{1}{HW}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw} μnc(x)=HW1∑h=1H∑w=1Wxnchw
σ n c ( x ) = 1 H W ∑ h = 1 H ∑ w = 1 W ( x n c h w − μ n c ( x ) ) 2 + ϵ \sigma_{nc}(x)=\sqrt{\frac{1}{HW}\sum_{h=1}^{H}\sum_{w=1}^{W}(x_{nchw}-\mu_{nc}(x))^2+\epsilon} σnc(x)=HW1∑h=1H∑w=1W(xnchw−μnc(x))2+ϵ
IN 求均值时,相当于把一页书中所有字加起来,再除以该页的总字数:H×W,即求每页书的“平均字”,求标准差时也是同理。
torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm3d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
num_features: 来自期望输入的特征值
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值,默认为1e-5
momentum:动态均值和动态方差所使用的动量,默认为0.1
affine: 布尔值, 当为True时,给该层添加可学习的仿射变换参数
track_running_stats: 布尔值,当设为True,记录训练过程中的均值和方差
4.Group Normalization
Group Normalization (GN) 适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batchsize 只能是个位数,再大显存就不够用了。而当 batchsize 是个位数时,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。GN 也是独立于 batch 的,它是 LN 和 IN 的折中。
GN 计算均值和标准差时,把每一个样本 feature map 的 channel 分成 G 组,每组将有 C/G 个 channel,然后将这些 channel 中的元素求均值和标准差。各组 channel 用其对应的归一化参数独立地归一化。
μ n g ( x ) = 1 ( C / G ) H W ∑ c = g C / G ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W x n c h w \mu_{ng}(x)=\frac{1}{(C/G)HW}\sum_{c=gC/G}^{(g+1)C/G}\sum_{h=1}^{H}\sum_{w=1}^{W}x_{nchw} μng(x)=(C/G)HW1∑c=gC/G(g+1)C/G∑h=1H∑w=1Wxnchw
σ n g ( x ) = 1 ( C / G ) H W ∑ c = g C / G ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W ( x n c h w − μ n g ( x ) ) 2 + ϵ \sigma_{ng}(x)=\sqrt{\frac{1}{(C/G)HW}\sum_{c=gC/G}^{(g+1)C/G}\sum_{h=1}^{H}\sum_{w=1}^{W}(x_{nchw}-\mu_{ng}(x))^{2}+\epsilon} σng(x)=(C/G)HW1∑c=gC/G(g+1)C/G∑h=1H∑w=1W(xnchw−μng(x))2+ϵ
继续用书类比。GN 相当于把一本 C 页的书平均分成 G 份,每份成为有 C/G 页的小册子,求每个小册子的“平均字”和字的“标准差”。
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
num_groups: 需要划分为的groups
num_features: 来自期望输入的特征数
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值,默认为1e-5
momentum:动态均值和动态方差所使用的动量,默认为0.1
affine: 布尔值, 当为True时,给该层添加可学习的仿射变换参数
References:
PyTorch学习之归一化层(BatchNorm、LayerNorm、InstanceNorm、GroupNorm)
BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结
BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm简介