简介
Batch Normalization
Layer Normalization
BatchNorm与Layer Norm都是用于标准化数据的,Batch Normalization是用于图像预处理的,而Layer Normalization最初是用于自然语音的,但随着Transformer在图像的使用,Layer Normalization也用于图像中。
我们在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛。
Batch Normalization
原理
数据在网络中传输时,数据的分布就可能不会满足某一种分布,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了(这里所说的满足某一分布规律是指整个训练集所对应的feature map要满足某种分布)。
因此需要对输入到Conv2的数据进行标准化。Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。
Batch Normalization是对训练集中的每个维度进行都进行标准化处理。
假设输入图像为RGB的三通道图像X,则将X分为
x
(
1
)
,
x
(
2
)
,
x
(
3
)
x^{(1)},x^{(2)},x^{(3)}
x(1),x(2),x(3),代表了RGB三个通道所对应的特征矩阵,标准化处理也就是分别对我们的R通道,G通道,B通道进行处理。
之前说过目的是让整个训练集的feature map都符合某个分布,但对于一个大型数据集来说,计算出所有feature map再进行标准化是不现实的,因此Batch Normalization中是对于一个Batch的数据的feature map进行标准化,batch 越大,效果越接近真实。
原文给出了计算公式,其中:
- μ B \mu _B μB:batch中每个维度的feature map的均值, μ B \mu_B μB是一个向量,每个元素代表着一个维度的均值。
- σ B 2 \sigma^2_B σB2:“batch中每个维度的feature map的方差, σ B 2 \sigma^2_B σB2是一个向量,每个元素代表着一个维度的方差。
- x i x_i xi:batch中的输入数据
计算出每个维度均值与方差后,使用这些矩阵与方差来标准化对应维度的feature。
下图是一个实例,这里batch size=2,feature1、feature2分别是由image1、image2经过一系列卷积池化后得到的特征矩阵,feature的channel为2。
x
(
1
)
x^{(1)}
x(1)代表着batch中所有图像的feature中channel1的数据,
x
(
2
)
x^{(2)}
x(2)同理。
然后分别计算
x
(
1
)
x^{(1)}
x(1)与
x
(
2
)
x^{(2)}
x(2)的均值与方差,得到向量
μ
与
σ
\mu 与 \sigma
μ与σ。最后使用这两个向量根据标准差公式对对应channel的feature进行标准化。
在pytorch中的使用
Layer Normalization
Layer Normalization与Batch Normalization的计算公式是一样,但与Batch Normalization不同的是BN是对一个batch数据的每个channel进行Norm处理,但LN是对单个数据的指定channel进行Norm处理,与batch无关。