楼主前段时间真的是很巧,在面试阿里和大疆的图像算法时。在提及我对网络架构进行修改的时候,都是提到了我在U-Net的网络里添加了Batch Normalization这样的批量归一化方式。面试官都让我解释了什么是BN,并且阿里的面试官问我你知道Instance Normalization吗?大疆的面试官问我,你知道Layer Normalization吗?
我当时真的就愣住了,第一次被问道这样的问题。这两个术语我还反复和面试官确认了一下。今天这里就把它总结出来,并且着重的介绍一下我们的Batch Normalization。
我们必须得从mini-batch介绍起,因为这是下一步理解Batch Normalization中Batch所代表的具体含义的知识基础。
所谓的mini-batch是指从训练数据全集中随机选择一个训练数据子集。假设我们的训练数据集包含10000个样本,每个mini-batch的batch-size为10。那么我们的训练集合可以分为1000个mini-batch。跑完一个mini-batch的实例,叫做完成训练的one step,跑完1000个mini-batch(训练集遍历一遍)叫做one epoch.
在使用单个训练数据的情况,梯度下降的方向仅有这单个例子所决定。而在mini-batch中,batch内所有的训练实例共同决定了本次参数更新的梯度方向。处理方式为这个batch内的梯度方向求均值,再用这个均值代入优化算法中实现参数模型更新。
Mini-Batch内的每个实例需要走一遍当前的网络,产生当前参数下神经网络的预测值,这点请注意,这是理解后续Batch Normalization的基础。
至于Batch Size的影响,目前可以实验证实的是:batch size 设置得较小训练出来的模型相对大batch size训练出的模型泛化能力更强,在测试集上的表现更好,而太大的batch size往往不太Work,而且泛化能力较差。
神经网络训练过程的本质是学习数据分布,如果训练数据和测试数据的分布不同将大大降低网络的泛化能力,因此我们需要在训练开始钱对所有数据进行归一化处理。
联系:BN和mini-batch都需要用到batch这个概念。
区别:mini-batch使用batch的概念,是在损失函数的导数决定梯度方向的时候。
BN使用batch的概念则是在输入数据和中间层的时候,利用batch的概念改变数据的分布。输入数据的值会减小到[0,1]范围内。中间层的BN主要是在全连接层和卷积层之后,激活函数之前。在这个地方都会有一个数值为z,我们需要batch中的所有z来得到均值和方差,从而将Z值进行BN处理。
一句话而言,mini-batch针对的是梯度方向更新,BN针对的是层与层之间数据的输入输出分布。
以下哪个不是Batch Normalization带来的优点?
A.训练收敛速度更快。
B.防止梯度爆炸。
C.梯度曲面更加光滑。
D.减少计算量。
D.错误。
BatchNorm目前基本已经成为各种网络(RNN除外)的标配,主要是因为效果好,比如可以加快模型收敛速度,不再依赖精细的参数初始化过程,可以调大学习率等各种方便,同时引入的随机噪声能够起到对模型参数进行正则化的作用,有利于增强模型泛化能力。
###BN的缺点
局限1:如果Batch Size太小,则BN效果明显下降。
BN是严重依赖Mini-Batch中的训练实例的,如果Batch Size比较小则任务效果有明显的下降。那么多小算是太小呢?图10给出了在ImageNet数据集下做分类任务时,使用ResNet的时候模型性能随着BatchSize变化时的性能变化情况,可以看出当BatchSize小于8的时候开始对分类效果有明显负面影响。之所以会这样,是因为在小的BatchSize意味着数据样本少,因而得不到有效统计量,也就是说噪音太大。这个很好理解,这就类似于我们国家统计局在做年均收入调查的时候,正好把你和马云放到一个Batch里算平均收入,那么当你为下个月房租发愁之际,突然听到你所在组平均年薪1亿美金时,你是什么心情,那小Mini-Batch里其它训练实例就是啥心情。
局限2:对于有些像素级图片生成任务来说,BN效果不佳;
对于图片分类等任务,只要能够找出关键特征,就能正确分类,这算是一种粗粒度的任务,在这种情形下通常BN是有积极效果的。但是对于有些输入输出都是图片的像素级别图片生成任务,比如图片风格转换等应用场景,使用BN会带来负面效果,这很可能是因为在Mini-Batch内多张无关的图片之间计算统计量,弱化了单张图片本身特有的一些细节信息。
局限3:RNN等动态网络使用BN效果不佳,且使用起来不方便
对于RNN来说,尽管其结构看上去是个静态网络,但在实际运行展开时是个动态网络结构,因为输入的Sequence序列是不定长的,这源自同一个Mini-Batch中的训练实例有长有短。对于类似RNN这种动态网络结构,BN使用起来不方便,因为要应用BN,那么RNN的每个时间步需要维护各自的统计量,而Mini-Batch中的训练实例长短不一,这意味着RNN不同时间步的隐层会看到不同数量的输入数据,而这会给BN的正确使用带来问题。假设Mini-Batch中只有个别特别长的例子,那么对较深时间步深度的RNN网络隐层来说,其统计量不方便统计而且其统计有效性也非常值得怀疑。另外,如果在推理阶段遇到长度特别长的例子,也许根本在训练阶段都无法获得深层网络的统计量。综上,在RNN这种动态网络中使用BN很不方便,而且很多改进版本的BN应用在RNN效果也一般。
因为在线推理或预测的时候,是单实例的,不存在Mini-Batch,所以就无法获得BN计算所需的均值和方差,一般解决方法是采用训练时刻记录的各个Mini-Batch的统计量的数学期望,以此来推算全局的均值和方差,在线推理时采用这样推导出的统计量。虽说实际使用并没大问题,但是确实存在训练和推理时刻统计量计算方法不一致的问题。
特别感谢
https://zhuanlan.zhihu.com/p/72589565
https://cloud.tencent.com/developer/article/1463883