本文写作参考经典论文 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
论文假设
学过机器学习的朋友们都知道机器学习的假设是我们的训练集、验证集、测试集、都服从同一个分布而我们要做的就是从假设空间中选取一类假设函数去拟合这样的一个数据分布,在机器学习界有一句经典的话数据样本决定了训练的上限而我们的模型不过是将这个上限跑出来。
我们的训练数据是在总体分布上的一个采样,正因为如此才使得我们能够用有限的数据去对整体分布进行拟合,拟合之后的模型具有泛化能力。在传统的机器学习算法中比如线性回归、逻辑回归、支持向量机等,这些算法的假设函数都比较简单一般都不是复合函数因此在拟合的过程中不会改变训练数据的分布,模型的训练比较简单,但是在深度学习中模型的训练是很复杂的,由于网络层数的原因就会导致一个问题,这个问题就是网络深层的输入数据分布会受到浅层的数据和参数的影响,有可能导致深层的输入数据分布改变从而导致每一层去拟合其对应来自前层输入数据的时候需要重新拟合一个数据分布这将导致网络的训练变得困难。
为方便起见拿机器学习中线性回归举例,其假设函数为,在梯度下降的过程中我们并没有改变数据的x的分布因此这样的模型训练是很简单的,但是对于深度学习DNN或CNN而言并非如此了,下面拿VGG16深度卷积神经网络举例。
暂且忽略掉池化层考虑卷积层和全连接层(FC)如果将卷积神经网络的每一个卷积层和全连接层都看做一个独立的单元将这些独立单元称之为子网络。那么每一层子网络都是在拟合其输入的数据,而其输入数据又受到其前层网络参数的影响,而我们的每一个子网络在做的事情都是在拟合其输入数据的分布,但是由于每一个子网络的输入都受到其前层网络的影响,梯度下降的过程中随着参数的改变就算是同一个mini-batch的数据在重复输入的时候其输入到子网络的数据都发生了改变,这种改变将有可能改变其输入数据的分布,这就意味着子网络将重新拟合新的分布来减少损失函数值,这样就会导致网络训练的训练次数增加。论文中将这种由于子网络输入数据受到其前层子网络参数影响导致改变输入数据分布改变的现象定义为内协变量偏移
( Internel Covariate Shift)
。
论文所提算法思想
算法思想是很简单的,由于深度学习网络层数的原因导致内协变量问题的产生从而减慢了网络的训练次数。而内协变量偏移指的就是数据分布发生了改变那么我们是否有办法将输入每一个子网络的输入数据分布固定住或者是减少输入数据分布改变的幅度来增加网络的训练速度嘞?论文作者就想出了一个办法通过对每一个mini-batch
作一个Normalization
来实现。
论文中是考虑固定住每一个子网络的输入数据分布来减少内协变量偏移的,通过对每一个mini-batch做标准化即每一个mini-batch中feature map的每个元素减去batch的均值比上标准差然后在进行一个仿射变换来实现的。标准化后的数据服从一个均值为0方差为1的分布,这样的处理对训练有很大的好处。当网络进行前向传播由前层传向深层的时候由于其每一层子网络的输入数据都与前层有关,这导致只要前层的参数有一个微小的扰动就有可能导致馈入子网络数据发生很大的变化使得分布的改变会很大,当进行了标准化之后对数据进行了压缩,数据的差异就不会这么大,而且分布的均值始终为零方差始终为一这就使得分布变得比之前很稳定,而且在没有进行标准化之前子网络的输入数据分布通常都与前层数据有很大的相关性,这样就会导致前层网络数据改变会导致子网络也发生很大改变,而标准化后的数据在一定程度上会减少与其前层网络数据分布的相关性,这就使得馈入每一个子网络的输入数据分布都变得很稳定且与前层网络数据分布的相关性减弱,这样在每一层拟合数据的时候就不用因为数据分布的改变重新大幅度调整参数来进行拟合。而且BN算法图中的仿射变换能够保证即便数据在不进行Normalization处理的时候是最优的也能够恢复到原来的状态,只要将参数学习成标准差和均值就可以实现。注意标准化之后的分布与其前层不一定独立同分布也不一定是高斯分布,但是他能够有效的加速深度网络的学习。
由于将子网络的输入数据进行了压缩当时用sigmoid进行非线性映射的时候就能够有效的防止由于sigmoid激活函数特性导致的当数据值很大或很小的时候导致的梯度弥散。而且由于Normalization固定住了从前层传递而来馈入当前子网络的数据的分布,也在一定程度上改变了原始的数据分布这使得模型在训练的过程中在一定程度上能够拥有防止过拟合的能力,进行了BN处理之后的网络往往能够抛弃Dropout和一定程度上的正则化操作这在论文中都有实验。
通过BN操作能够增大学习率的选择范围。当学习率选取很大的时候将很容易导致梯度爆炸问题,而由于BN算法对数据进行变换的性质权值尺度变换不会影响BN之后的值而且梯度会自动进行调整当输入数据尺度变换增大数据值的时候会减小梯度值,减小数据值的时候会增大梯度值,这在一定程度上能够防止梯度爆炸和梯度弥散如下图所示。
总而言之BN算法能够极大加速深度网络的训练。
本文写作是参考论文作者理解在加上自己个人理解就像作者在论文中所言现在对BN的机制了解很有限,因此每个人都可以有不同的看法只要言之有理即可,如有不妥之处还请各位老哥老姐海涵。
论文地址:
https://arxiv.org/abs/1502.03167
本文只抽取论文精华细节请读原文