深层的神经网络有一个特点,就是它的数据端(浅层)到损失端(深层)的“距离”是很远的,
利用反向传播(深层→浅层)进行训练的时候,浅层往往训练的比较慢,
一旦浅层发生变化,所有的层都要跟着变,所以深度较大的层要重新学习多次,导致收敛变慢。
批量规范化(Batch Normalization,简称BN)可以稳定数据的分布,使得深层对于浅层的变化不那么敏感。
对全连接层,BN作用在特征维。
具体来说,就是对于全连接层的输入输出的一个批量
B
\mathcal{B}
B,我们可以看成一个矩阵,每行是一条数据样本,每一列是一个特征向量,BN会对每一列的特征向量进行规范化操作。
对卷积层,BN作用在通道维。思想和将1X1卷积层看作全连接层类似。
通道维可以看作是特征维,BN会对每一个通道的输出进行规范化操作。
举个例子,假设我们的小批量包含
m
m
m个样本,并且对于每个通道,卷积的输出具有高度
p
p
p和宽度
q
q
q。 那么对于卷积层,我们在每个输出通道的
m
⋅
p
⋅
q
m \cdot p \cdot q
m⋅p⋅q个元素上同时执行每个批量规范化。
因此,在计算平均值和方差时,我们会收集所有空间位置的值,然后在相同通道内应用相同的均值和方差,以便在每个空间位置对值进行规范化。
源论文是想用BN来减少内部的协变量偏移,但这个只是直觉性的
后续论文指出它可能通过在每个Batch加入噪音(也就是均值和方差)控制模型复杂度
当然这些都不是定论(有够玄学的-_-)