批归一化(Batch Normalization)
训练时每层参数不断变化,会导致一些层的输入数据分布不断变化(内部协变量偏移问题)。而这又会导致收敛速度慢和 S 型激活函数容易饱和的问题。
BN 是一个层,一般在激活函数之前。
批归一化在训练时将每个 batch 的特征向量(输入向量)平移缩放,使得均值为 0,方差为 1(显然这样需要 batch size 足够大否则不够准确)。具体来说,给出 batch size(记为 )列的特征矩阵 ,每行是前一层的输入,标准化:
根号内的 防止到零点附近梯度未定义。
如果只这样做然后输出 ,会影响层的学习能力,比如 logistic sigmoid 激活函数,归一化后输入在函数的零点附近,这部分是近似线性的。
BN 方法给出两个可学习的参数: 对应缩放, 对应平移,BN 层的输出为 。
我们先归一化均值和方差,再学习这两个参数,看似多此一举,但之前 的均值取决于前面层的复杂关联,BN 可以平滑这种波动,同时不缩小能表示的函数族。
加上 BN 层后,其实全连接层 的偏置项可以去掉,因为参数 和 作用完全相同。
BN 层的优点还有:
- 减少对部分正则化方法的依赖,比如可以去掉 Dropout,减小 正则化系数。
- 由于稳定了模型的分布,后面的层不需要频繁适应前面层的变化,所以可以选择更大的学习率。