BatchNorm层直观性解释

文摘   科技   2024-09-01 10:17   江苏  
点击蓝字
 
关注我们










01


引言



批量归一化(BatchNorm)是现代深度学习实践者工具包的重要组成部分。在批量归一化论文中提出后不久,人们就认识到它在创建可以更快训练的深度神经网络方面具有变革性意义。

批量归一化(Batch Norm)是一种神经网络层,目前常用于许多架构中。它通常作为线性或卷积块的一部分被添加进来,有助于在训练过程中稳定网络。在本文中,我们将探讨什么是批量归一化、为什么需要它以及它是如何工作的。






02


输入数据归一化


在向深度学习模型输入数据时,标准做法是将数据归一化为零均值和单位方差。这是什么意思,为什么要这么做?

假设输入数据包含多个特征 x1、x2......xn。每个特征可能有不同的取值范围。例如,特征 x1 的取值范围可能从 1 到 5,而特征 x2 的取值范围可能从 1000 到 99999。

因此,对于每个特征,我们分别取数据集中所有样本的值,计算平均值和方差。然后使用下面的公式对输入数值进行归一化处理。


图 1:我们如何实现归一化

在下图中,我们可以看到数据归一化后的效果。原始值(蓝色)现在以零(红色)为中心。这确保了所有特征值现在都在同一范围内。

图 2:归一化输入可视化

为了了解在不进行归一化处理的情况下会发生什么,让我们来看一个例子,其中只有两个尺度截然不同的特征。由于网络输出是每个特征向量的线性组合,这意味着网络要为每个特征学习权重,而这些权重也处于不同的尺度上。否则,大特征就会淹没小特征。

然后,在梯度下降过程中,为了 "移动 "损失,网络必须对一个权重进行比另一个权重更大的更新。这会导致梯度下降轨迹在一个维度上来回摆动,从而需要更多的步骤才能达到最小值。

图 3:不同尺度的特征需要更长的时间才能达到最小值


在这种情况下,梯度曲线看起来就像一条狭窄的峡谷。我们可以沿着两个维度对梯度进行分解。一个维度上的坡度很陡,而另一个维度上的坡度要平缓得多。

由于一个权重的梯度较大,我们最终会对其进行较大的更新。这导致梯度下降跳到斜坡的另一侧。另一方面,第二个方向上的梯度较小,导致我们的权重更新较小,因此步长也较小。这种不均匀的轨迹需要更长的时间才能使网络收敛。

图 4:狭窄的山谷导致坡度下降从一个斜坡反弹到另一个斜坡

相反,如果特征的尺度相同,梯度曲线就会像下面曲线一样更加均匀。这样,梯度下降就能顺利地降到最小值

图 5:规范化后的数据有助于网络更快收敛






03


 BatchNorm的必要性


既然我们了解了什么是归一化,那么需要批量归一化的原因就开始变得清晰了。考虑网络的任何一个隐藏层。上一层的激活量就是这一层的输入量。例如,从下图中第 2 层的角度来看,如果我们 "清空 "之前的所有层,来自第 1 层的激活与原始输入没有任何区别。

我们对第一层输入进行归一化处理的逻辑同样适用于每个隐藏层。

图 6:每个隐层的输入是前一层的激活量,也必须进行归一化处理


换句话说,如果我们能以某种方式将前一层的激活值归一化,那么梯度下降就会在训练过程中收敛得更好。这正是批量归一化BatchNorm层的作用。





04


  BatchNorm如何工作?


批量归一化(Batch Norm)是插入在隐藏层和下一个隐藏层之间的另一个网络层。它的工作是获取第一个隐藏层的输出,并在将其作为下一个隐藏层的输入之前对其进行规范化处理。

图 7:批量归一化层在第 1 层的激活到达第 2 层之前对其进行规范化处理
与任何网络层的参数(如权重、偏置)一样,批量归一化层也有自己的参数:
  • 两个可学习的参数,称为 beta 和 gamma。
  • 两个不可学习的参数(移动平均值和移动平均方差)被保存为批归一化层 "状态 "的一部分。

图 8批量归一化层在第 1 层的参数
这些参数是针对每个批量归一化层的。因此,如果网络中有三个隐藏层和三个批归一化层,那么这三个层就有三个可学习的 beta 和 gamma 参数。移动平均参数也是如此。

图 9每个BN层都有自己的参数

在训练过程中,我们每次向网络输入一个小批量数据。在前向传递过程中,网络的每一层都会处理这一小批数据。批量归一化层的数据处理过程如下:

图10:批量归一化层的计算过程

整个计算过程如下:

  • 激活

上一层的激活值作为输入传递给批归一化层。数据中的每个特征都有一个激活向量。

  • 计算均值和方差

对于每个激活向量,分别计算最小批次中所有值的均值和方差。

  • 归一化

使用相应的均值和方差计算每个激活特征向量的归一化值。现在,这些归一化值的均值为0,方差为1。
  • 缩放和位移

这一步是批量归一化层引入后的巨大创新,赋予了它强大的功能。输入层要求所有归一化值的均值为0,方差为1,而批处理层则不同,它允许对其值进行移动(移动到不同的均值)和缩放(缩放到不同的方差)。方法是将归一化值乘以一个因子 gamma,再加上一个因子 beta。请注意,这是元素乘法,而不是矩阵乘法。

这一创新的巧妙之处在于,这些因子不是超参数(即模型设计者提供的常量),而是由网络学习的可训练参数。换句话说,每个BN层都能为自己找到最佳因子,从而移动和缩放归一化值,以获得最佳预测结果。

  • 移动平均值

此外,批量归一化层还对均值和方差的指数移动平均值(EMA)进行持续计数。在训练过程中,它只需计算这个 EMA 值,但不做任何处理。训练结束时,它只需将该值保存为图层状态的一部分,供推理阶段使用。

最后,我们可以看到这些向量的形状。计算特定特征向量时涉及的值也用红色标出。不过,请记住,所有特征向量都是通过一次矩阵运算计算得出的。

图 11:批量归一化计算向量形状

前向传递后,我们照常进行后向传递。计算梯度并更新所有层的权重,以及BN层中所有 beta 和 gamma 参数。





05


  推理过程中的BN层


如上所述,在训练过程中,BN层会先计算一个小批次的均值和方差。然而,在推理过程中,我们只有一个样本,而不是一个批次。在这种情况下,我们如何获得均值和方差呢?

这就是两个移动平均参数的用武之地--它们是我们在训练过程中计算出来并与模型一起保存的。在推理过程中,我们将这些保存的平均值和方差值用于批量归一化。

图 12:推理过程中BN层的计算

理想情况下,我们可以在训练过程中计算并保存全部数据的均值和方差。但这样做成本很高,因为我们必须在训练过程中将整个数据集的值保存在内存中。相反,移动平均法可以很好地替代数据的均值和方差。它的效率更高,因为计算是递增的,我们只需记住最近的移动平均值。






06


  BN层的位置

关于批量归一化层在模型结构中的位置,有两种意见--激活前和激活后。最初的论文将其置于激活之前,但我想你会发现文献中经常提到这两种选择。有些人认为之后 的效果更好。这里由于不同任务架构不同,没有固定的结论。
图 13:BN层可以在激活前或者激活后使用





07


  总结

批量归一化层是一个非常有用的层,大家最终会在网络架构中经常用到它。希望这能让大家很好地理解批归一化层的工作原理。
您学废了吗?






点击上方小卡片关注我




添加个人微信,进专属粉丝群!


AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章