大家好,今天和各位分享一下深度学习中常见的标准化方法,先介绍一下最常用的 Batch Normalization,从数学公式的角度复现一下代码。
1. 原理解析
深层网络训练时,前面层训练参数的更新将导致后面层输入数据分布的变化,以网络第二层为例:网络的第二层输入,是由第一层的参数和输入数据计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。
由于模型参数在不断修改且不断的往前传播,所以各层的输入分布在不断变化,即网络每一层的输入数据分布是一直在变化的。研究人员把网络中间层在训练过程中,数据分布的变化称为内部协方差变化(internal covariate shift,ICS),这要求模型训练时必须使用较小的学习率,且需要慎重地选择权重初值。ICS 导致训练速度减慢,同时也导致使用饱和的非线性激活函数(如sigmoid,正负两边都会饱和梯度为 0)时出现梯度消失问题。
针对内部协方差变化这一普遍现象,解决办法是:对每层的输入进行归一化。即批归一化算法(Batch Normalization,BN),BN 算法主要包含以下三个步骤:
(1)计算统计值。在小批次样本上计算归一化所需的统计值,包括均值和方差。假设输入为,其中 m 指当前批次(batch size)的大小,即当前批次共有多少个训练样本。 d 指输入的特征图的大小。
(2)归一化操作。把输入向量中每个元素当成独立随机变量单独进行归一化,向量中各变量独立了,也就没有协方差矩阵了。这种归一化在各变量相关的情况下依然能加速收敛,使用了下面的公式进行处理,也就是近似白化处理