Batch Normalization

2025 年 2 月 3 日 | 阅读 9 分钟

什么是批量归一化?

批量归一化是一种深度学习过程,它通过缓解训练期间内部协变量偏移的问题,从而提高神经网络的性能并使其更准确,尤其是在训练深度网络时。换句话说,批量归一化是一种监督学习技术,它对神经网络层之间的激活进行归一化。这种归一化“重置”了层能够操作的分布范围,使数据分析更有效。

内部协变量偏移是指由于训练变化影响了上层,导致当前层输入分布的变化。这可能不利于优化,从而减慢模型收敛速度,可能导致次优解。归一化有助于将激活值保持在一定范围内,如果超出范围,可能会减慢各层的学习速率,使各层能够独立学习。

批量归一化可以主要降低 dropout 率,因为它以标准格式对输入进行归一化;这使得精度水平有了巨大提升。

批量归一化如何工作?

批量归一化通过减去批量均值,然后除以批量标准差来归一化,从而改进深度学习网络。如果损失函数很大,随机梯度下降会通过修改或归一化输出(通过影响下一层权重精度的参数)来固定标准化。

当应用于某一层时,批量归一化会将其输出的每个元素除以该批量归一化层的输出标准差,然后乘以该批量归一化层的输出均值。这里有两个可训练的参数,它们允许数据“恢复到原始尺度”,从而使批量归一化与梯度下降协调一致。因此,在调整相应权重时,数据损失最小化,网络稳定性得到增强。

批量归一化的主要目的是稳定学习过程并提高模型性能质量。它消除了微调的问题,并允许更高的学习率和更快的训练。批量归一化通常在非线性激活函数之前执行,并且通常与其他技术(如 dropout)结合使用。在图像分类、自然语言处理和机器翻译任务中的巨大性能使其成为现代深度学习方法中的标准程序。

批量归一化的优点

批量归一化的优点如下:

  1. 稳定训练过程:批量归一化消除了训练过程中的内部协变量偏移,从而使模型稳定并简化了模型优化过程。
  2. 提高泛化能力:这增加了模型的泛化能力,因为它最小化了层激活的过拟合。
  3. 减少对仔细初始化的需求:它减少了模型对初始权重的依赖,使训练更容易。
  4. 支持更高的学习率:批量归一化允许增加学习率的值,从而提高训练速度。

批量归一化的缺点

批量归一化的缺点如下:

  1. 依赖于批量大小:批量归一化利用了从 mini-batch 中获取的信息。这些是 mini-batch 的均值和方差。这种依赖性会使训练不稳定,尤其是在批量大小较小时,因为统计量的估计可能很嘈杂。
  2. 增加了计算开销:批量归一化在整个训练过程中插入了额外的操作,包括批量统计量的确定和归一化步骤。这可能非常耗时,从而可能极大地影响训练速度,尤其是在网络深度较大时。
  3. 循环神经网络 (RNN) 中的复杂性:然而,由于数据的顺序性,在 RNN 网络中应用批量归一化并不容易。

批量归一化与过拟合

批量归一化在减少过拟合方面可能有一些有益的作用,但它仍然不能保证模型不会过拟合。然而,如果模型相对于训练数据过于复杂,如果数据质量差,或者模型训练过程中存在问题,仍然会发生过拟合。因此,除了描述的 L1 正则化之外,还可以使用其他技术,如 dropout;在训练过程中使用单独的验证集来评估模型性能以避免过拟合也是必要的。

TensorFlow 中的批量归一化

代码步骤

  1. 利用 TensorFlow 的 Keras 客户端创建并设置一个基本的神经网络。
  2. 接下来,您需要向模型添加一个具有 64 个单元的 Dense 层。在此步骤中设置模型的输入形状也是必要的。
  3. 引入一个批量归一化层来规范化从上一层传入的数据。
  4. 该网络的最后一层应结合 ReLU 激活函数。
  5. 应添加另一个具有十个单元的 Dense 层。
  6. 在最后一层,添加 softmax 激活函数。
  7. 使用 Adam 优化器和稀疏分类交叉熵损失来拟合模型。
  8. 将模型拟合到训练数据,训练五个 epoch,批量大小为 32。

代码片段

说明

此代码展示了使用 TensorFlow 的 Keras 编程接口构建神经网络的基本结构。在此之后,是一个具有 64 个单元的层和一个用于规范化激活的批量归一化层。之后,它使用 ReLU 激活函数;然后它使用另一个具有十个单元的密集层并应用 softmax 激活函数。该模型使用 Adam 优化器进行训练,并使用稀疏分类交叉熵作为编译中使用的损失函数。最后,它将模型拟合到给定训练数据,训练五个 epoch,批量大小为 32。

PyTorch 中的批量归一化

代码步骤

  1. 导入将要使用的 PyTorch 模块。
  2. 通过继承 nn.Module 定义一个神经网络模型。
  3. 在模型的 __init__ 方法中
    • 输入层 784 个节点,连接层 64 个节点。
    • 每通道归一化也可能有用,因此,在 tanh 激活函数之前插入 BatchNorm1d 层。
    • 启动 ReLU 激活函数,该函数通常用于神经网络的层中。
    • 创建另一个具有 64 个输入特征和 10 个输出特征的密集层。
    • 为最后一层或输出层(也称为输出层)激活 softmax 激活函数。
  4. 实现 forward 方法来定义网络的前向传播
    • 将第一个全连接层应用于输入。
    • 应用批量归一化。
    • 应用 ReLU 激活。
    • 将此结果通过第二个全连接层。
    • 执行 softmax 函数作为激活函数。
  5. 实例化模型。
  6. 将损失函数设置为 CrossEntropyLoss,将优化器设置为 Adam。
  7. 训练模型五个 epoch
    • 第一个是循环遍历训练数据加载器。
    • 可能是进行前向传播、计算损失、进行反向传播、更新权重。

代码片段

说明

此 PyTorch 代码通过创建一个继承自 nn.Module 的自定义类来描述基本的神经网络架构。该架构包括一个全连接层,带有一个批量归一化层、ReLU 激活、第二个全连接层以及用于输出的最终 softmax 激活层。这会创建模型,损失函数设置为 CrossEntropyLoss,使用的优化器为 Adam。模型训练了 5 个 epoch,基于提供的数据加载器,并包括前向传播、计算损失、反向传播误差以及更新权重。

批量归一化方程

在训练期间,使用以下方程对每个 mini-batch 数据进行层激活的归一化:

Batch Normalization

在推理期间,层激活的归一化是使用训练期间计算的激活的均值和方差,而不是使用 mini-batch 的均值和方差。

Batch Normalization

缩放和平移的激活:zi = γyi + β,其中 γ 是输入特征的可学习参数,β 是输出特征的可学习权重。

批量归一化变体

层归一化

  • 描述:它根据数据实例级别的特征调整激活,而不是像批量归一化那样根据 mini-batch 级别进行调整。这是通过计算每个单独数据点的均值和方差来完成的。
  • 用例:但它在循环神经网络和 Transformer 中非常有用,而批量归一化在这里效果不佳,因为序列长度会变化。如在这些情况下所述,它解决了内部协变量偏移问题。
  • 方程:对于具有特征维度 d 的输入 x,层归一化由以下公式给出:
Batch Normalization

其中,μ 和 σ2 是在特征维度上取的平均值;ϵ(epsilon)是一个小的常数,用于避免数值不稳定性。

优点

  • 跨序列长度的一致性:当序列长度变化时,它很有用,因为归一化是在实例级别进行的。
  • 独立于批量大小:与批量归一化层不同,它不依赖于批量大小,因此可用于实验,例如批量大小不大或不固定的情况。

实例归一化

  • 描述:此归一化针对集合中的每个实例(或样本)进行,它们是相互独立的。它可用于风格迁移等生成领域。
  • 用例:通道乘法器主要用于风格迁移网络,其中需要更改图像的风格而不会改变内容。此技术用于管理和控制单个图像的风格。
  • 方程:对于具有空间维度(H,W)和 C 通道的输入 x,实例归一化由以下公式给出:
Batch Normalization

其中 μi 和 σi2 是为每个实例 iii 和每个通道计算的均值和方差。

优点

  • 改进风格迁移性能:因此,分段 CM 对每个实例进行独立归一化,并实现风格的有效组合。
  • 减少风格伪影:它有助于最小化由于风格混合而合成的图像中可能固有的伪影。

分组归一化

  • 描述:分组归一化进一步将通道划分为组,然后对该组中的特征进行归一化。它是批量归一化和实例归一化元素的混合。
  • 用例:分组归一化在 BN 可能表现不佳的领域更有用,包括批量大小较小或批量大小不同时。该工作已在目标检测和语义分割类别中进行了测试。
  • 方程:分组归一化意味着将输入 x 归一化为 G 组。也就是说,每个 G 组有 C/G 个通道,计算如下:
Batch Normalization

其中 µg 和 σ2 g 是在每个组 g 内计算的均值和方差。

优点

  • 批量大小的灵活性:与批量归一化相比,它与批量大小无关,因此适用于不同的训练环境。
  • 实例和批量归一化的平衡:它还具有最小化归一化策略的缺点并受益于这两种方法的优势的优点。

结论

批量归一化是一种非常有效的增强深度学习模型的技术,因为它包含在激活的 mini-batch 归一化中,解决了内部协变量偏移问题并加速了训练。它还使训练更稳定,提高了模型的泛化能力,减轻了初始权重的影响,并允许使用更高的学习率进行训练。同样,它也有缺点,包括对批量大小的依赖、计算时间增加和复杂性,尤其是在 RNN 中。

在 TensorFlow 中,批量归一化通过 tf.keras.layers 提供。它可以轻松地融入模型:Batch Normalization。PyTorch 使用 nn。展示了 BatchNorm1d 在一维数据集上的应用以及在不同框架上执行的能力。然而,尽管其有效性,在使用批量归一化时经常会出现过拟合,并且有必要添加其他形式的正则化并关注模型在训练期间的表现。