资讯

批量归一化 BN 是什么?按小批量统计量把每层输入标准化

2026-11-053 分钟阅读百科
TL;DR批量归一化(Batch Normalization,BN)是 Ioffe 和 Szegedy 在 2015 年提出的技术,在训练时对每个小批量计算各通道的均值和方差,把激活标准化后再用可学习的缩放和平移参数调整,推理时使用训练中累积的滑动平均统计量;它加快收敛、允许更大学习率、具有一定正则化作用,但依赖批量大小,序列模型多改用层归一化。

批量归一化(Batch Normalization,BN)是深度神经网络中一种非常常用的技术,由谷歌的 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。它在网络的层与层之间,对每一个小批量数据的激活值进行标准化,让它们保持稳定的分布,从而显著地加快训练、让训练更加稳定。本站另有“归一化”词条介绍各类归一化方法,这里详细说明批量归一化的机制和使用要点。

训练时如何计算

以一个卷积层或全连接层的输出为例,批量归一化对每一个特征通道分别进行如下操作:第一步,计算当前这个小批量中,所有样本在这个通道上的平均值和方差(对于卷积层,还要在空间位置上一起统计);第二步,用每个值减去平均值,再除以标准差(分母中加一个很小的数防止除以零),把这个通道的数据变成平均值为 0、方差为 1;第三步,乘以一个可学习的缩放参数,再加上一个可学习的平移参数。第三步很重要:如果只做标准化,可能会限制网络的表达能力,比如让 Sigmoid 激活函数只工作在接近线性的区域;有了这两个参数,网络可以自己决定最合适的分布,甚至在需要时把标准化完全抵消掉。

推理时如何计算

训练时,统计量来自当前的小批量。但在推理时,可能一次只处理一个样本,或者希望同一个样本无论和谁放在一起,输出都一样,因此不能再用小批量的统计量。做法是:在训练过程中,用滑动平均的方式,持续地累积每个通道的均值和方差;推理时,直接使用这些累积下来的全局统计量。这样,批量归一化在推理时就变成了一个固定的线性变换,甚至可以合并到前一层的权重中,不增加额外的计算。在代码中需要注意切换训练模式和推理模式,忘记切换是一个常见的错误来源。

为什么它有效

原论文认为,批量归一化减少了“内部协变量偏移”:训练中前面各层参数的变化,导致后面各层的输入分布不断改变,批量归一化让这些分布保持稳定。后来的研究,比如 Shibani Santurkar 等人在 2018 年的工作,对这一解释提出了质疑,认为它更重要的作用是让损失函数的地形变得更加平滑,梯度更稳定、更可预测。无论原因如何,实际效果是明确的:可以使用更大的学习率、训练更快收敛、对权重初始化不那么敏感,还因为每个小批量的统计量带有随机性,起到了一定的正则化作用,有时可以减少对 Dropout 的依赖。它对 ResNet 等很深的卷积神经网络的成功训练起了重要作用。

局限和替代

批量归一化依赖于小批量的大小:批量太小时,统计量的估计很不准确,效果会明显变差,这在显存有限、图片很大的任务中,比如目标检测和图像分割,是一个问题。对于循环神经网络和 Transformer 这类处理长度不一的序列的模型,按批量统计也不方便。因此出现了多种替代方法:层归一化,在每个样本内部对所有特征进行标准化,不依赖批量,被 Transformer 和大语言模型广泛采用;组归一化,由吴育昕和何恺明在 2018 年提出,把通道分组后在每个样本内部标准化,在小批量时效果更好;实例归一化,常用于图像风格转换。在分布式训练中,还可以使用同步批量归一化,在多张显卡之间共享统计量。