深度学习

批归一化(batch normalization)

/ batch nor-muh-luh-ZAY-shun /

批归一化,是深度网络内部的一道「整理」工序,专门防止层与层之间流动的数值漂移到失控的尺度上。数据一层层穿过时,数值可能毫无规律地暴涨或缩水,让训练既慢又抽搐——有点像在一个音量忽而细语、忽而咆哮的房间里硬要好好谈话。批归一化把这个音量稳住,让每一层接到的输入都落在一个正常、稳定的范围里。

具体地说,训练是分成一小组一小组的样本来进行的,这一小组叫作「批」(一次几个到几百个)。对每一个批,批归一化都查看抵达某一层的数值,减去它们的平均值、再除以它们的离散程度,于是这些数出来时都以零为中心、带着一个整齐的尺度。接着它再乘上两个学出来的数——一个缩放、一个平移——这样网络如果愿意,可以在更有利的地方把归一化「撤销」掉。这种实时的重新缩放,让你能训练得更快、用更大的学习率,也不必那么操心权重当初究竟是怎么初始化的。

也有该老实说的麻烦。由于归一化用的是整个批的统计量,批一旦很小,它就表现得古怪;而且在推断时它还需要另一套记账(这时你也许一次只喂一个样本,用的是训练时积累的滑动平均)。它和序列模型也配合得别扭——在那里,「批」并不是天然适合用来归一化的对象——这恰恰是「层归一化」作为替代方案被发明出来的原因。即便如此,批归一化仍是一个转折点:自 2015 年问世以来,深度网络忽然变得明显更好训练、也更快了。

如果某个批里抵达某层的数是 [12, 18, 6, 24],批归一化会把它们重新居中、重新缩放成类似 [−1.0, 0.3, −1.8, 1.5] 的样子——大致以零为中心、离散整齐——再往下传。之后,两个学出来的旋钮如果有用,还能把结果拉伸或平移。

把每个批重新居中、重新缩放,好让下一层接到的数落在正常范围里。

批归一化在训练时(用当前批的统计量)和推断时(用训练中保存的滑动平均)行为不同。忘了切换这个开关是个臭名昭著的 bug——它会让一个训练时看着很棒的模型,在上线后表现糟糕。

又称
batch normBN批归一化批次正規化批标准化