Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
机器学习领域有个很重要的假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。而实际情况往往是测试集和训练集分布不相同,即训练数据的领域模型 Ps(X) 和测试数据的 Pt(X) 分布不一致,这种情况称为covariate shift。在深度学习的众多隐层中,每一层的输入都会面临covariate shift问题,即隐层输入分布总是变化,这种现象称为internal covariate shift。而BatchNorm就是为了解决internal covariate shift。
提出这种思想的基础是,之前的研究表明,将输入图像进行白化处理,即对输入数据分布变换到均值为0,方差为1的正态分布——那么神经网络会较快收敛。BN 就是受此启发,对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
之前就说过,为了减小Internal CovariateShift,对神经网络的每一层做归一化不就可以了,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。
但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了,接下来结合下图的伪代码做详细的分析:
之所以称之为batchnorm是因为所norm的数据是一个batch的,假设输入数据是
共m个数据,输是
, batchnorm的步骤如下:
1.先求出此次批量数据x均值
2.求出此次batch的方差
3.接下来就是对x做归一化,得到
4.最重要的一步,引入缩放和平移变量γ 和和 ,计算归一化后的值
接下来详细介绍一下这额外的两个参数,之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的标准差和均值,那么yi不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,β和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。
首先计算均值和方差,然后归一化,然后缩放和平移,完事!但是这是在训练中完成的任务,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,就有了代码中下面两行,在训练的时候用滑动平均值作为mean var,测试的时候直接拿来用就可以了,不用计算均值和方差。
Batchnorm的优点
没有它之前,需要小心的调整学习率和权重初始化,但是有了BN可以放心的使用大学习率,但是使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度,
BN解决了在使用ReLU激活时的零梯度问题。
Batchnorm本身上也是一种正则的方式,可以代替其他正则方式如dropout等
另外,个人认为,batchnorm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。
注:或许大家都知道了,韩国团队在2017NTIRE图像超分辨率中取得了top1的成绩,主要原因竟是去掉了网络中的batchnorm层,由此可见,BN并不是适用于所有任务的,在image-to-image这样的任务中,尤其是超分辨率上,图像的绝对差异显得尤为重要,所以batchnorm的scale并不适合。
参考文献:
李理:卷积神经网络之Batch Normalization的原理及实现 https://blog.csdn.net/qunnie_yi/article/details/80128445
Batch Normalization导读 https://blog.csdn.net/malefactor/article/details/51476961