统计机器学习中一个经典假设:训练数据和测试数据满足相同的分布。保障通过训练数据获得的模型能够在测试集上获得很好地泛化效果。
当训练集和目标样本集分布不一致时,训练得到的模型无法很好地泛化,即条件概率一致,但是其边缘概率不同。这种现象就是内部协变量转移(Covariate Shift)。对于神经网络的各层输出,在经过了层内操作后,各层输出分布就会与对应的输入信号呈现不同的分布,而且随着网络深度增大,差异会越来越大,但每一层所指向的label值是保持不变的。
如何解决这种问题呢?
通过引入Batch Normalization来标准化某些层或所有层的输入,从而固定每层输入数据的均值和方差。
批标准化(Bactch Normalization,BN)是为了克服神经网络加深导致难以训练而诞生的,随着神经网络深度加深,训练起来就会越来越困难,收敛速度回很慢,常常会导致梯度弥散问题(Vanishing Gradient Problem)。
通过引入Batch Normalization来标准化某些层或所有层的输入,从而固定每层输入数据的均值和方差。
Batch Normalization 层一般用在激活函数之前。 让每一层的输入的分布变得稳定,从而有利于神经网络的训练。通过标准化让激活函数分布在线性区间,加大梯度,让模型更大胆的进行梯度下降。主要优点:
a、加大搜索步长,加快收敛速度;
b、更容易跳出局部最小值;
c、一定程度上缓解过拟合问题。
因此,遇到收敛速度很慢、梯度爆炸等无法训练的情况,都可以尝试使用Batch Normalization。
实际使用过程中,请注意以下内容:1 在训练阶段
训练的时候需要注意两点,(1)输入参数update_ops到最后的train_op中)。这样才能计算μ和σ的滑动平均(测试时会用到)
update_op =tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_op): train_op= optimizer.minimize(loss)
2 在测试阶段
测试时需要注意一点,输入参数
领取专属 10元无门槛券
私享最新 技术干货