
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值去缩小与全量数据的差别。DropoutDropout 是在训练过程中以一定的概率的使神经元失活即输出为0以提高模型的泛化能力减少过拟合。Dropout 在训练和测试时都需要嘛Dropout 在训练时采用是为了减少神经元对部分上层神经元的依赖类似将多个不同网络结构的模型集成起来减少过拟合的风险。而在测试时应该用整个训练好的模型因此不需要dropout。Dropout 如何平衡训练和测试时的差异呢Dropout 在训练时以一定的概率使神经元失活实际上就是让对应神经元的输出为0假设失活概率为 p 就是这一层中的每个神经元都有p的概率失活如下图的三层网络结构中如果失活概率为0.5则平均每一次训练有3个神经元失活所以输出层每个神经元只有3个输入而实际测试时是不会有dropout的输出层每个神经元都有6个输入这样在训练和测试时输出层每个神经元的输入和的期望会有量级上的差异。因此在训练时还要对第二层的输出数据除以1-p之后再传给输出层神经元作为神经元失活的补偿以使得在训练时和测试时每一层输入有大致相同的期望。