OverView
- 神经网络就是一个函数,是一个从
X
到Y
的映射函数,在一个学习到了X
分布的函数后,如果对输入的X
进行稍微的改动,那么显而易见必须要重新训练网络以适应新输入的分布才能有一个很好的效果,这个输入的不一致性就叫做covariance shift
。如果将每一层都看成一个函数,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难,学习的速度变慢。上述这一现象叫做Internal Covariate Shift
,一个较规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift
,而BatchNormalizaiont
就是用来reduce internal covariance shift
的。
为什么要做BN
- 使用
BN
的好处是可以使用更高的学习率,同时还有抗Overfitting
的作用,因为于dropout
类似,他在隐层加入了noise
(使用可训练的参数对原始分布进行估计),因此如果使用了BN
的话可以使用更少的Dropout
率。 -
BN
是通过对上一个激活层的输出减去batch
的均值以及除以一个batch
的方差。但是这样的放缩平移有一个问题就是底层的部分原来是学习到东西的,现在做了normalization
以后相当于把学习到的东西又丢失了,因此BN
还有一个终极大杀招就是做一个denormalization
,可以,这样就有点像gamble max tricks
一样将随机的部分放到了外边,BN
做的就是把每一层学习到的分布特征使用两个可学习的变量存储然后“恢复”原来的分布特征,即scale
后的输出再乘以gamma
(标准差)加上beta
(均值),因此数据特定的分布是通过可学习变量来保存的。
- 因此如果是在一个已经预训练好的模型比如
VGG
中加入BN
的话应该计算好合适的beta
和gamma
,让加了BN
以后的数据的输出和原始的数据的输出是一样的。
测试阶段的BN
- 在使用
BN
训练好模型后,保留了每组的mini-batch
训练数据在每层中的均值和方差,然后算出整个训练数据的方差和均值来对test数据进行归一化。
- 得到每个特征的均值和方差的无偏估计以后对
test
数据采用同样的normalization
方法,另外,除了采用整体样本的无偏估计外。吴恩达在Coursera
上的Deep Learning
课程指出可以对train
阶段每个batch
计算的mean/variance
采用指数加权平均来得到test
阶段mean/variance
的估计。
关于为什们要使用参数进行denormalization的一点理解
- 首先如果直接放缩到
0,1
那么就会损失底层layer
学习到的关于分布的特征信息,而如果直接使用原始的分布那么每一个batch
的数据分布变化会太大,导致学习不好。而加入了可学习的参数以后相当denormalization
对两者做了一个平衡,而且可学习参数是每个batch
都是一样的相当于全局的平均,因此可以有一个比较好的效果。
网友评论