跳转至

8 批量归一化

学习目标

  • 知道批量归一化公式

在神经网络的搭建过程中,Batch Normalization (批量归一化)是经常使用一个网络层,其主要的作用是控制数据的分布,加快网络的收敛。

我们知道,神经网络的学习其实在学习数据的分布,随着网络的深度增加、网络复杂度增加,一般流经网络的数据都是一个 mini batch,每个 mini batch 之间的数据分布变化非常剧烈,这就使得网络参数频繁的进行大的调整以适应流经网络的不同分布的数据,给模型训练带来非常大的不稳定性,使得模型难以收敛。

如果我们对每一个 mini batch 的数据进行标准化之后,数据分布就变得稳定,参数的梯度变化也变得稳定,有助于加快模型的收敛。

1. 批量归一化公式

  1. λ 和 β 是可学习的参数,它相当于对标准化后的值做了一个线性变换,λ 为系数,β 为偏置;
  2. eps 通常指为 1e-5,避免分母为 0;
  3. E(x) 表示变量的均值;
  4. Var(x) 表示变量的方差;

数据在经过 BN 层之后,无论数据以前的分布是什么,都会被归一化成均值为 β,标准差为 γ 的分布。

注意:BN 层不会改变输入数据的维度,只改变输入数据的的分布. 在实际使用过程中,BN 常常和卷积神经网络结合使用,卷积层的输出结果后接 BN 层。

2. BN 层的接口

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
  1. 由于每次使用的 mini batch 的数据集,所以 BN 使用移动加权平均来近似计算均值和方差,而 momentum 参数则调节移动加权平均值的计算;
  2. affine = False 表示 γ=1,β=0,反之,则表示 γ 和 β 要进行学习;
  3. BatchNorm2d 适用于输入的数据为 4D,输入数据的形状 [N,C,H,W]

其中:N 表示批次,C 代表通道数,H 代表高度,W 代表宽度

由于每次输入到网络中的时小批量的样本,我们使用指数加权平均来近似表示整体的样本的均值和方法,其更新公式如下:

running_mean = momentum * running_mean + (1.0  momentum) * batch_mean
running_var = momentum * running_var + (1.0  momentum) * batch_var

上面的式子中,batch_mean 和 batch_var 表示当前批次的均值和方差。而 running_mean 和 running_var 是近似的整体的均值和方差的表示。当我们进行评估时,可以使用该均值和方差对输入数据进行归一化。

3. 小节

本小节学习了批量归一化层,该层的作用主要是用来控制每层数据的流动时的均值和方差,防止训练过程出现剧烈的波动,模型难以收敛,或者收敛较慢。批量归一化层在计算机视觉领域使用较多。