批归一化(Batch Normalization,简称批归一化)是一种用于人工神经网络的技术,旨在通过调整每一层的输入,使其重新围绕零均值并缩放至标准大小,从而加快训练速度并提升稳定性。该技术由Sergey Ioffe和Christian Szegedy于2015年提出。此后,它已成为许多深度学习架构中的标准组件,尤其在卷积网络和全连接网络中广泛应用,并普遍用于现代机器学习系统,包括支撑大语言模型及其他生成式人工智能应用的系统。
其核心思想是:在训练过程中,对每一层的激活值,基于一个小批量(mini-batch)的数据,计算每个维度的均值和方差,然后进行平移和缩放。这一过程降低了网络对初始化参数和超参数选择的敏感性,使得可以使用更高的学习率,并常常减少对其他正则化技术(如丢弃法)的需求。尽管该方法被广泛采用,但其有效性的确切原因仍是当前研究的热点与争议话题。
历史背景
批归一化源于对训练深度神经网络所面临挑战的应对。在2010年代初期,谷歌深度思维、开放人工智能等实验室的研究人员正在探索如何提高收敛速度与稳定性。2015年,Ioffe和Szegedy(当时均任职于谷歌)提出了一种实用方法,可无缝集成到现有训练流程中,且几乎无需额外开销。该技术迅速普及,并成为TensorFlow和PyTorch等主流框架中的默认选择。
在批归一化出现之前,训练深度网络通常需要仔细调整学习率、权重初始化方案和激活函数,以避免梯度消失或梯度爆炸等问题。批归一化提供了一种更系统化的解决方案,其成功也催生了一系列相关归一化技术,如层归一化和实例归一化,它们在不同场景下各有应用。
内部协变量偏移
神经网络中每一层的输入分布会随着训练过程而变化,这主要由两个因素引起:网络参数的随机初始值以及输入数据的自然波动。这种输入分布的变化被称为内部协变量偏移。尽管其严格定义尚未完全统一,但实验表明,它涉及训练过程中各层输入均值和方差的动态变化。
批归一化最初正是为了应对内部协变量偏移而设计。在训练中,随着前层参数的调整,当前层的输入分布会随之改变,迫使该层不断适应新的分布。这一问题在深层网络中尤为严重,因为前层微小的变化会在网络传播中被放大,导致深层隐藏层的分布发生显著偏移。批归一化通过减少这些不必要的偏移,加速了训练并提升了模型的可靠性。
过程
变换
在神经网络中,批归一化通过一个归一化步骤来实现,该步骤固定每一层输入的均值和方差。理想情况下,归一化应基于整个训练集进行,但在随机优化方法中,使用全局信息并不现实。因此,归一化被限制在每个小批量内进行。
设一个小批量 \(B\) 的大小为 \(m\),其经验均值和方差计算如下:
\[
\mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i
\]
以及
\[
\sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2
\]
对于一个 \(d\) 维输入 \(x = (x^{(1)}, \ldots, x^{(d)})\),每个维度被独立归一化。对于小批量中的每个样本 \(i\) 和每个维度 \(k\),归一化后的值为:
\[
\hat{x}_i^{(k)} = \frac{x_i^{(k)} - \mu_B^{(k)}}{\sqrt{(\sigma_B^{(k)})^2 + \epsilon}}
\]
其中 \(\epsilon\) 是一个用于数值稳定性的小常数,通常取 \(10^{-5}\) 量级。这确保了归一化后的激活值具有零均值和单位方差。
缩放与平移
仅仅归一化输入可能会限制层的表示能力,因此批归一化层引入了两个可学习参数:缩放因子 \(\gamma^{(k)}\) 和平移因子 \(\beta^{(k)}\)。该层的最终输出为:
\[
y_i^{(k)} = \gamma^{(k)} \hat{x}_i^{(k)} + \beta^{(k)}
\]
这些参数在训练过程中通过反向传播进行学习,使网络能够在必要时撤销归一化,以保持最优的表示能力。实践中,\(\gamma\) 通常初始化为1,\(\beta\) 初始化为0,因此该层初始时执行标准归一化,随后逐步调整。
推理阶段
在训练时,均值和方差是从当前小批量中计算的。然而,在推理阶段(即对新数据进行预测时),小批量可能仅包含一个样本,或者无法获得。为处理这一情况,网络使用训练期间计算的运行平均值(running averages)作为均值和方差。这些运行统计量在每个小批量更新时,通常采用动量因子(常为0.99)进行移动平均更新。在推理时,归一化使用这些固定统计量,从而使操作具有确定性,且不依赖于批量大小。
理论解释
关于批归一化为何有效,专家们仍存在争论。最初,它被认为是通过减少内部协变量偏移来起作用。然而,较新的研究表明,其效果并非主要源于此,而是因为它平滑了损失函数的优化地形。具体而言,批归一化降低了损失函数的利普希茨常数,使得梯度下降可以采用更大的步长而不会发散,这解释了为何可以使用更高的学习率。此外,也有研究指出,批归一化通过引入小批量统计量的随机波动,提供了一种隐式正则化效果,类似于噪声注入,从而提升了泛化能力。
变体与扩展
批归一化启发了多种针对不同架构和场景的变体。层归一化由Jimmy Lei Ba和Jamie Kiros于2016年提出,它针对每个样本的特征进行归一化,而非基于批量,因此特别适用于循环神经网络和变换器。实例归一化则用于风格迁移,它对每个样本的每个通道进行归一化。组归一化由Yuxin Wu和何恺明于2018年提出,它将通道划分为若干组,并在组内进行归一化,在小批量大小受限时表现良好。
在变换器模型(支撑许多大语言模型)中,层归一化比批归一化更为常见,但批归一化仍广泛用于卷积网络,如图像分类和目标检测任务。此外,一些混合方法,如可切换归一化,会动态地组合不同的归一化技术。
实践考量
实现批归一化需要仔细处理训练和推理两个阶段。在训练时,批量大小应足够大,以提供可靠的均值和方差估计;小批量可能导致统计量噪声过大,进而影响训练稳定性。在分布式训练中,全局批量被拆分到多个设备上,均值和方差通常在各设备上分别计算,这可能导致不一致。为此,已开发出同步批归一化技术,用于跨设备聚合统计量。
批归一化还与网络中的其他组件相互作用。例如,它通常放置在线性变换之后、激活函数之前,但具体位置可能因架构而异。在残差网络中,批归一化通常在跳跃连接相加之前应用,这有助于缓解前述的梯度爆炸问题。
影响与遗产
批归一化的引入对人工智能领域产生了深远影响。它使得训练更深层的网络成为可能,例如152层的残差网络(ResNet),该网络在2015年的ImageNet竞赛中获胜。此外,它还减轻了超参数调优的负担,加速了学术界和工业界的实验进程。如今,批归一化仍是深度学习工具箱中的基础工具,其原理也影响了后续多种归一化技术的设计。尽管其理论基础仍存在争议,但其实际效益毋庸置疑,并且它依然是许多最先进模型中的关键组成部分。
参见
- 深度学习
- 神经网络
- 机器学习
- 变换器