参考:https://www.jianshu.com/p/b38e14c1f14d

batch_normalization 1D

可以使用batch_normalization对隐藏层的数据进行正态分布标准化,由于标准化后可能影响神经网络的表达能力。 normalize 后的数据再使用缩放系数γ和平移系数β进行缩放和平移。其中γ和 β参数需要进行进行反向传播学习,使得处理后的数据达到最佳的使用效果。

pytorch版本bert代码 pytorch batchnorm_测试阶段


ε是为了防止参数为0。下面结合pytorch的nn.BatchNorm1d来说明具体细节。

训练阶段的均值和方差来自于当前的batch数据计算。

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

BatchNorm1d接收一个二维的输入with维度(batch_size,num_features)。

  • num_features:特征的数量
  • eps:ε,默认是1e-5
  • momentum: 计算running_mean和running_var的滑动平均系数。采用下列的公式:pytorch版本bert代码 pytorch batchnorm_测试阶段_02其中pytorch版本bert代码 pytorch batchnorm_pytorch版本bert代码_03表示过去统计的数据,pytorch版本bert代码 pytorch batchnorm_数据_04表示当前的观测数据。如果是None,则为累积的平均。
  • affine:bool值,True表示使用γ和 β参数
  • track_running_stats:bool值,如果为True,训练阶段采用实时的batch均值和方差, 同时采用滑动平均来计算全局的running_mean和running_var,测试阶段采用当前的running_mean和running_var;如果是False,则训练阶段和测试阶段都采用实时的batch均值和方差。

batch_normalization 2D

torch.nn.BatchNorm2d是对特征图所进行的batch norm,输入的特征维度为pytorch版本bert代码 pytorch batchnorm_pytorch版本bert代码_05。其他参数与上边相同。求平均值和方差是以通道为单位。例如对于多个RGB图片,先求R通道的均值和方差:对所有图片的R通道的数进行求取。

好处:
(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,更加有利于优化的过程,提高整个神经网络的学习速度。
(2)BN使得模型对初始化方法和网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定

(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过normalize操作可以使得参数值落到0附近,也就是梯度非饱和区,缓解梯度消失的问题。
(4)BN具有一定的正则化效果
在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。原作者也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。