由于Batch Normalization包含数据标准化的操作,因此在了解BN前,首先要对数据标准化有个简单认识。 数据标准化通常包括两种:0-1标准化和Z-score标准化,深度学习中的标准化往往指代的是后者。
0-1标准化的公式如下:
Z-score标准化的公式如下:
数据通过Z-Score处理之后将服从标准正态分布。
BN是由Sergey loffe和Christian Szegedy在2015年发表的《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出的一种方法,该方法通过修改每一次带入训练的数据分布(每一个Batch)的数据分布,来提升模型各层梯度的平稳性,从而提升模型学习效率、提高模型训练结果。由于是修改每一个Batch的数据分布,因此该方法也被称为Batch Normalization(BN),小批量数据归一化方法。
对于BN可以提升模型性能方面,作者表示根本原因是因为BN能够消除内部协方差偏移(ICS),然而2018年,来自MIT的研究团队发表论文,《How Does Batch Normalization Help Optimization?》表示,通过严谨的实验可以证明,BN方法对模型优化的有效性和原论文中所描述的消除ICS没有任何关系。
BN计算公式如下:
计算过程如下: 1.计算样本均值。 2.计算样本方差。 3.样本数据标准化处理。 4.进行平移和缩放处理。
注:第四步中的
和
都是模型参数,在实际模型训练过程中是需要作为模型整体参数的一部分,带入损失函数、进而通过梯度下降计算得出的。
目前,大多数的主流模型都使用了BN操作,说明BN非常实用。BN主要有三个作用:
通常来说,BN层放置在线性层和卷积层之后,激活函数之前。
在Pytorch中,提供了两个BN实现接口:BatchNorm1d
用来处理1维数据,BatchNorm2d
用来处理2维数据。
BatchNorm1d
和BatchNorm2d
有下列几个参数
nn.BatchNorm1d(
num_features,
eps=1e-05,
momentum=0.1,
affine=True,
track_running_stats=True,
device=None,
dtype=None,
)
核心参数是:
,当参数取值为True时,会显式设置
参数并带入进行梯度下降迭代计算,取值为False时,参数不显示,实际的数据归一化过程就是对原数据进行无偏估计下的Z-Score变换。
具体实例就先不放了,后续在图像处理中会频繁用。