IT 论文精读 · PAPER 29

Batch Normalization(批归一化)

Sergey Ioffe & Christian Szegedy · Google · ICML 2015

EN →

这篇论文干了什么?

2015 年,Google 的两位研究员提出了 Batch Normalization(简称 BN,中文叫「批归一化」)——一个塞进神经网络中间、代码只有几行的小零件。加上它之后,同一个网络训到同样的准确率,训练步数少了十几倍;他们顺手把 ImageNet 图像识别的错误率压到 4.9%,第一次低过「人类大约 5.1%」的估计。此后十年,从 ResNet 到几乎每个卷积网络,中间层后面都跟着一个 BN。

旧世界的痛

神经网络是一队人接力干活:第一层看出线条,第二层拼出零件,第三层认出物体。麻烦在于训练时所有人同时在改自己的做法——前面的人一改口径,后面的人收到的东西整个刻度就变了:昨天还是「零点几」的数,今天变成「几十」。后面的层刚适应好,前面又变了。为了不让这场混乱失控,当年的人只能把步子迈得很小(把学习率调低),还得小心翼翼地挑初始值。训练深网络因此又慢又玄学,像走钢丝。

点子:开工之前,先把刻度调回标准

BN 的想法朴素得近乎粗暴:每一层动手之前,先把它收到的那堆数字统一「调回标准刻度」。不管前面的人怎么折腾,交到下一层手上的永远是同一个量级、同一个范围。

具体怎么调?训练时数据是一小批一小批喂进去的(比如一批 32 张图)。BN 就拿这批同伴当参照:算出这批数字的平均值波动幅度,把每个数减掉平均、除以幅度——整批数字于是被搬到「中心在零、胖瘦差不多」的位置。像一个班按平均分和分差把成绩换算成标准分:题目难易怎么变,标准分的分布总是稳的。

可硬把每层锁死在同一刻度上,会不会削掉网络的表达能力?作者留了个后门:每处额外配两个可学的旋钮,一个管「放多大」、一个管「往哪儿挪」。网络要是觉得原来的刻度更好,把旋钮拧回去就行,最坏情况能把这次归一化整个撤销。先强行拉回标准,再让网络自己决定要不要挪回去——这是全篇最关键的一手。

为什么这一下就快了这么多

三件事同时被解决。一是步子终于能迈大:刻度稳了就不必靠小步慢走防翻车,学习率能往上调十几倍。二是学习信号不再被压扁:当年常用的一类激活函数会把数字压进 0 到 1 之间,数值一大就落进两头的平坦地带,输入再怎么变、输出也几乎不动,纠错信号就此中断——把数字拉回中间地带,正好躲开这个坑。三是顺手防了背题:标准分取决于同批同伴是谁,而每批是随机凑的,同一张图这轮和下轮算出来会有点抖动;这点噪声反而让网络不容易死记训练集。

诚实的一句:BN 的刻度是从「同批同伴」身上算来的——批凑得太小,刻度就不准,效果明显打折。

一句话记住

在每层动手之前,拿同一小批数据算出平均值和波动幅度,把收到的数字统一「换算成标准分」,再配两个可学的旋钮让网络能自行调回去。刻度稳了,学习率就能调大十几倍、信号不再被压扁,训练深网络从走钢丝变成了常规操作。

想看 BN 的公式、卷积层怎么做、推理时用什么统计量、以及后来对它「为什么有效」的翻案? → 切到精读版