一、批量归一化层(Batch Normalisation Layer)
1.为什么需要BN层
在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化,这一过程被称为内部协变量偏移(Internal Covariate Shift)。这种分布的变化会使得每一层都需要不断地适应新的输入分布,从而减慢了训练速度,并且可能导致梯度消失或爆炸。
2.BN层定义
BN层通过对每一批数据进行归一化处理,解决了神经网络训练过程中梯度消失和梯度爆炸的问题,加速了训练过程,并且可以在一定程度上减少模型对初始参数的敏感性和对过拟合的依赖。BN层除了能够解决内部协变量偏移问题之外,还提供了一定的正则化效果,从而提高了模型的泛化能力。
总的来说,BN层通过标准化输入特征,解决了训练过程中的内部协变量偏移问题,同时提供了正则化效果,有效提升了模型的训练效率和泛化能力。
3.BN层原理
批归一化的核心思想是在每一层网络的输入上进行标准化处理。具体来说,BN层在每一层网络的每一批数据上做以下操作:
(1)计算批均值和批方差:对于一个批次的数据,我们首先计算每个特征维度的均值和方差:
(2)归一化:使用批均值和方差对数据进行标准化处理:
其中,是一个很小的数,防止分母为零。
(3)缩放和平移:引入两个可学习的参数和
,对标准化后的数据进行缩放和平移:
其中,和
分别是缩放因子和偏移量,它们的存在允许网络恢复原来的表示能力。
通过上述操作,BN层可以在保持输入数据分布稳定的同时,保留网络的非线性表达能力。
4.在Pytorch中的实现
torch.nn.BatchNorm2d(num_features,
eps=1e-05,
momentum=0.1,
affine=True,
track_running_stats=True,
device=None,
dtype=None)
num_features:
输入特征的数量,即卷积层的输出通道数。例如