批量归一化是一种用于提高神经网络训练速度和稳定性的技术。它的工作原理是在训练过程中对每一层的输入进行归一化,调整它们的均值和方差。这有助于缓解内部协变量偏移等问题,即层输入分布的变化会迫使后面的层不断适应,从而减慢训练速度。通过标准化这些输入,批量归一化允许网络以更高的学习率更有效地学习,并降低对初始权重值的敏感性。
该过程在训练期间包括两个主要步骤。首先,对于每个小批量数据,层的输出通过减去批量的均值并除以批量的标准差来进行归一化。这使数据以零为中心并将其缩放到单位方差。其次,归一化值使用两个可学习的参数 gamma (γ) 和 beta (β) 进行缩放和移位,这恢复了网络表示非线性转换的能力。例如,在卷积神经网络 (CNN) 中,批量归一化通常应用于卷积层之后,但在像 ReLU 这样的非线性激活之前。在推理过程中,模型不使用特定于批次的统计数据,而是使用训练期间计算的均值和方差的运行平均值,以保持一致性。
主要优点包括更快的收敛速度和减少对仔细权重初始化的依赖。例如,训练一个没有批量归一化的深度 ResNet 可能需要对学习率进行细致的调整,而使用批量归一化,即使使用更简单的初始化,网络也能可靠地收敛。此外,小批量统计数据引入的噪声充当温和的正则化器,在某些情况下减少了过拟合。但是,批量归一化会增加计算开销,并且在非常小的批量大小下可能会出现意外行为。开发人员经常在存在深层或饱和激活函数(如 sigmoid)的架构中使用它,因为它有助于维持稳定的梯度。在实践中,像 TensorFlow 或 PyTorch 这样的框架通过层(例如,BatchNorm2d
)来实现它,自动处理统计跟踪。