深度学习之所以难以训练,一个重要的原因在神经网络中层与层之间存在着极强的关联性,并且目前绝大部分使用的都是基于梯度下降的方法进行反向传播训练。
当网络的底层发生微弱变化时,这些变化会随着层数的增加被放大,意味着对于高层网络要不断进行参数更新以适应底层参数的变化,如此导致了训练的困难,很容易会出现梯度爆炸或者梯度消失的情况,导致模型训练失败。
本文主要分析深度学习中的各种标准化方法(「BN,LN,IN,GN,WN」)的原理,来帮助实现对深度学习网络的训练。
深度学习中的Normalization,因为神经网络里主要有两类实体:神经元或者连接神经元的边,所以按照规范化操作涉及对象的不同可以分为两大类。
一般机器学习里看到的损失函数里面加入的对参数的的L1/L2等正则项,本质上也属于这第二类规范化操作。L1正则的规范化目标是造成参数的稀疏化,就是争取达到「让大量参数值取得0值的效果」,而L2正则的规范化目标是有效减小原始参数值的大小。有了这些规范目标,通过具体的规范化手段来改变参数值,以达到避免模型过拟合的目的。
Droupout的提出是为了解决模型的过拟合问题,为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。droupout作用于每份小批量训练数据,随机丢弃部分神经元的机制相当于每次迭代的过程,都在训练不同结构的神经网络。
「droupout可以看做是一种深度网络的集成方法,是一种轻量化的Bagging;也可以看成是一种数据增强的方法,可以认为通过网络层面上实现数据的增强。」
在Droupout的实现中,要求某个神经元以某一给定的概率丢弃,在当前batch训练中暂停该神经元。那么对于N个神经元节点的网络,在droupout作用下,可以看做是
个模型的集成,这
个模型的可以认为原始模型的子网络,他们共享部分权重,并且具有相同的网络层数,并且模型整体的参数数目不变,这样就极大的简化了要实现bagging所需的运算或者时所需的训练数据量。
「对于任意一个神经元,在每个batch的训练过程中,都与一组随机的神经元集合进行共同运算,这个过程就减少了全体神经元之间的联合适应性,减少过拟合的风险」
没有droupout的网络的神经网络的计算方程为
如果加入了droupout,那么计算方程就变成了
这里的伯努利函数表示是的是按照给定的概率p,将激活值y变为0。如果给定droupout-rate=p,那么经过droupout之后该层的神经元激活值与没有droupout的时候的比值为
,并且我们知道在预测阶段是不使用droupout的,因此一般情况下,在包含droupout操作的网络中,在该层之后要对权重乘以稀疏
,这样在预测的时候就可以直接使用权重了。
按照BN论文所述,BN主要针对深度学习模型中的存在的ICS问题进行的设计。
在深度学习网络的训练过程中,由于网络中参数的变化而引起内部节点数据分布发生变化的过程称为内部协变量转移(InternalCovariateShift-ICS)。
正如开篇所述,在神经网络中,对于各个层之间的输出,由于在层内经过权重点乘和非线性激活的操作,每个层之间的输入信号的分布显然会发生变化,并且这种变化随着模型深度的增加会不断增大。
针对ICS带来的问题和形成的原因(网络深度增加,层与层之间的数据分布发生改变,并且改变不断累积),一般有两种解决方法
在机器学习中一般使用的PCA或者ZCA白化方法,对输入的数据分布进行变换。主要实现以下的数据转换
但是直接对数据进行白化处理会存在两个问题
针对白化存在的问题,提出了BN,一方面是简化计算过程,降低计算开销;另一方面是「经过批规范化使输出的数据尽量保留原始的数据特征」,可以认为BN也是一种白化操作方法,相比白化更简单,并且「设置了学习参数,使得BN可以一定程度保留原始的数据特征」。
Batch的含义是,BN操作针对一个MiniBatch的数据样本,Normalization是指数据标准化。
BN中对每个MiniBatch中的样本的每个特征进行单独的标准化处理,「处理之后每个特征变成均值为0,标准化为
的分布」;并且在白化的基础上在增加一个线性变换,使输出的数据能够尽量恢复原本输入数据的表达能力。
在训练过程中,使用MiniBatch进行网络训练
如图1所示为MLP神经网络中的某一层,当前层的节点数量为4,也就是当前层的输入的数据特征数量为4,也就是4行;在当前MiniBatch中包含m个样本,也就是m列。对于BN来说,针对的是一个MiniBatch上的每个特征上单独进行的标准化处理,处理方式就是针对每个特征,计算当前MiniBatch中的该特征的均值和方差,然后对原始数据进行缩放和平移标准化处理。
对于MLP中的计算过程如下
,样本数量为
计算当前MiniBatch中所有样本的每个特征的均值和方差,也就是在特征的维度上计算均值和方差,统计的范围是当前MiniBatch中的样本
其中参数
是一个很小的常数,是为了防止原数据的方差为
。经过该处理,意味着对「原始数据进行规范化处理,使得当前层的输入的每个特征的分布的均值为
,方差为
」。即满足关系式
和
。这样会使得数据分布变得统一并且稳定,但是这同样导致了数据表达能力的缺失,「为了使得规范化的数据尽量保留原始数据的信息,在BN中引入两个可学习参数,对标准化的数据进行线性变换」
经过上述操作,如果可学习参数满足关系
,这相当于对数据进行了反向变换
,保留了原始输入的数据信息。\widehat{x}_{i}\mu_{\mathcal{B}}和方差
如上就是训练阶段BN层前向传播的计算过程。
在BN层,学习参数为
根据上述的前向过程,使用目标函数对BN层参数进行更新。
通过链式求导进行参数更新。
正如上面训练过程部分的计算,训练的时候按照每个Batch进行数据训练和参数更新,但是在测试的时候,每次只输入一个数据而不像训练时候使用的是一个Batch的数据,并且测试阶段使用的是测试阶段固定的参数,不涉及参数更新,因此BN的计算和训练阶段有所不同。
在训练阶段针对每个BN层固定并保留了每个MiniBatch数据特征的均值和方差
,并计算均值和方差的无偏估计
根据这个无偏估计对测试数据在BN阶段进行标准化
是网络模型训练阶段学习到的参数。
上述为BN在MLP的计算过程
如图所示为卷积计算过程,只考虑单个样本,输入数据为
,使用两个
的卷积核,步长为2进行计算,得到的输出维度为
。
「和MLP方式不同,对于卷积中BN的应用特别说明。」
在CNN中,以二维卷积为例,输入的数据维度为
,表示数据样本数量为
,特征图的高度为
,宽度为
,上一层卷积核的数量为
。那么对于BN在
的维度上进行特征的标准化处理,
可以看做卷积对上一层进行了
次卷积计算,得到了
个特征,在这个
个特征中,每个特征对应的样本数量为
,并且每个样本的位置为
,这意味着对于每个特征,该特征包含的数据的数量为
在训练时,以MiniBatch为最小单位进行迭代
在训练阶段,在图中所示的行
中
对应输入变量的特征,也就是
,对每一个特征进行BN计算,由此需要循环计算BN,在每次循环中,按照图中所示方法进行MiniBatch计算,计算方法和MLP的方式相同,也就是说在MLP的基础上,CNN会在卷积核数量上进行BN的循环计算。
在上图中同样描述了在Inference阶段BN的计算,在C维度上,进行BN的Inference计算。
,对其进行缩放为
,输入数据为
,那么原来的值为
,对于缩放之后的值,假设均值为
,则存在关系式
对数据进行BN处理,忽略公式中的参数
也就是经过BN处理后,数据
是相同的。对参数进行更新
可以看到权重的缩放不会影响到对
的梯度计算
BN之后对参数的更新,可以得到如果权重越大,也就是
越大,
越小,「这意味着权重
的梯度更小,如此BN就保证了梯度不会依赖于参数的缩放,使得参数的更新处在更加稳定的状态。」「如此,BN抑制了参数变化会随着网络深度增加被放大的问题,使得网络对参数大小的适应能力更好。」
可以使得BN之后的数据对原始数据的信息得以保留。
,在
维度上进行标准化,和BN不同的是,BN计算Batch中所有样本的每个特征的标准化,LN分别对单个样本进行计算,对每个样本的所有特征进行标准化。计算方式相比BN更加简单。
LN在MLP,CNN和RNN的应用如下所示
「LN一般只用于RNN的场景下,在CNN中LN规范化效果不如BN,WN,GN,IN的」
计算当前层的参数的平均值和方差
其中
对应着当前层神经元的数量,也就是RNN中隐藏层节点数,计算所有隐藏层节点的均值和方差,然后使用整个隐藏层的均值和方差来对当前隐藏层进行标准化。
标准化之后经过缩放和平移得到LN之后的输出输出
参数
是学习参数和BN类似,规范化后的数据进行缩放和平移,以保留原始数据的信息。
根据链式求导法则
是模型的损失,
对应着经过LN标准化之后的向量,
对应着原始数据输入,根据上面部分LN的推导,存在关系式
对于原始输入,未经过LN正则化,损失函数对输入变量
的梯度
是梯度的均值和方差
如果经过LN正则化,也就是
那么损失函数
对
的梯度为
对应的均值和方差为
那么满足关系
如此,LN实现了对梯度的缩放和平移变换
「InstanceNormalization主要是针对CNN设计,并且是为了弥补BN的对batch的依赖。」
LN去放弃了BN对batch的依赖,为了能够统计均值和方差,把同层内所有神经元的响应值作为统计范围。为了进一步缩小统计范围,减少噪声的输入,对于CNN,同一个卷积层内,每一个卷积核都会产生一个输出通道,每个输出通道对应一个二维平面,尺寸都为
,也包含多个激活神经元。在卷积层中来说,将单个样本的每个输出通道内的神经元会作为一个集合来统计均值和方差。使用该二维平面统计得到的均值和方差,对该二维平面内的元素进行标准化。
MLP和RNN无法使用InstanceNormalization,可以将InstanceNormalization看做Btahc=1的BN。
「InstanceNormalization对于图像生成任务效果明显优于BN,在图像分类上不如BN。」
对于LN使用同层所有神经元作为统计范围,用于RNN中。IN将CNN中同一卷积层中每个卷积核对应的输出通道单独作为统计范围。虽然LN用于RNN中,IN用于CNN中,但是可看出这是两种计算情况,LN使用当前层的所有神经元,IN使用当前的单个featuremap,设计的GN的统计范围是介于两者之间,对CNN的在输出通道上进行分组,在分组范围内进行统计。
「GN在要求batch比较小的场景下或者目标检测,视频分类等任务由于BN」
目前没有API的方式可以实现权重归一化,对于前面的BN和LN,都是将输入的数据进行规范化,WN是从权重的角度进行规范化,WN将权值向量
在欧式范数和其方向上进行解耦成参数向量
和参数标量
,在训练时使用SGD分别优化这两个参数。
WN和BN不同,与样本数量无关,可以用于batchsize较小和RNN等动态场景中;并且WN不会在梯度计算中像BN那样引入噪声。
在神经网络中,一个节点的计算可以表示为
是一个k维的特征向量,
是该神经元节点的输出,输出是一个标量。在计算得到损失之后会根据损失使用SGD的优化策略对参数
进行更新。
WN的归一化策略将
分解
表示
的欧氏范数,当
并且
时,WN会被还原为普通的计算方式。
如果将参数
固定为
时,只对参数
进行优化,相当于只优化
的方向,并保留其范数的大小;如果固定参数
,只对参数
的范数,并且保留其方向。
在优化
时,一般优化
的
来实现,即
参数更新方式
是损失函数值,
表示损失函数
对参数
求偏导。
进行整理可以得到
上述转换可以看出WN的两个重要特征
表明WN对权重梯度进行了
的缩放
表明WN将梯度投影到远离
的方向观察式子
,可以得到
与
垂直,所以
会非常接近参数
的垂直方向,如此对矫正梯度更新方向非常有效。
和梯度更新值中的噪声量成正比,而且
是和更新量成反比,所以当更新值中噪音较多时,更新值就会变小,也就是WN具有自稳定的作用。由此在训练的时候可以使用较大的学习率。
假设
,
分别为
的期望和方差,如果使用BN的方式进行标准化
当网络只有一层并且输入样本服从期望为0,方差为1的独立分布时,有
,此时BN和WN是等价的。
在每一层的layer的激活函数之前
虽然将权重
进行了分离,但是每一层激活函数之前的输出的均值仍然与
有关。将BN和WN进行结合,采用移动平均计算每个minibatch的均值
,由此
在激活函数之前的
的反向传播的损失函数为
这相当于只进行减去均值的BN,舍弃了BN中的除去方差的操作,这样处理就避免了BN中除去方差带来的额外噪声。
这是因为当权重缩放时,对应的均值和方差都会等比例缩放,最终分子分母相抵消。这个性质带来的好处\frac{\partialNorm\left(\mathbf{W}^{\prime}\mathbf{x}\right)}{\partial\mathbf{x}}=\frac{\partialNorm(\mathbf{W}\mathbf{x})}{\partial\mathbf{x}}避免了反向传播时会因为梯度过大或者过小导致出现梯度爆炸或消失的问题
下层的权重值越大,其梯度就会越小,如此,参数的变化就会越稳定,这相当于实现了参数正则化的效果,避免参数的大幅震荡,提高了网络的泛化能力。
「数据伸缩不变性仅对BN,LN,CN有效,这三种规范化方式,都是对输入的数据进行规范化,当数据进行缩放时,对应的均值和方差都会变化。」「数据伸缩不变性可以有效的减少梯度弥散,减少对学习率的选择」