BN和Droupout在训练和测试时的差别
1.BN
训练时 (Training)
在训练阶段,BN 层主要做两件事:
1.归一化:计算当前这个Batch的均值和方差,用它们来把数据归一化成标准正态分布。
公式:
2.移动平均法求全局均值和方差:它会用“动量法”(Momentum,通常是 0.1 或 0.01)把当前的均值和方差,更新到全局的历史统计量(Running Mean / Running Variance)中。
公式:
- 目的:为了给测试阶段提供均值和方差
测试时 (Testing)
在测试阶段(或验证阶段),我们可能一次只输入 1 张图(Batch Size = 1)。
如果还用当前 Batch 的方差,1 个数的方差是 0,除以 0 就会崩,或者统计量极度不稳定。
所以,BN层会停止计算当前的统计量,直接拿出训练时的全局的历史统计量Running Mean/Var来做归一化。
公式:
BN训练时为什么不用全量训练集的均值和方差呢?
因为在训练的第一个完整epoch过程中是无法得到输入层之外其他层全量训练集的均值和方差,只能在前向传播过程中获取已训练batch的均值和方差。那在一个完整epoch之后可以使用全量数据集的均值和方差嘛?
对于BN,是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上也能够增加模型的鲁棒性,也会在一定程度上减少过拟合。
但是一批数据和全量数据的均值和方差相差太多,又无法较好地代表训练集的分布,因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,去缩小与全量数据的差别。
Dropout
Dropout 是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。
Dropout 在训练和测试时都需要嘛?
Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。
而在测试时,应该用整个训练好的模型,因此不需要dropout。
Dropout 如何平衡训练和测试时的差异呢?
Dropout ,在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
