01
引言
批量归一化(BatchNorm)是现代深度学习实践者工具包的重要组成部分。在批量归一化论文中提出后不久,人们就认识到它在创建可以更快训练的深度神经网络方面具有变革性意义。
批量归一化(Batch Norm)是一种神经网络层,目前常用于许多架构中。它通常作为线性或卷积块的一部分被添加进来,有助于在训练过程中稳定网络。在本文中,我们将探讨什么是批量归一化、为什么需要它以及它是如何工作的。
02
输入数据归一化
在向深度学习模型输入数据时,标准做法是将数据归一化为零均值和单位方差。这是什么意思,为什么要这么做?
假设输入数据包含多个特征 x1、x2......xn。每个特征可能有不同的取值范围。例如,特征 x1 的取值范围可能从 1 到 5,而特征 x2 的取值范围可能从 1000 到 99999。
因此,对于每个特征,我们分别取数据集中所有样本的值,计算平均值和方差。然后使用下面的公式对输入数值进行归一化处理。
图 2:归一化输入可视化
为了了解在不进行归一化处理的情况下会发生什么,让我们来看一个例子,其中只有两个尺度截然不同的特征。由于网络输出是每个特征向量的线性组合,这意味着网络要为每个特征学习权重,而这些权重也处于不同的尺度上。否则,大特征就会淹没小特征。
然后,在梯度下降过程中,为了 "移动 "损失,网络必须对一个权重进行比另一个权重更大的更新。这会导致梯度下降轨迹在一个维度上来回摆动,从而需要更多的步骤才能达到最小值。
图 3:不同尺度的特征需要更长的时间才能达到最小值
在这种情况下,梯度曲线看起来就像一条狭窄的峡谷。我们可以沿着两个维度对梯度进行分解。一个维度上的坡度很陡,而另一个维度上的坡度要平缓得多。
图 4:狭窄的山谷导致坡度下降从一个斜坡反弹到另一个斜坡
相反,如果特征的尺度相同,梯度曲线就会像下面曲线一样更加均匀。这样,梯度下降就能顺利地降到最小值
图 5:规范化后的数据有助于网络更快收敛
03
BatchNorm的必要性
既然我们了解了什么是归一化,那么需要批量归一化的原因就开始变得清晰了。考虑网络的任何一个隐藏层。上一层的激活量就是这一层的输入量。例如,从下图中第 2 层的角度来看,如果我们 "清空 "之前的所有层,来自第 1 层的激活与原始输入没有任何区别。
我们对第一层输入进行归一化处理的逻辑同样适用于每个隐藏层。
图 6:每个隐层的输入是前一层的激活量,也必须进行归一化处理
换句话说,如果我们能以某种方式将前一层的激活值归一化,那么梯度下降就会在训练过程中收敛得更好。这正是批量归一化BatchNorm层的作用。
04
BatchNorm如何工作?
两个可学习的参数,称为 beta 和 gamma。 两个不可学习的参数(移动平均值和移动平均方差)被保存为批归一化层 "状态 "的一部分。
图 9:每个BN层都有自己的参数
图10:批量归一化层的计算过程
整个计算过程如下:
激活
上一层的激活值作为输入传递给批归一化层。数据中的每个特征都有一个激活向量。
计算均值和方差
对于每个激活向量,分别计算最小批次中所有值的均值和方差。
归一化
缩放和位移
这一步是批量归一化层引入后的巨大创新,赋予了它强大的功能。输入层要求所有归一化值的均值为0,方差为1,而批处理层则不同,它允许对其值进行移动(移动到不同的均值)和缩放(缩放到不同的方差)。方法是将归一化值乘以一个因子 gamma,再加上一个因子 beta。请注意,这是元素乘法,而不是矩阵乘法。
这一创新的巧妙之处在于,这些因子不是超参数(即模型设计者提供的常量),而是由网络学习的可训练参数。换句话说,每个BN层都能为自己找到最佳因子,从而移动和缩放归一化值,以获得最佳预测结果。
移动平均值
此外,批量归一化层还对均值和方差的指数移动平均值(EMA)进行持续计数。在训练过程中,它只需计算这个 EMA 值,但不做任何处理。训练结束时,它只需将该值保存为图层状态的一部分,供推理阶段使用。
最后,我们可以看到这些向量的形状。计算特定特征向量时涉及的值也用红色标出。不过,请记住,所有特征向量都是通过一次矩阵运算计算得出的。
图 11:批量归一化计算向量形状
前向传递后,我们照常进行后向传递。计算梯度并更新所有层的权重,以及BN层中所有 beta 和 gamma 参数。
05
推理过程中的BN层
这就是两个移动平均参数的用武之地--它们是我们在训练过程中计算出来并与模型一起保存的。在推理过程中,我们将这些保存的平均值和方差值用于批量归一化。
图 12:推理过程中BN层的计算
06
BN层的位置
07
总结
点击上方小卡片关注我
添加个人微信,进专属粉丝群!