前言
BatchNorm作为深度学习训练的一个大杀器,重要性还是不言而喻的。最近学习了一下BatchNorm的论文,简单记录一下以便复习。论文中的好多公式推导都没看明白,只能结合吴恩达深度学习的讲解,写一些感性上的认识吧。下面这篇博客讲的很好,我就在它的基础上补充一下好了。
深入理解Batch Normalization批标准化
BatchNorm论文下载传送门
BatchNorm论文阅读笔记
Abstract
在训练的时候,由于前面层的权重更新,后面每一层的输入的分布会发生变化,这导致训练深度神经网络非常困难。需要设置较小的学习率和一定的权重初始化方法来应对这个问题。我们将这种现象称为internal covariate shift。我们提出了一种归一化方法,将这种方法整合到网络结构中,并在训练时每个mini-batch上进行归一化,来解决这个问题。BatchNorm可以使我们在训练时使用更大的学习率,并且网络初始化方法不需要像以前那样很careful,并具有一定的正则化效应。
为什么用BatchNorm
前面网络的参数发生微小的变化,都会随着网络深度的增加而不断放大,导致对后面层的训练产生很大影响。
网络的中间层的输入发生变化,导致这些发生变化的层在训练的时候需要不断地适应新的数据分布。
具体做法
在训练时,对需要进行BatchNorm的层做如下操作:
反向传播计算偏导数:
在测试时,由于不再有mini-batch的概念,无法计算均值和方差,因此用训练时所有mini-batch的均值和方差求期望,将其作为测试时的均值和方差。训练(train)过程和测试(inference)过程合并,算法总流程如下:
一些细节
BatchNorm在非线性激活函数之前进行。
由于归一化时特征会减去均值,因此可去掉偏置单元b。
CNN中的BatchNorm
feature map中同一通道的神经元归一化方式相同。
Mini-batch有m张图像,feature map某一通道size是p*q。有效的mini-batch尺寸m’ = m * p * q(应该就是Alg. 2中的m换成m’)。
CNN的BatchNorm应该就是同一通道的所有神经元看成是同一个特征进行归一化,这也体现了权值共享的概念。
直观理解
对输入进行白化处理(归一成0均值1方差)可以加速模型收敛(减小特征取值之间的差距,等高线由椭圆变成圆形)。
输入数据可以发生变化,但是输入数据的均值和方差受限,变化不会很大,网络每个batch看到的数据变化不会很大,因此能够更好地学习。
优点
传统神经网络,高学习率导致梯度消失/爆炸,以及容易陷入局部最优。BatchNorm可以帮助解决这些问题。
大学习率会导致网络参数变得很大,BatchNorm会使得网络对参数的尺度变得更有弹性,能够适应不同尺度的参数。
对初始化的方式不再那么敏感。
相关实验
作者采用3层全连接的网络结构,使用sigmoid激活,在MNIST数据集上进行了测试,初步验证了BN的性能。结果如下图所示:
(a)图可以看出,在MNIST数据集上,使用BN的网络能更快收敛且达到更高的准确率。
(b,c)图显示的是,每个网络(有BN和没有BN)的最后一层隐藏层,数据的分布是如何变化的(纵坐标到底是什么,是这一层的输出还是什么别的东西?论文里也没有说清楚)。没有BN的网络数据的均值和方差分布一直在发生变化,使得后续层的训练变得困难;使用了BN的网络数据分布变化更加稳定。
之后,文章在ImageNet分类数据集上进行了测试,比较了5个不同的网络的性能,结果如下:
网络结构用的都是Inception,不同的是有没有BN、学习率大小、以及激活函数的类型。图例中,Inception(没有BN)和BN-Baseline(在Inception的结构中加入了BN)的学习率都是0.0015;BN-x5使用5倍学习率,以及一些作者设计的调整(文中有详细描述,这里就不说了);BN-x30使用30倍学习率,以及作者提出的调整;BN-x5-Sigmoid使用5倍学习率和sigmoid激活。
从结果上可以看出,BN可以大大加速网络的训练,使用很少的迭代次数就可以达到很高的准确率,并且使得sigmoid激活的网络也能够收敛(没有BN的话sigmoid网络准确率不会超过1/1000)。此外,一个有趣的现象是,使用大的学习率可以提升网络能够达到的最大准确率(文章也没有解释为什么有这种现象)。