Datawhale X 李宏毅苹果书 AI夏令营 第五期LeeDL task3

# 3.7 批量归一化(Batch Normalization,BN)

目的:消除不同特征间的量级差异,减小特征尺度差异对模型的影响。

常用方法:

Z 值归一化(Z-score Normalization)

\[
x' = \frac{x - \mu}{\sigma}
\]

- \(x\) 是原始数据的值。
- \(\mu\) 是数据的均值。
- \(\sigma\) 是数据的标准差。
- \(x'\) 是归一化后的数据值。

1. 均值为0:经过Z值归一化后的数据,其均值为零,即数据中心位于原点。这有助于消除特征间的偏差,使模型在不同特征上更加公平地学习。

2. 标准差为1:数据的标准差被调整为1,这意味着数据的分布会被压缩或拉伸,使得数据在各个维度上具有相同的量级。这对于一些对数据尺度敏感的算法,如支持向量机(SVM)、线性回归等,尤为重要。

3. 注意事项

1)离群点:Z 值归一化对离群点不敏感,因此在数据中存在显著离群点时,可能需要先处理这些异常值再进行归一化。
2)模型解释性:由于Z 值归一化改变了数据的尺度,某些情况下,可能会影响模型结果的解释性。

考虑深度学习,可以对中间层z做特征归一化(使用sigmoid作为激活函数的时候特别推荐),能够稳定和加速网络的训练过程。以下是几种常用的归一化方法:

1. 批量归一化(Batch Normalization)

批量归一化是一种广泛应用的方法,用于对中间层的激活值进行归一化。其核心思想是对每一层的激活值进行标准化处理,使得每个批次的数据分布更加稳定,从而减少模型对初始权重和学习率的敏感性。适用于批量大小较大(即这个批量里的数据可能足以代表整个数据集的分布)的情况。

批量归一化的步骤:
1)对激活值 \( z \) 计算均值 \( \mu_B \) 和方差 \( \sigma_B^2 \):
   \[
   \mu_B = \frac{1}{m} \sum_{i=1}^{m} z_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (z_i - \mu_B)^2
   \]
   其中,\( m \) 是当前批次的样本数量。

2)使用计算出的均值和方差对 \( z \) 进行标准化:
   \[
   \hat{z}_i = \frac{z_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}
   \]
   其中,\( \epsilon \) 是一个小的正数,防止分母为零。

3)对标准化后的激活值进行缩放和平移:
   \[
   z'_i = \gamma \hat{z}_i + \beta
   \]
   其中,\( \gamma \) 和 \( \beta \) 是可学习的参数,用于恢复归一化前的表示能力。

4)将 \( z' \) 作为归一化后的输出,继续传递给网络的下一层。

2. 层归一化(Layer Normalization)

层归一化与批量归一化类似,但它是针对单个样本而不是整个批次进行归一化。这种方法特别适用于在循环神经网络(RNN)或其他具有动态输入长度的网络结构中。

层归一化的步骤:
1)对每个样本的激活值 \( z \) 计算均值 \( \mu_L \) 和方差 \( \sigma_L^2 \):
   \[
   \mu_L = \frac{1}{n} \sum_{j=1}^{n} z_j, \quad \sigma_L^2 = \frac{1}{n} \sum_{j=1}^{n} (z_j - \mu_L)^2
   \]
   其中,\( n \) 是每层神经元的数量。

2)使用均值和方差对 \( z \) 进行标准化:
   \[
   \hat{z}_j = \frac{z_j - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}}
   \]

3)对标准化后的激活值进行缩放和平移:
   \[
   z'_j = \gamma \hat{z}_j + \beta
   \]
   其中,\( \gamma \) 和 \( \beta \) 是可学习的参数。

3. 实例归一化(Instance Normalization)

实例归一化与层归一化类似,但它是应用于卷积神经网络中的图像处理任务。它对每个样本的每一个特征图进行归一化。

4. 群归一化(Group Normalization)

群归一化是一种在特征图通道上分组进行归一化的方法。它结合了批量归一化和层归一化的优点,特别适用于小批量或单样本训练的情况。

选择归一化方法的考虑因素

- 批量归一化:适用于大批量的训练,通常能显著加快训练速度和提升性能。
- 层归一化:适用于小批量或循环神经网络,避免了批量大小对归一化效果的影响。
- 实例归一化:常用于图像生成任务,例如风格迁移。
- 群归一化:适用于微小批量,提供了一种在内存受限条件下稳定训练的方法。

每种归一化方法都有其特定的应用场景,根据实际问题的需求选择合适的方法,可以有效地提高模型的训练效率和最终性能。

神经网络模型的测试(推理)阶段,归一化处理通常会与训练阶段略有不同,尤其是对于批量归一化(Batch Normalization)这种依赖批次统计量的归一化方法。在测试阶段的归一化处理主要涉及如何正确使用训练阶段学习到的统计信息,使得模型在推理时能够保持一致的性能。

1. 批量归一化(Batch Normalization)在测试阶段

在训练阶段,批量归一化会计算当前批次数据的均值和方差,并使用这些统计量对中间层的激活值进行归一化。然而,在测试阶段,由于输入数据通常是一条或几条样本,这时无法计算出稳定的均值和方差。因此,批量归一化在测试阶段采取不同的处理方式:

- 使用训练期间的移动平均值和方差:在训练过程中,批量归一化会维护全局的移动平均值和方差,这些统计量是在所有训练批次上累积计算的。测试阶段时,模型不再使用当前批次的均值和方差,而是直接应用这些训练阶段得到的全局统计量来进行归一化。

  具体来说,在测试阶段,批量归一化的计算公式变为:
  
  \[
  \hat{z} = \frac{z - \mu_{\text{train}}}{\sqrt{\sigma_{\text{train}}^2 + \epsilon}}
  \]
  
  其中,\(\mu_{\text{train}}\) 和 \(\sigma_{\text{train}}^2\) 分别是训练阶段累积得到的均值和方差。

  最终的输出依然会进行缩放和平移:
  
  \[
  z' = \gamma \hat{z} + \beta
  \]
  
  其中,\(\gamma\) 和 \(\beta\) 是训练阶段学习到的可调整参数。

在批量归一化中,移动平均值用于跟踪每个特征在整个训练期间的均值和方差。假设在第 \( t \) 次训练迭代中,我们计算了当前批次的均值 \( \mu_{\text{batch}}^{(t)} \) 和方差 \( \sigma_{\text{batch}}^{2(t)} \),那么全局均值和方差的更新方式可以如下进行:

  \[
  \mu_{\text{train}}^{(t+1)} = \alpha \mu_{\text{train}}^{(t)} + (1 - \alpha) \mu_{\text{batch}}^{(t)}
  \]
  \[
  \sigma_{\text{train}}^{2(t+1)} = \alpha \sigma_{\text{train}}^{2(t)} + (1 - \alpha) \sigma_{\text{batch}}^{2(t)}
  \]

  其中:
  - \(\mu_{\text{train}}^{(t)}\) 和 \(\sigma_{\text{train}}^{2(t)}\) 是迭代 \( t \) 时全局的移动平均值和方差。
  - \(\mu_{\text{batch}}^{(t)}\) 和 \(\sigma_{\text{batch}}^{2(t)}\) 是当前批次 \( t \) 的均值和方差。
  - \(\alpha\) 是一个平滑系数(通常接近1),决定了新旧信息在移动平均中的权重。

移动平均值的作用

- 平滑效果:通过引入平滑系数 \(\alpha\),移动平均可以缓解单个批次的随机波动对全局统计量的影响,从而得到更稳定、更可靠的均值和方差估计。这对于在测试阶段应用时尤为重要,因为测试数据通常是小批量甚至单条数据,直接计算均值和方差可能不准确。

- 全局信息的累积:移动平均使得我们能够在训练过程中逐步积累对整个数据集的统计信息,而不仅仅依赖于单个批次的统计量。这一全局信息在测试阶段能更准确地反映模型在训练过程中看到的特征分布。

移动平均在测试阶段的应用

在测试阶段,由于我们无法依赖批次统计量(通常测试数据批次较小或只有单个样本),因此使用训练期间积累的移动平均值和方差来归一化输入数据。这种方法确保了模型在测试阶段的行为与训练阶段一致,有助于维持模型的稳定性和性能。

示例

假设训练过程中,某一层的某个特征在每个批次中的均值为 \(\mu_{\text{batch}}^{(1)}, \mu_{\text{batch}}^{(2)}, \dots\),全局均值的更新过程如下:

1)初始时,全局均值 \(\mu_{\text{train}}^{(0)}\) 设置为0。
2)在第1个批次后,更新全局均值:
   \[
   \mu_{\text{train}}^{(1)} = \alpha \cdot 0 + (1 - \alpha) \cdot \mu_{\text{batch}}^{(1)}
   \]
3)在第2个批次后,进一步更新:
   \[
   \mu_{\text{train}}^{(2)} = \alpha \cdot \mu_{\text{train}}^{(1)} + (1 - \alpha) \cdot \mu_{\text{batch}}^{(2)}
   \]
4)依此类推,随着训练过程的继续,全局均值不断更新,逐渐接近训练数据集的实际均值。

通过这种方式,移动平均值为测试阶段提供了稳定的归一化基准。

2. 层归一化(Layer Normalization)、实例归一化(Instance Normalization)、群归一化(Group Normalization)

这些归一化方法在测试阶段的处理与训练阶段相同,因为它们的归一化过程并不依赖于批次统计量,而是依赖于单个样本或小组内的统计量。具体来说,这些归一化方法在测试阶段依然会根据当前输入数据的均值和方差进行归一化。

3. 总结

- 批量归一化:在测试阶段使用训练期间累积的移动平均值和方差来进行归一化,而不是依赖于当前批次的数据。这确保了模型在训练和测试阶段的一致性。
- 其他归一化方法:如层归一化、实例归一化、群归一化等,由于它们在训练和测试阶段的处理一致,测试阶段仍然对当前样本计算均值和方差进行归一化。

确保在测试阶段正确使用归一化,是保持模型在训练和推理阶段性能一致性的重要因素。

内部协变量偏移(Internal Covariate Shift)是深度学习中的一个概念,最早由谷歌研究员提出,用来描述在训练深层神经网络时,由于参数更新导致各层输入分布发生变化的问题。这种变化要求网络的后续层不断适应新的输入分布,导致训练过程变得不稳定,使得模型收敛速度变慢,甚至可能导致训练失败。

具体解释:
- 协变量偏移(Covariate Shift):通常指的是训练数据和测试数据的分布不同。在这种情况下,模型在训练时学到的特征在测试时可能不再适用,因为数据的分布已经改变。
- 内部协变量偏移:将协变量偏移的概念引入到神经网络的内部,即网络各层之间的数据分布在训练期间不断变化。

例如,在一个多层感知机(MLP)中,某一层的输出经过激活函数处理后成为下一层的输入。如果前一层的参数发生变化,导致其输出的分布改变,那么后续层需要不断调整参数以适应这些变化,这就引发了所谓的内部协变量偏移。

内部协变量偏移的影响:

- 训练速度变慢:由于每一层的输入分布在不断变化,网络中的各层需要更长的时间来适应新的分布,这会减慢整个网络的训练过程。
- 训练不稳定:如果内部协变量偏移过于严重,可能会导致训练过程中出现梯度爆炸或消失的现象,从而使得模型难以稳定训练。
- 需要更小的学习率:为了应对分布的变化,通常需要设置更小的学习率,这进一步延缓了训练速度。

解决内部协变量偏移的方法

批量归一化(Batch Normalization) 是应对内部协变量偏移的主要方法。

- 批量归一化的原理:通过对每一层的激活值进行归一化处理,将它们的分布标准化(即均值为0,方差为1),再对标准化后的值进行缩放和平移。这样,每一层的输入分布在训练过程中保持相对稳定,从而减轻了内部协变量偏移的影响。

  具体来说,批量归一化在每一层的输入上进行以下操作:
  1)计算当前批次的均值和方差。
  2)使用这些均值和方差对激活值进行归一化处理。
  3)对归一化后的激活值进行缩放和偏移。

  这种操作能够使每一层在训练过程中看到的输入分布保持相对一致,从而使网络更容易学习,并加快收敛速度。

- 其他方法:
  - 层归一化(Layer Normalization):用于处理循环神经网络(RNN)等结构中批次较小的情况,提供与批量归一化类似的效果。
  - 权值初始化:采用适当的权值初始化方法(如He初始化或Xavier初始化)可以在一定程度上减轻内部协变量偏移,尤其是在网络刚开始训练时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值