Batch Normalization(批量归一化)和 Layer Normalization(层归一化)都是深度学习中用于改善网络训练过程的归一化技术。尽管它们的目标相似,即通过规范化中间层的激活值来加速训练过程并提高性能,但它们在细节上有所不同。
Batch Normalization (批量归一化)
Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。
在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛。
图片参考:添加链接描述
上图中对于Conv1来说输入来源于原始数据集满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了。而我们Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。
原文中给出的伪代码:
让feature map满足某一分布规律:理论上是指整个训练样本集所对应feature map的数据要满足分布规律,也就是说要计算出整个训练集的feature map然后在进行标准化处理。
但是在实际训练过程中只对一个batch进行标准化处理: 一个batch中的 n n n个样本的第 i i i个channel的数据进行归一化处理 ,也就是说把当前batch中的没一个样本的第 i i i个channel拿出来,求平均值和方差,再进行归一化。
注意: 在训练过程中,是通过一个batch的数据进行训练的,但是在预测过程中通常都是输入一张图片进行预测,此时batch size为1,如果在通过上述方法计算均值和方差就没有意义了。所以在训练过程中要去不断的计算每个batch的均值和方差,并使用移动平均(moving average)的方法记录统计的均值和方差,在训练完后可以近似认为所统计的均值和方差就等于整个训练集的均值和方差。然后在验证以及预测过程中,使用统计得到的均值和方差进行标准化处理。
在Python中使用PyTorch库,可以手动实现Batch Normalization功能。以下是一个简化版的Batch Normalization层的实现示例,不包括动量参数和完整的训练/推理模式切换。
import torch
class BatchNorm:
def __init__(self, num_features, eps=1e-5):
self.gamma = torch.ones(num_features)
self.beta = torch.zeros(num_features)
self.eps = eps
self.running_mean = torch.zeros(num_features)
self.running_var = torch.ones(num_features)
def __call__(self, x):
# 如果是训练模式,更新运行均值和方差
if self.training: