批量归一化(Batch Normalization, BN)和层归一化(Layer Normalization, LN) 是深度学习中常用的归一化方法,旨在加速训练过程、提高模型稳定性,并在某些情况下提高泛化能力。它们的核心思想是通过对数据进行标准化,使得神经网络在训练时能保持更稳定的分布,从而减少训练过程中出现的梯度消失或梯度爆炸等问题。
1. 归一化
1.1 Z-score 标准化(又称为 “零均值单位方差标准化” )
它的核心是将数据的均值调整为0,方差调整为1。
计算公式:
理解:
归一化后,数据被调整为均值为0、方差为1的分布 :
-
均值为0: 每个数据点都被减去原始数据的均值,使得所有数据点围绕0对称分布。
-
方差为1: 通过除以原始数据的标准差 𝜎,调整数据的尺度,使得数据的扩展程度(即方差)被规范化为1。
1.2 最小-最大归一化(Min-Max Normalization)
计算公式 :
-
数据缩放: 通过以上过程,数据被缩放到一个固定的范围,通常是[0, 1],也可以选择其他范围,如[-1, 1],这取决于应用需求。
-
对异常值敏感: 由于最小-最大归一化依赖于数据的最小值和最大值,如果数据中存在异常值(outliers),这些异常值会极大地影响归一化结果,使得其他正常的数据点被压缩到一个很小的范围。因此,归一化后的数据可能会出现很小的变动,甚至完全失真。
下面我会介绍神经网络/深度学习中常见的归一化方式,在这之前说说为什么它们需要归一化:
-
加速训练过程: 在神经网络的训练过程中,使用归一化的数据可以加快梯度下降的收敛速度。
例如,对于没有归一化的数据,不同特征的取值范围可能差异很大。假设一个神经网络的输入有两个特征,一个特征的取值范围是 [0, 1],另一个特征的取值范围是 [0, 1000]。在反向传播计算梯度时,由于梯度是基于损失函数对参数的偏导数,取值范围大的特征对应的梯度会比较大,取值范围小的特征对应的梯度会比较小。这会导致在梯度下降更新参数时,优化算法(如随机梯度下降 SGD)可能会在不同方向上以不同的速度更新参数。而归一化后,所有特征的取值范围相当,梯度下降在各个方向上的更新速度会更加均匀,从而加速收敛。 -
避免梯度爆炸/消失: 在深度神经网络中,尤其是在使用反向传播算法计算梯度时,梯度消失(Vanishing Gradient)和梯度爆炸(Exploding Gradient)是常见的问题。例如,在一个深层的递归神经网络(RNN)中,假设每层的激活函数是 Sigmoid 函数。如果输入数据没有归一化,随着数据在网络中的传播,其值可能会变得非常大或非常小。当输入到 Sigmoid 函数的值过大或过小时,Sigmoid 函数的梯度会趋近于 0,导致梯度消失。而归一化可以在一定程度上缓解这种数据分布变化的问题,减少梯度消失或梯度爆炸的发生概率。
-
稳定训练过程: 归一化可以使得每层的输出特征具有更好的均衡分布,减少网络对初始化参数、学习率等超参数的依赖,增强训练的稳定性。
神经网络/深度学习中常见的归一化方式:
2. 输入数据归一化(Normalization / Standardization)
将输入数据使用1中的方式归一化,将其缩放到一个相对较小的范围。
3. 批归一化(Batch Normalization, BN)
在深度神经网络中,随着层数的增加,激活值可能会变得非常大或非常小,这会导致梯度消失或梯度爆炸问题。批归一化通过对每一层的输入进行归一化,使得每一层的激活值分布更加稳定,避免了训练过程中出现极端的激活值。
归一化的对象: 在批次(Batch)维度上进行标准化,即每次计算当前批次中每个特征的均值和方差。
计算过程: 对于给定的一个批次 (一列,包含多个样本),对每个特征进行标准化:
常见应用:
-
深度神经网络: 批归一化常用于深度神经网络(网络的层数很深时)。通过对每一层的输入进行归一化,批归一化可以显著提高训练的稳定性和加速收敛。
-
卷积神经网络(CNN): 批归一化已成为卷积神经网络中常用的技术,尤其在处理大规模图像数据时,批归一化能够使网络更加稳定并加速训练。
BN在训练和测试时的区别:BN和Dropout在训练和测试时的差别
4. 层归一化(Layer Normalization, LN)
层归一化是另一种归一化技术,尤其适用于小批量数据或者递归神经网络(RNN)。
归一化的对象: 与批量归一化不同,层归一化是对每个样本的所有特征进行标准化,而不是对一个批次中的特征进行标准化。
计算过程: 对于每一个样本 (一行),层归一化计算该样本内所有特征的均值和方差,然后对该样本的所有特征进行标准化,与BN类似,LN也引入了可训练参数 𝛾(缩放)和 𝛽(偏移),用于恢复标准化后的数据的尺度和偏移。
常见应用:
-
循环神经网络(RNN): 在循环神经网络(尤其是长短期记忆网络LSTM和门控循环单元GRU)中,层归一化被广泛应用。与批归一化不同,层归一化是对每个样本独立地进行归一化,适用于序列数据。
-
Transformer模型: 在Transformer架构中,层归一化被用在每个子层的输出上,尤其是在多头自注意力机制和前馈网络之后。层归一化帮助加速训练和提高模型的稳定性。
实现参考: nn.LayerNorm的具体实现方法(通过公式复现)
4. 实例归一化(Instance Normalization,IN)
实例归一化是一种常用的归一化方法,特别适用于风格迁移、生成对抗网络(GANs)等图像生成任务/模型中。
归一化的对象: 实例归一化的核心思想是对输入数据中的每个样本(或每个实例)的每个通道(channel)进行归一化处理。与批归一化(Batch Normalization)对一个批次内的所有样本进行归一化不同,实例归一化是对每个样本独立操作。
计算过程:
实例归一化会对每个样本(N中的每一个)的每个通道(C中的每一个)独立地计算均值和标准差,然后进行归一化。
常见应用:
-
风格迁移(Style Transfer): 在风格迁移中,实例归一化帮助保留输入图像的风格特征。通过对每个图像样本的每个通道进行独立归一化,模型能够提取出不同图像的风格信息,并将这些风格应用到目标图像上。
-
生成对抗网络(GANs): 在生成对抗网络中,实例归一化帮助生成器模型生成更高质量的图像。它通过对每个图像样本进行归一化,有助于改善生成图像的质量并稳定训练过程。实例归一化对图像样式和细节的控制使其成为生成对抗网络中常用的技术。
-
图像生成(Image Generation): 实例归一化被广泛应用于各种图像生成任务中,特别是在 条件生成模型(如图像到图像的转换)中,使用实例归一化能够帮助生成模型更好地学习和控制图像的风格特征。
5. NLP中,为什么层归一化(LN) 更常用?
-
变长序列: NLP任务中的输入序列长度不固定,层归一化能有效处理变长序列,而批归一化(BN)依赖于批次中的数据均值和方差,可能会受到序列长度变化的影响。
-
小批次训练: NLP任务中通常使用较小的批次大小,BN在小批次时可能导致均值和方差估计不稳定,而LN不依赖于批次大小,适应性更强。
-
RNN和Transformer: 尤其在Transformer模型中,层归一化能够在每个样本的特征维度上进行归一化,避免了批归一化需要跨样本计算均值和方差的问题,从而提高了模型的训练稳定性。
可参考的两个资料: