归一化层
批量归一化(Batch Normalization)的公式是什么?它在训练和测试阶段的行为有何不同?¶

公式(训练阶段)

其中 γ 和 β 是可学习的缩放和平移参数,ϵ 是防止除零的微小常数。
训练和测试阶段的不同
- 训练阶段:直接使用当前 mini-batch 的均值和方差进行归一化。同时,为了在测试时使用,需要维护全局统计量(通常是训练过程中每个 batch 的均值和方差的指数移动平均):

- 这样保证了测试时每一层的输出是确定性的,不依赖于 batch 大小和具体样本组成。
BN 为什么能加速训练?请从内部协变量偏移和损失地貌平滑的角度解释。¶
传统解释:内部协变量偏移 (Internal Covariate Shift) 的减轻
深层网络中,由于前面层的参数更新,后面层接收到的输入分布不断变化,迫使学习率不能太大,且需要小心初始化。BN 通过对每层的输入进行归一化,强制保持均值为 0、方差为 1(再进行缩放和平移),使得每层的输入分布相对稳定。这减少了层与层之间的分布耦合,允许使用更大的学习率,从而加速收敛。
现代观点:损失地貌变得平滑
近期研究(如 Santurkar et al., 2018)认为,BN 主要的好处并非来自内部协变量偏移的消除,而是因为它重新参数化了优化问题,使得损失曲面更加平滑。具体来说:
-
BN 使损失函数对参数梯度的 Lipschitz 连续性更好,即梯度的变化幅度更小,损失函数表面更加“平缓”。
-
这会带来更好的优化条件:梯度更加稳定、可预测,可以使用更大的学习率而不会震荡或发散。
-
BN 减少了损失对参数初始化和学习率的敏感性,使优化路径更加直接,从而训练更快、更容易收敛到好的极小值。
因此,BN 加速训练的原因更多在于优化地形得到了改善,而不是单纯稳定输入分布。
BN 中的可学习参数 gamma 和 beta 有什么作用?¶
尽管 BN 将输入归一化为零均值和单位方差,但这种固定的分布可能会限制网络的表达能力。例如,对于 sigmoid 激活函数,如果输入始终处于均值为 0、方差为 1 的分布,它可能主要在近似线性区工作,而失去了非线性的能力。γ 和 β 恢复了网络的表示能力:
-
γ 可缩放归一化后的值,相当于调整标准差。
-
β 可平移归一化后的值,相当于调整均值。

计算 BN 对一个 mini-batch 的均值和方差;反向传播时梯度如何流动?¶
前向计算(已在上文写出):

当 batch size 很小时,BN 的性能为什么会严重下降?有什么替代方案?¶
性能下降原因:
-
BN 依赖 mini-batch 的统计量来估计全局的数据分布。当 batch size 很小时,每个 mini-batch 的样本数量不足以反映整体数据的均值和方差,导致统计量的估计噪声极大。
-
训练时,这种噪声会引入不稳定的归一化,使训练曲线震荡,收敛变慢甚至不收敛。
-
测试时使用全局移动平均统计量,但训练时由于 batch 统计量噪声大,移动平均估计也不够准确,导致训练和测试之间的不一致性加剧(分布偏移),损害泛化能力。
-
在极小 batch(如 1 或 2)中,方差甚至可能为零或异常波动,导致数值问题。
替代方案:
-
Layer Normalization (LN):在特征维度内归一化,不依赖 batch 维度,适合小 batch 或序列模型。
-
Instance Normalization (IN):在单个样本的每个通道上归一化,通常用于风格迁移。
-
Group Normalization (GN):将通道分组,在每组内归一化,是 LN 和 IN 的折中,对于小 batch 的图像任务表现很好,甚至超过 BN。
-
Batch Renormalization:在训练时使用经过修正的移动平均统计量来缓解小 batch 噪声。
-
SyncBN (Synchronized BN):跨 GPU 通信计算全局 batch 统计量,但无法减小单机极小 batch 的根本问题。
-
使用更小的学习率和更保守的训练策略,但往往不及 GN/LN 有效。
因此,在小 batch 场景(比如目标检测、分割因显存限制 batch 为 1~2),通常直接采用 GN 或 LN,而不使用 BN。
Layer Normalization (LN) 与 BN 的根本区别是什么?它在哪个维度上归一化?¶
根本区别:
-
归一化的维度不同: BN:对每个特征通道,在 batch 维度(不同样本)上计算均值和方差。即对于某个神经元,统计一个 batch 内所有样本在该神经元上的值。 LN:对每个单独样本,在 特征维度(所有通道/神经元)上计算均值和方差。即对于一层内的所有神经元,取一个样本的所有特征值,计算均值和方差进行归一化。
-
具体来说,假设输入张量形状为 (N,C,H,W)(图像)或 (N,D)(全连接)或 (N,L,C)(序列)。
- BN:计算每个通道 c上,所有 N,H,W 元素的均值和方差(形状为 (C,))。
- LN(通常应用于 (N,D) 或 (N,L,C) 的最后维度 C):对每个样本 n(和每个位置 l 如果序列),在特征维度 C 上归一化。即均值方差形状为 (N,) 或 (N,L)。
因此,LN 不依赖 batch 统计,每个样本独立归一化,不会因 batch size 小而受影响。
为什么 LN 在 RNN、Transformer 中广泛使用,而 BN 很少用于序列模型?¶
-
序列长度可变和时序依赖性:在 RNN 中,输入序列长度不一,共享的权重矩阵作用于每一个时间步。BN 要求统计每个时间步上 batch 内样本的均值和方差,但序列长度不同时,padding 造成统计困难,且不同时间步的分布可能完全不同,共享统计量不合理。LN 在每个时间步对单个样本的特征归一化,不涉及 batch 和时间维度,天然适合。
-
训练和测试的不一致:RNN 在测试时通常逐个样本地生成序列,若使用 BN,需要借助训练时预存的运行均值和方差,但因为序列生成是自回归的,输入分布与训练时不同,导致不一致问题严重。LN 在测试时行为与训练一致(都是对单个样本的特征归一化)。
-
Transformer 中的使用:Transformer 虽然处理整个序列,但同样面临序列长度变化和 batch 内样本差异大的问题。LN 在每个 token 的特征上归一化,使训练更稳定。而且 Transformer 通常 batch 较小(受限于序列长度和模型尺寸),BN 噪声大;LN 则完美规避。另外,Transformer 的残差结构和 LN 结合,能让信号更好传播。
-
实验验证:大量实验表明,对序列模型用 BN 往往带来训练不稳定甚至无法收敛,LN 则取得优异效果,因此成为默认选择。
Instance Normalization (IN) 和 Group Normalization (GN) 分别适用于什么任务?¶
Instance Normalization (IN):
-
归一化维度:对每个样本独立地在每个通道上,在空间维度(H, W)上计算均值和方差。输出形状同输入,每个样本每个通道归一化到 0 均值 1 方差。
-
适用任务:图像风格迁移、图像生成(如 CycleGAN、Pix2Pix 等)。因为风格迁移希望保留内容特征的空间结构,但去除样式信息(均值和方差代表特定风格)。IN 将每个样本的每个通道归一化,相当于抹除了该通道的均值和方差信息,使得生成结果不受原始图像对比度等风格的影响,便于风格迁移和纹理合成。在低级视觉任务中也有应用。
Group Normalization (GN):
-
归一化维度:将通道分成若干组,对每个样本,在每一组内的所有通道和空间维度(H, W)上归一化。不依赖 batch 维度。
-
适用任务:小 batch 情况下的图像分类、目标检测、分割。当 batch size 很小(如 1 或 2)时,BN 失效,而 GN 的性能与 batch size 无关,且通常优于 LN 在视觉任务中的表现。GN 是 BN 和 LN 的折中:组数为通道数时退化为 IN,组数为 1 时退化为 LN。实验表明,GN 在 batch size 为 2 时图像分类精度远高于 BN,因此广泛应用于显存有限的任务中(如 Mask R-CNN 中使用 GN 替代 BN)。
比较 BN、LN、IN、GN 的应用场景和优劣势。¶
什么是“白化”操作?BN 是不是真正的白化?为什么?¶
白化 (Whitening):
在信号处理中,白化是指将一组随机变量变换为具有零均值和单位协方差矩阵(即去相关,各分量方差为

-
真正的白化需要整个协方差矩阵的对角化,而 BN 仅是逐元素变换。因此 BN 可视为一种简化的、忽略相关性的白化,或者说是逐维度的标准化。
-
虽然 BN 没有完全白化,但这种简化在实践中不但计算高效,而且足以稳定训练。此外,BN 通过可学习的 γ,βγ,β 恢复了可能的任意线性变换,相当于给了网络一种能力去自行决定各维度间的相关性是否需要调整。
归一化层加在激活函数之前还是之后?两种方式各有什么影响?常见的放置顺序是什么?¶
-
在激活函数之前(预激活):即 x→BN→ReLU→... 这是原始 BN 论文的标准做法。此时 BN 作用于线性变换的输出(加权和),使其均值为 0、方差为 1,然后经过非线性激活。优点:对于 ReLU 等激活,避免输入偏向负值导致神经元死亡;能够保证激活前的分布稳定,让梯度有效流动。
-
在激活函数之后(后激活):即 x→ReLU→BN→... 这种方式会使 BN 作用于激活函数的输出,但 ReLU 的输出是非负的,且分布可能偏斜。虽然 BN 仍然可以将其归一化到零均值单位方差,但实验结果通常显示预激活效果更好,收敛更快。
-
常见的放置顺序: 在经典卷积网络中,通常是 Conv → BN → ReLU。 在 ResNet 的改进版中,提出了“预激活残差单元”:BN → ReLU → Conv,此时 BN 和激活在卷积之前。而在 Transformer 中,LN 通常用于残差连接之后或自注意力/FFN 之前,也有不同变体(Post-LN 和 Pre-LN)。目前 Post-LN 是原始 Transformer 的方式,但 Pre-LN 训练更稳定,被越来越多采用。
结论:虽然都有应用,但普遍认为将归一化放在激活之前能够确保非线性层的输入分布在更合理的范围内,更有利于训练。
如何理解 BN 带来的轻微正则化效果?¶
BN 在每个 mini-batch 上计算均值和方差来归一化,由于 batch 是随机采样的,因此这些统计量本身就是带噪声的。这种噪声会给每次的归一化引入随机扰动,相当于在训练过程中对激活值施加了一种乘性和加性的随机偏移。这个现象类似于数据增广或Dropout——每次迭代网络看到的归一化结果略有不同,迫使模型不过度依赖特定神经元的精确输出值,从而具有一定的正则化能力,减少过拟合。
然而,这种正则化效果较弱,并且随 batch size 的增大而减弱(因为大 batch 的统计量更接近真实值,噪声变小)。因此,BN 不能完全替代 Dropout 等专门的正则化手段,尤其在 batch size 很大时几乎没有正则化。实践中,使用 BN 的同时常常可以减少或取消 Dropout,因为 BN 已提供一部分正则化,两者叠加可能过度。此外,有论文专门研究 BN 的正则化效应,发现它不仅来自噪声,还由于其改变了损失曲面的几何性质,使优化更容易走向平坦极小值,这本身也有助于泛化。
为什么越来越多的现代架构使用 LN 或 RMSNorm 替代 BN?¶
-
摆脱对 batch size 的依赖:BN 的性能严重受限于 batch size,而现代大模型(如 LLM)训练时受显存限制,batch size 相对较小(如微调时可能 batch size 1),且分布式训练中跨设备同步 BN 统计量开销大。LN 和 RMSNorm 完全独立于 batch 维度,无需维护运行统计量,在训练和测试时行为一致,简化了工程。
-
更好的序列建模兼容性:Transformer 等序列模型天然要求处理变长序列,LN 能够在每个 token 位置单独归一化,适合自回归生成。
-
训练稳定性:在大型 Transformer 中,Post-LN 存在训练不稳定的问题,Pre-LN 及 RMSNorm 通过将归一化置于残差分支之前,使梯度更容易传播,避免了深层 Transformer 中常见的“训练崩溃”。
-
RMSNorm 更简单高效:RMSNorm 只缩放输入,而不去均值,计算量略低于 LN,同时在一些实验中效果相同或更好。这对于追求极致效率的大模型来说很有吸引力。
-
新架构验证:从 ViT 到 GPT、LLaMA 等现代网络,几乎都采用了 Pre-LN 或 RMSNorm 的结构,实验表明在各类任务上总体优于 BN。研究者逐渐形成了“视觉任务也许 BN 尚可,但 NLP 和多模态中 LN/RMSNorm 是默认”的共识。
在微调预训练模型时,冻结 BN 层还是继续更新?为什么?¶
通常建议继续更新 BN 层的统计量(即不冻结),但不一定更新 γ,βγ,β。原因如下:
-
特征分布变化:微调时新数据集的分布可能与预训练时不同,如果直接使用预训练好的全局运行均值和方差,可能导致归一化后的特征分布不匹配新数据,损害微调效果。因此需要让 BN 层适应新数据的统计信息。
-
实际操作:在 PyTorch 等框架中,即使将模型参数的
requires_grad设为 False 以冻结卷积层权重,BN 层默认仍然会更新其running_mean和running_var(因为这些不是通过梯度更新,而是在训练模式下通过累计当前 batch 统计量更新的)。如果确实想完全冻结,必须将模型设为eval()模式或单独设置 BN 的track_running_stats=False。但常见微调策略是将 BN 层切换到训练模式,让 running stats 继续滑动平均,同时可以选择是否让 γ,βγ,β 可训练。 -
经验法则:
- 如果新数据集与预训练数据集很相似,且微调学习率很小,冻结 BN 的统计量(使用预训练的运行均值和方差,并设置模型为 eval 模式)可能有效,且推理更快。
- 如果新数据集分布差异大(如自然图像到医学图像),则应继续更新 BN 统计量,有时甚至只更新 BN 的参数就能取得不错的效果(因为 BN 参数少)。
- 对于冻结特征提取器的微调,常用的方法是设置
model.train(),但将大部分层的requires_grad=False,这样 BN 层的运行统计量会更新,但 γ,βγ,β 不更新。需要特别注意:如果全连接层等被冻结,BN 仍会改变输入的归一化行为,可能和冻结的权重不匹配,此时就要仔细平衡。
推导 BN 在训练时的反向传播,并说明其中间计算需要保存哪些变量。¶
我们详细推导 BN 反向传播,并标识保存的中间变量。

首先,对 β 和 γ 很直接

我们逐项计算:

简化得到:

需要保存的中间变量(用于反向传播):

保存这些使反向传播能够在 O(m) 时间内完成,而不需要重新计算均值方差。在实际的深度学习框架中,BN 层会自动缓存这些值,供 backward 使用。