IT 论文精读 · PAPER 29
Sergey Ioffe & Christian Szegedy · Google · ICML 2015
2015 年,Google 的两位研究员提出了 Batch Normalization(简称 BN,中文叫「批归一化」)——一个塞进神经网络中间、代码只有几行的小零件。加上它之后,同一个网络训到同样的准确率,训练步数少了十几倍;他们顺手把 ImageNet 图像识别的错误率压到 4.9%,第一次低过「人类大约 5.1%」的估计。此后十年,从 ResNet 到几乎每个卷积网络,中间层后面都跟着一个 BN。
神经网络是一队人接力干活:第一层看出线条,第二层拼出零件,第三层认出物体。麻烦在于训练时所有人同时在改自己的做法——前面的人一改口径,后面的人收到的东西整个刻度就变了:昨天还是「零点几」的数,今天变成「几十」。后面的层刚适应好,前面又变了。为了不让这场混乱失控,当年的人只能把步子迈得很小(把学习率调低),还得小心翼翼地挑初始值。训练深网络因此又慢又玄学,像走钢丝。
BN 的想法朴素得近乎粗暴:每一层动手之前,先把它收到的那堆数字统一「调回标准刻度」。不管前面的人怎么折腾,交到下一层手上的永远是同一个量级、同一个范围。
具体怎么调?训练时数据是一小批一小批喂进去的(比如一批 32 张图)。BN 就拿这批同伴当参照:算出这批数字的平均值和波动幅度,把每个数减掉平均、除以幅度——整批数字于是被搬到「中心在零、胖瘦差不多」的位置。像一个班按平均分和分差把成绩换算成标准分:题目难易怎么变,标准分的分布总是稳的。
可硬把每层锁死在同一刻度上,会不会削掉网络的表达能力?作者留了个后门:每处额外配两个可学的旋钮,一个管「放多大」、一个管「往哪儿挪」。网络要是觉得原来的刻度更好,把旋钮拧回去就行,最坏情况能把这次归一化整个撤销。先强行拉回标准,再让网络自己决定要不要挪回去——这是全篇最关键的一手。
三件事同时被解决。一是步子终于能迈大:刻度稳了就不必靠小步慢走防翻车,学习率能往上调十几倍。二是学习信号不再被压扁:当年常用的一类激活函数会把数字压进 0 到 1 之间,数值一大就落进两头的平坦地带,输入再怎么变、输出也几乎不动,纠错信号就此中断——把数字拉回中间地带,正好躲开这个坑。三是顺手防了背题:标准分取决于同批同伴是谁,而每批是随机凑的,同一张图这轮和下轮算出来会有点抖动;这点噪声反而让网络不容易死记训练集。
诚实的一句:BN 的刻度是从「同批同伴」身上算来的——批凑得太小,刻度就不准,效果明显打折。
在每层动手之前,拿同一小批数据算出平均值和波动幅度,把收到的数字统一「换算成标准分」,再配两个可学的旋钮让网络能自行调回去。刻度稳了,学习率就能调大十几倍、信号不再被压扁,训练深网络从走钢丝变成了常规操作。
想看 BN 的公式、卷积层怎么做、推理时用什么统计量、以及后来对它「为什么有效」的翻案? → 切到精读版
Batch Normalization 把「按当前小批量(mini-batch)的均值与方差把每个激活值标准化,再用两个可学参数 γ、β 缩放平移」做成一个可反向传播的网络层,插在每个非线性之前。它让各层输入的分布在训练中保持稳定,从而允许大十几倍的学习率、削弱对初始化的依赖、并附带正则化效果——同一个 Inception 网络加上它后,达到基线精度所需的训练步数少了约 14 倍,集成模型把 ImageNet top-5 错误率做到 4.9%。
作者是 Google 的 Sergey Ioffe 与 Christian Szegedy(后者也是本文实验主体 Inception / GoogLeNet 的主要作者),论文发在 ICML 2015。它接续的是「让深网络训得动」这条线——Glorot / He 初始化、ReLU 都在解同一个问题;而它自己被接续得更彻底:同年稍晚的 ResNet 每个残差块里都嵌着 BN,此后归一化层成了深度网络的标准零件,并分化出 Layer Normalization(Transformer 用的那种)、Group Normalization 等一整族后代。
2015 年,深网络能不能训起来仍是个现实障碍。作者的诊断是:训练时每一层的输入分布都在不停变化——它的输入是前面所有层的输出,而那些层的参数每一步都在更新。他们给这现象起名叫内部协变量偏移(internal covariate shift):「分布不一致」这件麻烦事发生在网络内部,每一层都在追着一个不断漂移的目标学。
后果有二。其一,为了不让漂移失控,学习率必须很小、初始化必须挑得仔细,训练又慢又脆。其二,漂移会把激活值推进 sigmoid 的饱和区:分布整体挪到曲线两端的平坦地带后,导数趋零、梯度传不回去,这一层就彻底不学了。当时的通行解法是绕开(改用 ReLU、精心初始化、小学习率),而不是正面消除漂移。
最朴素的做法是每步更新完、再把某层激活值减去均值。作者用一个反例说明这行不通:设某层输出为 x = u + b,若把「减这批的均值」当成训练之外的后处理(梯度不穿过它),梯度下降算出的更新会照常增大 b,而归一化又把 b 的效果整个抵消——输出不变、损失不降,b 却无限膨胀下去。
于是有了本文第一块基石:归一化必须写进模型、成为可反向传播的一层,让梯度知道「均值方差本身也依赖参数」;否则优化器会一直朝着被归一化抹掉的方向使劲。
理想做法是对每层输入做白化(whitening)——变换成均值为零、方差为一、各维不相关的标准形态。但完整白化要算协方差矩阵及其平方根、还要每步遍历整个训练集,代价高得不可能。作者做了两个务实近似:每一维单独标准化(不做维度间去相关,不严格等价于白化,但便宜太多、够用),并用当前小批量的均值方差估计总体统计量(训练本就按批走,顺手就有)。
于是得到 BN 变换。对批内某一维激活值 x:先算这批的均值 μ_B 与方差 σ²_B,标准化成 x̂ = (x − μ_B)/√(σ²_B + ε)(ε 是防除零的小常数),再做一次可学的缩放平移 y = γ·x̂ + β。前半句把这一维拉成「中心零、幅度一」;后半句是关键的后门。
强行把每层输入固定成零均值单位方差是有代价的:把 sigmoid 的输入锁在中间,等于把它限制在近乎线性的那一段,非线性表达能力被削掉了。γ(缩放)与 β(平移)是随网络一起训练的参数,让网络自己决定这一维最终该是什么均值、什么幅度。极端情况下只要令 γ = √σ²_B、β = μ_B,BN 就精确还原成恒等变换——归一化被「提议」而不被「强加」,最坏情况不亏。这与 ResNet 的思路同源:把一个保底解免费送给优化器。
卷积层有个额外约束:同一个卷积核滑过整张图,图上不同位置本就该被同等对待。所以 BN 不给每个位置各配一套参数,而是按特征图(通道)归一化——一个通道在「整批样本 × 所有空间位置」上的全部数值合起来算一份均值方差,共享一对 γ、β。参数量因此只跟通道数有关(几百个),统计量的有效样本数则从 m 涨到 m×H×W(批大小乘特征图高宽),估得更准。
训练时的输出依赖「同批的其他样本是谁」——这在推理时不可接受:给同一张图打分,结果不该因为它和谁凑成一批而变。解法是训练过程中用滑动平均攒下整个数据集的均值与方差(总体统计量),推理时改用这份固定的统计量。此时 BN 退化成一个固定的线性变换(乘一个常数、加一个常数),可以直接折叠进前一层的权重里,推理成本降为零。
论文给的解释里最硬的一条是尺度不变性:把某层权重整体放大 a 倍,BN 的输出完全不变——均值和方差同步放大了 a 倍,在标准化里被约掉,即 BN(Wu) = BN((aW)u)。更妙的是对权重的梯度会同步缩小到 1/a:权重越大、收到的更新越小。这形成一个自动负反馈,参数不会在大学习率下失控膨胀。
还有一条副产品:正则化。一个样本经 BN 后的表示取决于同批还有谁,而每批是随机凑的,同一张图在不同轮次会得到略有抖动的表示;这份噪声起到类似 Dropout 的作用,作者索性把 Dropout 删了。
先是 MNIST 上的玩具实验:三层各 100 个 sigmoid 单元的网络,加 BN 的版本收敛更快、精度更高;作者画出某个激活值在训练中的分位数曲线,无 BN 时分布持续漂移,有 BN 时迅速稳住——这是对「内部协变量偏移」这一诊断的直接证据。主实验则在 ImageNet 上用 Inception 做:
最后,6 个 BN-Inception 模型集成拿到 ImageNet top-5 验证错误率 4.9%(测试集 4.82%),优于 GoogLeNet 集成的 6.67%,也低于当时对人类水平约 5.1% 的估计。为配合 BN,他们还去掉了 Dropout、把 L2 正则减到 1/5、学习率衰减加快 6 倍、移除局部响应归一化(LRN)、并更充分地打乱训练数据。
BN 把「训练很深的网络」从一门手艺变成默认能跑通的常规操作:初始化不必千挑万选,学习率可以放心调大,训练时间按倍数缩短。同年稍晚的 ResNet 每个残差块里都嵌着 BN——「残差连接 + 批归一化」这对组合,是此后十年视觉骨干网络的标准配置。
更深远的是它确立了「归一化层」作为一类基本构件的地位。此后的 Layer Normalization(Ba 等 2016,按单个样本的所有特征归一化、不依赖批,正因如此成了 Transformer 与大语言模型的选择)、Group Normalization(Wu & He 2018,按通道分组,小批量下不掉点)、RMSNorm,全是沿同一思路的变体。今天打开任何现代模型,几乎必定能在每个块里找到某种归一化。
① 一句话:把「按小批量统计量标准化激活值 + 可学的 γ、β 缩放平移」做成可反传的一层,插在每个非线性之前。
② 痛点:前面各层参数一直在变,本层输入分布不断漂移(作者称内部协变量偏移),逼得学习率必须很小、初始化必须讲究,还容易把 sigmoid 推进饱和区。
③ 关键设计一:归一化必须写进模型、让梯度穿过它——否则优化器会朝被归一化抹掉的方向无限使劲(偏置爆炸)。
④ 关键设计二:x̂ = (x − μ_B)/√(σ²_B + ε) 之后必须接 y = γx̂ + β——两个可学参数让网络能还原恒等变换,归一化是提议而非强加。
⑤ 工程细节:卷积层按通道(跨全部样本与像素位置)归一化;推理改用滑动平均的总体统计量,此时 BN 退化成线性变换、可折进权重、零成本。
⑥ 为何敢用大学习率:BN(Wu) = BN((aW)u)——权重放大 a 倍输出不变、梯度缩小为 1/a,形成自动负反馈;另有类似 Dropout 的噪声正则副作用(作者因此删了 Dropout)。
⑦ 结果:Inception 加 BN 后达标步数少 2.3 倍,学习率调大 5 倍则少 14 倍;BN-x30 最终精度 74.8%;集成模型 top-5 错误率 4.9%,低于约 5.1% 的人类估计;sigmoid 版没有 BN 根本训不动。
⑧ 影响与翻案:确立归一化层这一构件,催生 LayerNorm / GroupNorm 一族;但「内部协变量偏移」的解释后被 Santurkar 等推翻,主流解释改为「让损失曲面更平滑」。局限:依赖批大小、训练推理不一致、样本间耦合、不适合序列模型。