本文作者专注于AI进阶算法,正在推出AI疯狂进阶之基础理论进阶篇,如有兴趣可持续关注我。
核心导读:
1.神经网络中的正则化是什么?
2.神经网络的正则化技术有哪些?为何能防止过拟合?
3.DropOut和BatchNorm混和使用存在什么问题?
4.BatchNorm出现后,L2 Regularization消失了?
1.神经网络中的正则化是什么?
神经网络参数量经常多达几万甚至数十万,在训练数据较少的时候,常常会导致网络过拟合。正则化方法即为向原始模型引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。如下图,数据的实际分布是绿色这条线,但训练数据(蓝色圆圈点)只采样了10组(稍微偏离真实分布是正常的,例如噪声数据/错误标注的数据影响等),通过网络训练,拟合出的红色这条“想象力”过于丰富上下横跳的曲线,虽然它完美的拟合了所有训练数据,但确并不是真实的分布,这种情况就是过拟合。过拟合的模型通常是在训练集表现很好,而测试集表现较差。如果想要模型有更强的泛化能力,那么就需要给网络增加正则化。
2.神经网络的正则化技术有哪些?
神经网络的正则化技术有很多种,包括数据增强,L1&L2 ,dropout,BatchNorm,earlystopping等方法,这些方法为何能防止过拟合?下面结合理论和个人的一些工程经验来详细说明:
(1)数据增强
数据增强是提升模型模型泛化能力最好最直接的方法。假如说训练集已经包含了所有需要测试的数据,那么你只需要想方设法在训练数据上过拟合就行,我们在很多封闭环境的项目中就是这么干的,基本不需要模型泛化到其他开放场景,封闭环境意味着数据的变化范围非常小,因此也很容易获取到覆盖几乎所有情况下(光照/角度/大小等)的数据。但在开放环境的项目中,获取训练数据的成本会很高而且很难覆盖齐全,这时候就需要我们自己来“创造”数据。那么,如何扩增数据?我会在后面的专题中详细介绍。
(2)L1 Regularization
L1 Regularization表示在模型的损失函数中增加参数绝对值之和,如下图所示:
对损失函数求导得到:
按照梯度下降法则,由于sgn(w)的影响,当w为正时,更新后的w变小;当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,相当于剔除了部分较小的特征(可能是噪声引起的),防止过拟合。
(3)L2 Regularization
L2 Regularization表示在模型的损失函数中增加参数的平方的和的开方值,如下图所示:
对损失函数求导得到:
按照梯度下降法则:
在不使用L2 Regularization时,求导结果中w前系数为1,现在w前面系数为 1-ηλ/n ,因为η、λ、n都是正的,所以 1-ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。那么,L2 Regularization为什么能防止过拟合?简单来说,L2 Regularization会使整个网络的参数的数值很小,那么,如果输入数据差异性较大的时候,数值更小的网络能让输出的数据差异性变小,数值更大的网络则会让逐层误差放大导致结果差异性很大,所以L2 Regularization能提高网络的泛化性能。
(4)dropout
dropout是指在神经网络的训练过程中,对于神经元按照一定的概率将其暂时从网络中丢弃(数值置0),而在预测的过程中会保留所有的神经元进行计算。由于神经元代表某一类抽象的特征,dropout相当于特征掩膜,对应到原图上其实就是拿一块黑布遮挡在物体某些关键位置上面。那么,这种掩膜的好处是什么?如果我遮挡了一些特征或者说物体的某一部分,要想网络还能识别对,就需要网络让那些未掩膜的神经元学习到更强的表达能力。dropout通过训练过程中随机drop就可以达到对特征的强化,减少噪声或者脏样本带来的影响,从而提高泛化能力。近些年在dropout上也有一些改进版本,如AAAI 2019上的《Weighted Channel Dropout for Regularization of Deep Convolutional Neural Network 》论文发现对于每张输入图像,更高层中仅有少量通道被激活,同时其它通道中的神经元响应接近于零,因此该作者提出了一种根据激活的相对幅度来选择通道的方法,简单来说,原始的dropout是特征图[H W C]上所有点的随机drop,而WCD是按照SE Net的思路先计算出[C]的重要度,再在这个基础上进行[C]的随机drop,[C]中重要度高的会以更大的概率被保留,以此来进一步强化这些重要的特征。
(5)BatchNorm
BatchNorm的提出主要是为了Internal Covariate Shift问题,ICS现象具体来说:深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致后面层输入数据分布发生变化,网络前面几层发生微小的改变,那么通过层层叠加放大差异性,深层的输入分布变化会非常剧烈,这就使得深层需要不断去重新适应输入层的数据变化, 在使用BN前,减小学习率、小心的权重初始化的最主要目的使其输出的数据分布不要发生太大的变化。简单来说,BatchNorm主要是为了解决不同训练数据通过深层网络后分布差异性过大问题,它可以控制数值区间,让比较深的网络训练起来稳定性比较好,更不容易产生梯度爆炸,从某种程度上来说也是一种正则化。下图左图是没有经过任何处理的输入数据,曲线是sigmoid函数,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。经过BatchNorm后数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU)。BatchNorm是非常重要的一个环节,下面就BatchNorm相关的细节做了一一总结:
A.BatchNorm怎么做?
计算流程如下图,需要注意的是,BatchNorm计算的维度是Channel维度,也就是说对于[B H W C]=[128, 32, 32, 64]这样的Feature Map来说,BatchNorm得到的均值和方差的维度是[C]=[64],同时γ和β也是同样的维度。从下面tensorflow中BatchNorm的实现代码也能看出来。
B.为什么要学习γ和β?
减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?显然是不能的,因为数据的分布是千变万化的,这里增加γ和β的学习只是为了缓解理想分布和真实分布的差距。
C.预测时均值和方差怎么求?
在训练时,我们会对同一批的数据的均值和方差进行求解,进而进行归一化操作。但是对于预测时我们的均值和方差怎么求呢?比如我们预测单个样本时,那还怎么求均值和方法呀!其实是这种样子的,对于预测阶段时所使用的均值和方差,其实也是来源于训练集。比如我们在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的的均值和方差。在tensorflow中,在训练过程中是通过滑动平均(tf.train.ExponentialMovingAverage)跟新均值和方差,在预测的时候直接取影子变量即可,具体代码如下:
D.BatchNorm合并到卷积层中
BatchNorm 在训练时起到了积极作用,但是在网络前向推断时增加了运算,目前像ResNet,MobileNet,Xception,ShuffleNet 等都使用了BatchNorm 。由于BatchNorm是线性运算,并且参数在训练完毕后都可以确定下来, 因此,我们可以将 训练好的模型的BatchNorm层的参数合并到卷积层,来提升模型前向推断的速度。在显卡 GTX 1080Ti,i7 CPU配置的机器上,将Resnet50 模型的BatchNorm合并到卷积层中,CPU前向提高了10%,GPU前向提高了50%。具体合并过程如下图:
E.BatchNorm存在哪些问题?
a.如果 Batch Size 太小,则 BN 效果明显下降
b.对于有些像素级图片生成任务来说,BN 效果不佳
c.RNN 等动态网络使用 BN 效果不佳,且使用起来不方便
3.DropOut和BatchNorm混和使用存在什么问题?
BatchNorm和DropOut单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。《Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift》指出冲突的关键是网络状态切换过程中存在神经方差的(neural variance)不一致行为,因为DropOut在训练过程中会对神经元产生随机掩膜,而预测的时候不会,所以训练过程中统计的均值和方差可能与预测的相差比较大。论文采用了两种策略来探索如何打破这种局限,一个是在所有BatchNorm层后使用 Dropout,另一个就是修改 Dropout 的公式让它对方差并不那么敏感,就是高斯Dropout。
4.BatchNorm出现后,L2 Regularization消失了?
BatchNorm出现之后,基本很少场景中看到L2 Regularization的使用了,通俗的理解是BatchNorm的出现就是为了解决层与层之间数据分布差异大的问题,使用BatchNorm理论上是允许每层的数据差异性可在一定的范围内,而L2 Regularization是让数据变小防止输入差异大导致层层传递误差累积过大,所以BatchNorm更像是从本质上解决了问题,而L2 Regularization更像是一个技巧而已。《L2 Regularization versus Batch and Weight Normalization》论文中也证明了BatchNorm对参数放缩不敏感,如下图公式推导,而L2正则的作用就是整体地缩小参数大小,但经过BatchNorm后,这种放缩的效果全都消失,也就是说有了BatchNorm之后,L2正则的效果对于网络的输出是没有任何效果的。那么,L2 Regularization加BatchNorm到底影响了啥?实际上,L2对所有参数进行放缩,其对应的梯度也会放缩,因此L2之于BatchNorm仅仅只起到了一个learning rate动态调节的作用,这个作用到底是好还是坏就得看具体的任务了。
5.小结
本文对神经网络中几种常见的正则化技术进行了总结,对正则化技术混用带来的一些问题进行了理论分析。在实际工程项目中,数据增强永远是最直接最好的手段,BatchNorm基本在目前主流的网络中都有,DropOut通常只在网络的最后一层象征性的加一下试试,而L1/L2基本已经很少用了,除了在一些需要模型压缩的场景中。