本文用于记录自己的学习过程,以及以前重点总结,若有错误,希望指出。
Batch Normalization:通过减少 Internal Covariate Shift来加速深度网络训练
0.摘要
什么是Covariate Shift ? 什么是Internal Covariate Shift ?
训练神经网络时,因为每一层的输入分布在训练过程中会随着前一层的参数的变化而变化。这使得在训练过程中必须降低学习率和合理初始化参数,使得很难训练饱和非线性模型。
下一段引用自知乎中的回答:http://t.cn/RGJST79
统计机器学习的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,就出现了新的机器学习问题,如迁移学习等。Covariate Shift就是分布不一致假设下的一个分支问题,它指的是源空间和目标空间的条件概率是一致的,但是边缘概率不同,即:
但是
,
对于神经网络的各层输出由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。
上一段中的源空间可以看成深度网络的训练集,目标空间可以看成深度网络的测试集去理解这个概念,具体化就是训练集与测试集的数据的分布是不同的,但是他们样本标记相同(即上面的条件概率相同),对于用训练集训练出来的模型,用测试集去测试好坏,这就叫做Covariate Shift。在深度网络中,由于这样的操作在于网络的层与层之间存在,所以加了一个“Internal”,叫做Internal Covariate Shift。
Batch gradient descent(批梯度下降BGD),stochastic gradient descent(随机梯度下降SGD)和mini-batch gradient decent(小批次梯度下降MBGD)的关系:
BGD是对所有的样本求梯度来更新参数,缺点计算量大,但收敛速度快
SGD是对一个随机的样本求梯度更新参数,收敛速度快,但不能很快收敛到局部最优解,且解可能不是最优
MBGD是BGD和SGD的一个结合,对n个样本求梯度来更新参数,1<n<N。
BN这个方法的优势在于将归一化作为模型结构的一部分,对于每次mini-batch梯度下降都执行归一化操作。
BN允许我们使用更高的学习率并且对参数的初始化不用太注意。并且它可以作为一个正则化项,在一些情况下它可以代替Dropout.
BN被应用于最先进的图像分类模型时,BN达到相同的精度的情况下,减少了14倍的训练步骤,以显著的差距击败了原始模型.
1.介绍
mini-batch(m个样本)与SGD(1个样本)相比的好处:
- 小批量梯度下降的质量随样本数量的增大而增加
- 由于当前计算平台提供并行计算,批次计算比m次单次计算效率更高
随机梯度简单有效,但我们需要仔细调整模型的超参数,尤其是用来优化的学习率和参数的初始值。深度神经网络每一层的输入值都受到前面所有的参数的影响,当网络变深时,前面参数微小的变化会被放大。
每次层的输入分布改变时,都会是一个问题,因为这些层需要去改变参数不断适应新的分布,当输入到学习系统的分布改变,我们称为了covariate shift。
通常的解决方法是迁移学习中的domain adaptation(对于本文这是什么不重要)。
covariate shift学习的概念可以扩展到学习系统之外,应用到各个部分,比如子网络或层。在子网络中,当输入x的分布保持不变时,对于训练子网络是有利的。
固定子网络输入的分布也会对子网络之外的层产生积极的影响。
实践中,饱和问题是通过ReLU,合理的初始化和较小的学习率来解决的。在网络训练时,如果我们可以保证非线性的输入分布更加稳定的,从而优化器不太会陷入饱和状态,训练也会加速。
所以消除Internal Covariate Shift可以加速训练,我们提出了一种新的机制,我们称它为Batch Normalization(批规范化BN),他减少了Internal Covariate Shift,从而加速了训练。
他通过一个归一化步骤实现了修复输入的均值和方差,BN通过减少梯度对参数的比例或初始值的依赖,对网络中的梯度传播上产生好的效果,这可以让我们使用更高的学习率而没有发散的危险。BN可以作为一个正则化项,从而减少对Dropout的依赖。BN通过预防网络陷入饱和模式,使得,使用饱和非线性成为可能。
2.向减少 Internal Covariate Shift转变
将Internal Covariate Shift 定义为训练过程中由于网络参数的变化而引起的网络激活分布的变化。我们期望通过固定每层输入x在训练过程中的分布,来提高训练速度。当输入数据被白化(通过线性变化获得0均值、单位方差和去相关)后,收敛速度会变快。每一层的输入都由下面的层产生,这有利于对每一层实现相同的白化操作。通过对每一层输入的白化,我们可以向实现固定输入分布迈出一步去消除Internal Covariate Shift 的不良影响。
我们可以考虑在每一个训练步骤或者一个间隔内,通过直接修改网络或者通过改变依赖于网络激活值的优化算法的参数来实现白化操作。然而,如果这些修改和优化的步骤穿插在一起,那么梯度下降可能需要在更新参数时,对标准化进行更新,从而降低梯度的影响。举个例子:假设输入为u,偏置为b
,通过减去平均值来实现均值为0的归一化,那么
,其中
,
,如果梯度下降忽略
和
之间的联系,那么
,对于
,所以虽然b
更新了,但是他的损失loss没有改变,这就会导致b
无限增长,而损失不变,会使得结果跟糟糕。
上面这个问题的发生时因为梯度下降没有考虑到归一化已经发生的这样一个事实。为解决这一问题,我们希望确保,对于任何的参数值,网络总会对期望的分布产生激活值。这样做伙食的关于模型参数损失的梯度来解释标准化,以及对参数的依赖。设
为输入,
为这些输入在训练集上的集合,标准化写作
。对于反向传播,我们需要计算
和
,忽略后面那一项,会导致上面描述的爆炸,在这样的框架中,白化层是很昂贵的,因为我们需要计算协方差矩阵和它的平方根倒数,从而得到白化激活和这些变化进行反向传播的偏导数我们需要寻求一种替代方案,以可微分的方式执行输入标准化,并在每次参数更新后不需要对整个训练集进行分析。
3.通过Mini-Batch统计进行标准化
由于输入的白化花费是昂贵的且并不是处处可微,所以我们进行两个必要的简化:
- 通过标准化,将每一个标量特征的均值转化为0,方差转化为1。而不是将输入和输出中的特征共同白化。即使不相关,这种归一化也会加速收敛。我们确保插入到网络中的变换是一种恒等变换。
- 使用mini-batch梯度下降
在算法中,为了数值稳定,ϵ是一个加到小批量数据方差上的常量。
BN依赖于训练样本和在mini-batch中的其他样本。y将传递给神经网络其他层,
存在于转化内部,如果我们忽略ϵ,那么
的分布就满足期望为0,方差为1。对于每一个标准化的激活值
,经过一个线性变换得到y,这样所有的子网络的输入都有了固定的期望和方差,尽管这些过程会在训练中改变。
根据BP链式法则,我们可以得知BN变换是将标准化激活引入到网络中的可微变换
3.1 批标准网络的训练与推导
BN网络就是在每一个子网络中加入BN转换,用BN(x)来代替x作为输入,然后利用梯度下降法训练参数。当网络被训练好之后,我们用全部数据的去替代mini-batch的数据,其中E(x)是所有mini-batch的均值,Var(x)是说有mini-batch的方差的修正样本方差。
3.2 批标准化卷积网络
把批标准化运用到卷积网络中,把BN 层加到非线性激活函数之前会跟好。对于非线性激活函数g(·),由于偏置b会在利用减法将均值变为0的过程中被消去,所以可以被忽略。所以上面的式子将被
替换。
对于卷积网络,我们将一个特征图当作一个神经元(即一个特征图共享一个),其中的均值和方差,就是对特征图中的所有元素进行求均值和方差。这样我们就将卷积网络对应到了3.1中算法所对应的网络中。从而实现对卷积网络的批标准化。
3.3 批标准化提高学习速率
在传统的深度网络中,太大的学习率会导致梯度爆炸或消失,或者陷入局部最小值。通过对激活值得归一化,可以预防它把小的参数变化放到很大和和梯度中激活值得次优变化,它可以防止训练陷入非线性的饱和状态。
大的学习速率会导致参数规模变大,会使得在BP过程中导致模型爆炸,批处理规范化后,通过层的反向传播不受其参数规模的影响。参数规模的变大不影响Jacobians矩阵和梯度传播。
进一步猜想,BN会使得Jacobians矩阵的奇异值接近1,这将有益于训练。
3.4 批标准化在模型中的正则化
训练时,单个样本和mini-batch进行了综合考虑,对于所给的训练样本,训练网络会很快产生一个确定的值。这有利于提升网络的泛化能力,可以代替 Dropout。
4.实验
4.1 Activations over time
在MNIST上用3个隐层,每层100个的神经元的网络进行实验,初值为高斯,sigmoid函数,迭代50000次,mini-batch为60个样本,损失为交叉熵。
批规格化网络具有较高的测试精度.
批规格化网络中的分布更加稳定,这有助于训练。
4.2 ImageNet classification
4.2.1 加速BN规格化
单纯的加入BN规格化不能最好的提升我们的模型,所以我们改变了网络和训练参数:
- 增加学习率
- 去除Dropout层
- 减少L2范数在正则化项中的权重
- 加速学习率衰减
- 去除LRN(局部响应归一化
- 将训练数据更彻底的打乱
- 降低亮度失真
4.2.2 单独的网络分类
//原始的学习率为0.0015,上面x5,x30指的是学习率变成原来的5倍,30倍
如果没有BN,那么Sigmoid函数在Inception结构上的精度没有超过1/1000的,现在达到了69.8%
4.2.3 综合分类
之前最好的成绩是top-5错误率为4.94%,而我们的错误率是4.9%,在测试集上的错误率为4.82%,有一些提升。
我们运用的网络基于BN-x30,并修改一部分内容:
1.增加最初卷积层的权重
2.使用Dropout层(相比于原来Inception的40%的概率,现在变成5%-10%)
3.使用非卷积层,在模型最后的隐藏层激活之前使用BN层
所有的网络在6*10^6次计算之前达到最大精度