批量归一化(Batch normalization)

动手学深度学习笔记-批量归一化 Batch normalization

  • 什么是批量归一化?
  • 为什么需要批量归一化?
  • 批量归一化如何起作用?
  • 总结与注意事项

什么是批量归一化?

  批量归一化是指对某一层的某一个批量数据进行归一化处理。方法是计算这个批量的均值和方差,利用如下公式处理批量数据:

x i + 1 = γ x i − μ B σ B + β {x_{i+1}}^ = \gamma \frac{{{x_i} - {\mu _B}}}{{{\sigma _B}}} + \beta xi+1=γσBxiμB+β
  其中 x i + 1 {x_{i+1}} xi+1表示批归一化之后的数据, μ B {\mu _B} μB表示这个批量样本的均值, σ B {\sigma _B} σB表示样本方差。可以看到,批量归一化在我们熟知的归一化的基础上对数据做了拉伸和偏移(即参数 γ \gamma γ和参数 β \beta β),这也是批量归一化的灵魂。
  如果仅仅是把数据做归一化使其符合高斯分布,虽然可以让网络训练更快,但某种程度上会限制网络的学习能力(把数据分布限制住了),而加入这两个参数后,相当于对数据做了尺度变换,这使得数据的分布可以更加自由(但是总体上依然大致符合高斯分布,戴着镣铐跳舞),而且这两个参数是可学习的,因此可以把批量归一化这个操作视为网络的一层,即BN层。
  对于图像数据,批量归一化是在通道维进行的。稍微有点难以理解,举例说明:例如,一批64x32x256x256的数据,其均值和方差是在通道维求出的1x32x1x1的张量。单看每一个通道,把每个像素点当做样本,一个通道对应着64x256x256个像素数据,在通道维求均值也就是求这个通道对应的64x256x256个像素值的均值。得到的结果自然是1x32x1x1的张量。求出均值后每个像素点都带入上述公式计算批量归一化后的结果。

为什么需要批量归一化?

  层数较深的网络一般来说收敛较慢,训练起来非常困难。最大的原因是:反向传播计算梯度时,越靠近输出的层更容易收敛,越靠近数据的层收敛会很慢。而靠近数据的网络层的参数稍微一改变,靠近输出的网络参数又需要重新更新,导致网络收敛慢,本质上是因为浅层和深层收敛不同步。
  收敛不同步的原因是:深层网络参数的梯度一般比较大(链式法则求导,越靠近输出求导时连乘的偏导项越少),参数更新比较快;浅层网络参数的梯度一般很小(链式法则求导,越靠近数据端求导时连乘的偏导项越多,而偏导数一般比较小;那么偏导项越多,梯度值越小),非常容易出现梯度消失的问题,参数更新慢。

批量归一化如何起作用?

  李沐老师给出的直觉上的解释是:让小批量的数据分布都近似符合正态分布,这样网络学起来更快(好吧没懂)。我个人的理解是,如果极端一点,在原本网络的每一层后面都加一层批量归一化层,那么每一层的数据分布大致都是一样的,这样网络学起来自然快;但问题是不能这样做,这会极大限制住网络的学习能力,因此BN层的数量应该酌情添加。 作者的解释是:BN可以减小训练时数据内部协变量的转移(O.o)。
  还有一种说法是:BN实际上是在每一个小批量加入了噪声,理由是小批量的均值与方差可以认为是随机的。因为每一个小批量的数据量相对整个数据集来说是很小的,它的均值和方差代表不了整个数据集的均值和方差,具有很大的随机性,因此不同小批量的均值方差差异很大,视为随机噪声。向网络添加随机噪声是可以一定程度上缓解过拟合的,因此BN也被视为一种正则化的手段。

总结与注意事项

  • 两个可学习的参数 γ \gamma γ β \beta β
  • 作用在全连接层和卷积层的输出,激活函数之前。
  • 也可以作用在全连接层和卷积层的输入。
  • 对于全连接层,作用在特征的维度上。
  • 对于卷积层,作用在通道维。

你可能感兴趣的:(batch,深度学习,机器学习,python)