CNN系列学习(五):batchnorm

参考出处:https://blog.csdn.net/qq_25737169/article/details/79048516
在上一篇关于解决梯度消失和梯度爆炸的介绍中提到了其中一种方法就是采用batchnorm,可译为批量规范化,这篇介绍就好好讲讲batchnorm的相关概念。

就跟我们之前谈到,训练深度网络的时候经常发生训练困难的问题,原因是因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了),此现象称之为Internal Covariate Shift(内部协变量转换)。
Internal Covariate Shift和Covariate Shift具有相似性,但并不是一个东西,前者发生在神经网络的内部,所以是Internal,后者发生在输入数据上。Covariate Shift主要描述的是由于训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响,我们经常使用的方法是做归一化或者白化,如下图:
CNN系列学习(五):batchnorm_第1张图片
假设我们的数据分布如a所示,参数初始化一般是0均值,和较小的方差,此时拟合的y=wx+b如b图中的橘色线,经过多次迭代后,达到紫色线,此时具有很好的分类效果,但是如果我们将其归一化到0点附近,显然会加快训练速度,如此我们更进一步的通过变换拉大数据之间的相对差异性,那么就更容易区分了。
Covariate Shift就是描述的输入数据分布不一致的现象,对数据做归一化当然可以加快训练速度,能对数据做去相关性,突出它们之间的分布相对差异就更好了。Batchnorm 做到了,前文已说过,Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度。所以说,并不是在深度学习的所有领域都可以使用BatchNorm,下文会写到其不适用的情况。
假设减小Internal Covariate Shift,对神经网络的每一层做归一化处理,将每一层输出后的数据都归一化到0均值,1方差,满足正态分布,此时会有一个问题,每一层的数据分布都是标准正态分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。
但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了
CNN系列学习(五):batchnorm_第2张图片
接下来详细介绍一下这额外的两个参数,之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的标准差和均值,那么yi不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用, β 和γ分别称之为平移参数和缩放参数。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。
步骤即为,首先计算均值和方差,然后归一化,然后缩放和平移,就行了。但是这是在训练中完成的任务,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,我们是通过代码实现,在训练的时候实现计算好mean var测试的时候直接拿来用就可以了,不用计算均值和方差。

在之前我们的处理都是小心的调整学习率和权重初始化,但是有了BN之后可以放心的使用大学习率,使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度,
Batchnorm本身上也是一种正则的方式,可以代替其他正则方式如dropout等。
另外,个人认为,batchnorm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。

你可能感兴趣的:(深度学习)