tf.layers.batch_normalization()方法

背景

之前在面试的时候,有很多次被问到Batch Normalization,它的作用,什么时候用,模型测试的时候还要不要进行Batch Normalization,下面简单的介绍一下

BN

BN操作就是批标准化,训练的时候对每一个batch标准化,具体的公式为:
tf.layers.batch_normalization()方法
即计算出当前batch的每个channel的均值mean和方差variance,令输入x减去均值u再除以标准差v,最后乘以scale参数gamma,加上shift参数beta,得到变换后的输出y。

作用

标准化使数据都服从正态分布,加快模型的训练速度,平稳收敛,缓解DNN训练中的梯度消失问题

BN层在train与inference时的差别

在训练时,我们可以计算出batch的均值和方差,迭代训练过程中,均值和方差一直在发生变化。但是在推理时,均值和方差是固定的,它们在训练过程中就被确定下来。《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中给出的确定方式和TensorFlow中存在不同,这里我们介绍TensorFlow中的方式,即采用滑动平均MovingAverage的方法,公式为: moving_average_value * momentum + value * (1 - momentum),其中value为当前batch的平均值或方差,moving_average_value为滑动均值或滑动方差。
最终,模型训练完毕后,在推理时使用滑动平均值moving_mean和滑动方差moving_variance对feature maps进行变换。

在模型中的哪些位置插入BN层

推荐在Conv层或FC层之后,或者非线性变换**层之前插入BN层。原因见论文:
tf.layers.batch_normalization()方法
翻译一下就是先进行batch normalization,再进行非线性的**操作,比如sigmoid或relu。

参考资料:
https://www.cnblogs.com/fclbky/p/12636842.html
(原文更全面一些)