Batch Normalization(批标准化,BN)
1.什么是标准化?
标准化:使数据符合 0 均值,1 为标准差的分布。
神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况,标准化能够使数据符合0均值,1为标准差的分布,把偏移的特征数据重新拉回到0附近
BN操作使得原本偏移的特征数据,如5-11的第一个图,重新拉回到0均值,使进入激活函数的数据分布在激活函数线性区,使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力。
但是,这种简单的特征数据标准化,使特征数据完全满足标准正态分布,图5-12黄色的线,集中在激活函数中心的线性区域,使激活函数丧失了非线性特性,因此在BN操作中为每个卷积核引入了两个可训练的参数,缩放因子γ和偏移因子β,会与其他待训练参数一同被训练化,使标准正态分布后的特征数据通过缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量。保证了网络的非线性表达力(如果不加入这两个参数,相当于这一层所学习的特征分布被搞坏了)。
2.BN层的位置(也属于网络的一层,即相当于加了个预处理层)
BN 操作通常位于卷积层之后,激活层之前,在 Tensorflow 框架中,通常使用 Keras 中的 tf.keras.layers.BatchNormalization 函数来构建 BN 层。在调用此函数时,需要注意的一个参数是 training,此参数只在调用时指定,在模型进行前向推理时产生作用,当 training = True 时, BN 操作采用当前 batch 的均值和标准差;当training = False 时, BN 操作采用滑动平均(running)的均值和标准差。
在 Tensorflow 中,通常会指定 training = False,可以更好地反映模型在测试集上的真实效果。
3.滑动平均
滑动平均(running) 的解释:滑动平均,即通过一个个 batch 历史的叠加,最终趋向数据集整体分布的过程,在测试集上进行推理时,滑动平均的参数也就是最终保存的参数。
此外, Tensorflow 中的 BN 函数其实还有很多参数,其中比较常用的是 momentum,即动量参数, 与 sgd 优化器中的动量参数含义类似但略有区别, 具体作用为滑动平均 running =momentum * running + (1 – momentum) * batch, 一般设置一个比较大的值, 在 Tensorflow 框架中默认为 0.99。
4.tensorflow中BN的使用
1.1 tf.nn.moments
(1)计算2x3向量的mean和variance
(2)计算卷积神经网络某层的mean和variance
假定我们需要计算的数据形状是[batchsize, height, width, kernels]
输出:
(3)tf.nn.batch_normalizatin
注意:
tf.control_dependencies(control_inputs)