英语原文共 11 页
批量归一化:通过减少内部协变量转移加速深度网络训练
摘要
在深度神经网络的训练过程中,先前层参数的调整会导致之后每一层输入值的分布发生变化,这种现象使模型的训练变得很复杂。所以在深度神经网络模型的训练中,通常需要仔细选取初始参数并采取较小的学习率,这不但导致模型训练的效率低下,而且使得饱和非线性模型的训练极为困难。我们把这种现象称为内部协变量转移(covariate shift),并通过归一化(normalizing)每层的输入来解决这个问题。我们方法的强大之处在于把归一化的步骤作为模型训练架构的一部分来实现, 并且对每个训练小批量都执行归一化操作。批量归一化允许我们使用很高的学习率并且对初始化不太在意。它在一定情况下也可以起到正则化的作用,并减轻了对Dropout的需求。我们在最先进的图像分类模型中使用批量归一化法,在减少了14倍训练步骤的情况下实现了与原模型相同的精度,并以显著增量击败了原始模型。我们使用批量归一化的网络模型,增强了在ImageNet分类上发布的最佳结果:获得了4.9%前5验证误差(和4.8%测试误差),这超出了人类评估者的准确率。
1引入
深度学习极大地提升了视觉,语言和许多其他领域。随机梯度下降(SGD)已经被证明是训练神经网络的一个有效的方法,并且随机梯度下降变种方法如动量和Adagrad已经被用来获得最先进的性能。随机梯度下降优化网络的参数,以便最小化损失
其中是训练集。在训练的每一步中我们考虑一个大小为m的小批量。这个小批量被用来近似相关联参数的损失函数梯度,通过计算
使用小批量的样本,而不是一次一个样本,在几个方面是有帮助的。首先,小批量上的损失梯度是训练集上梯度的一个估计,其质量随着批量大小的增加而提高。第二,由于现代计算平台提供的并行性,对一个批量的计算比每个样本m次计算更有效。
虽然随机梯度是简单有效的,但是它需要仔细调整模型超参数,特别是使用在优化中的学习率以及模型参数的初始值。由于每层的输入受所有先前层的参数影响的事实,使训练复杂化,以至于网络参数的小变化随着网络变得更深而放大。
由于层需要不断地适应新的分布,层输入的分布的变化提出了一个问题。当一个学习系统的输入分布改变时,也就认为经历了协变量移位,这个通常通过领域适应(domain adaptation)来处理。但是,协变量移位的概念可以作为一个整体延伸超出学习系统,适用于他自身的部分,比如子网络或者一个层。设想一个计算如下公式的网络:
其中和可以是任意变换,网络通过训练参数和来最小化损失函数。以
为损失函数的独立网络。例如,一个梯度下降步骤:
因此,输入分布的属性使得训练更有效——比如在训练和测试数据之间有相同的分布——也适用于子网络的训练。因此有利于X的分布随时间保持不变。
固定一个子网络输入的分布将对子网络外的层产生积极的影响。用一个sigmoid激活函数z=g(Wu b)考虑一个层,其中u是层输入,权重矩阵U和阈值是学习的层参数,因为X是受W,b和下面所有层参数的影响,在训练期间对这些参数的改变将可能将X的许多维度移动到非线性的饱和状态并且收敛减慢。这种效果是随着网络的深度的增加而放大的。在实际应用中,饱和问题(saturationproblem)和导致的消失梯度通常通过使用Rectified Linear Units(ReLU)来解决。ReLU(x)=max(x,0),仔细的初始化和小的学习率。然而,如果我们可以确保非线性输入的分布在网络训练时保持更加稳定,那么优化将不太可能在饱和状态中停滞,并且训练将加速。
我们将训练过程中深度网络内部节点分布的变化作为内部协变量转移,消除它可以提供一个更快的训练,对此我们提出了一个新的机制——批量归一化,它将减少内部协变量转移,这样做可以大大地加快深度神经网络的训练。它通过一个归一化步骤——固定层输入的平均值和方差不变来实现。通过减少梯度对参数规模或其初始值的依赖性,批量归一化还对网络的梯度流动具有有效的效果,这就允许我们在没有发散的风险下使用更高的学习率。此外,批量归一化正则化模型可以减少对Dropout的需求。最后,通过防止网络陷入饱和模式使得批量归一化可以使用饱和非线性。
在实验过程中,我们将批量归一化运用到性能最佳的ImageNet分类网络,结果表明我们可以只使用7%的训练步骤去匹配其性能,并且可以进一步大幅度的超过其精确度。使用用批量归一化训练的这种网络集合,我们可以获得前5的误差率,它增强了在ImageNet上已知的最佳结果。
2减少内部协变量转移
我们把在训练期间由于网络参数的变化而造成的网络激活函数输出值分布的变化定义为内部协变量转移。为了增强训练,我们要寻求减少内部协变量转移。我们期待通过在训练过程中保持层输入X的分布来提高训练速度。众所周知如果层输入被白化(whitened),也就是说把层输入线性变换为零均值和单位方差并且去相关,则网络训练就会收敛得更快。由于每层的输入是由下面层产生的输出,因此对每层输入进行相同程度的白化将是有利的。通过白化每层输入,我们就可以向实现输入的固定分布,并向消除内部协变量转移的不良影响的目标前进一步。
我们可以考虑对每个训练步骤或者以一定间隔的激活函数进行白化,也可以通过直接修改网络或者根据网络激活值改变优化算法的参数。但是,如果仅仅将这些修改与优化步骤直接穿插摆放,则梯度下降的步骤对参数的调整可能会改变激活输出的分布并导致重新归一化,而这有可能会使得梯度下降的效果减弱。
我们在初始试验中观察到,当归一化参数在梯度下降步骤外计算时模型就会因为参数发散而不收敛。
上述方法的问题是梯度下降优化没有考虑归一化发生的事实。为了解决这个问题,我们要确保对于任何参数值网络都会产生具有期望分布的激活。这样做能允许相应模型参数的损失梯度考虑归一化以及其对模型参数的依赖性。再次让x为层输入,吧他视为一个向量,X是训练数据集上这些输入的集合,可以将归一化写成一个转换:
这不仅取决于给定的训练样本,而取决于所有样本x,后面,计算雅克比:
忽略后一项导致上述参数发散。在这个框架内,白化层输入代价非常大。它通过计算协方差矩阵和它的平方根倒数,来给出白化的激活函数输出,并且需要计算上述变换的导数来满足反方向播种算法的要求。这促使我们需要寻找一种归一化的替代方案,它需要光滑可微,并且不需要在每个参数更新之后对整个训练集进行计算。
一些以前的方法使用在单个训练样本上计算的统计量,或者在图像网络情况下,在一个给定位置上的不同特征。但是,丢弃激活的绝对标量会改变网络的表示能力。相对于整个训练数据的统计,我们想要通过在一个训练样本里归一化激活来保存网络中的信息。
3通过小批量统计归一化
由于每层的输入完全白化代价太大,并且不是处处可微,所以我们做两个必要简化。
第一个在白化层的输入的特征向量和输出向量时,我们对这些向量的每一个分量单独做归一化,使得每一个分量的均值为0方差为1。我们将归一化每个维度:
其中期望值和方差是在训练数据集上计算的。即使当这些特征不是去相关的,归一化也会加速收敛。
但是值得注意的是,简单的归一化层的每一个输入有可能会改变层表达的内容。比如,归一化sigmoid的输入会使得这些非线性函数局限在他们的线性部分上。为了解决上述问题,我们要确保插入在网络中的(归一化)变换在特定的情况下也可以是单位变换。为了完成这个,我们队医每个激活,引入两个参数和来缩放和偏移归一化值:
这些参数与原参数模型一起训练,可以恢复网络的表示能力。实际上,在理想状态下可以通过设置来吧归一化逆转恢复成原始的激活函数输出。
在批量训练模式中(使用全部训练集),训练步骤中的每个步骤都是基于整个训练集,我们可以使用整个集合去归一化激活。但这在随机优化(使用小批量)中是做不到的。因此,我们做第二个简化:由于我们在随机梯度训练中使用小批量,用每个小批量来估计每个激活分布的均值和方差。在这种情况下,用于归一化的统计量可以完全参与梯度反向传播。这里再次注意:使用小批量,只能计算每个维度的方差而不是联合协方差;因为在联合情况中,由于小批量的大小可能小于被白化的激活的数量,导致奇异协方差矩阵的产生,所以可能需要正则化。
考虑到一个大小为m的小批量B由于归一化被独立的运用到每一个激活函数,为了简单起见,我们把注意力放在一个特定激活并且忽略k,在小批量B中对于这个激活我们有m个值:
令归一化值为他们对应的先行转换是。我们把变换
作为批量归一化(BN)转换。我们在算法1中提出BN变换,在这个算法里是用于数值稳定性添加到小批量方差的常数。
构想一个大小为m的小批量B。归一化被独立的运用到每个激活函数,有下面的算法:
BN变换可以被添加到网络中任何一个激活上。在里,我们需要强调和是学习参数。而且值得注意的是批量转换不是独立处理每个训练样本中的激活,相反,既依赖于训练样本也依赖于小批量中的其他样本。这个缩放和偏移之后的值y被传递到其他网络层。这个归一化的激活虽然只存在于我们转换的内部,但是他们的存在是至关重要的。只要每个小批量的元素是从相同分布采样,如果我们忽略,任何的值的分布都具有期望值为0和方差为1。这是因为且。每个归一化的激活可以看成是一个由先行转换组成的子网络的输入,而这个子网络的输出则被导入原始网络的其他部分进行处理。这些子网络的输入全都有固定的均值和方差,尽管这些归一化的的联合分布并没有归一化,进而可以在训练过程中改变,但我们期望这种归一化可以加速子网络的训练,进而加速整体网络的训练。
在训练过程中我们需要计算反向传播损失的梯度,这一过程中也同时计算了BN变换的相关的参数的梯度。我们使用的链式法则如下所示(在简化之前):
因此BN变换是将归一化激活引入网络的可微分转换。这确保了当模型在训练时,层可以持续在内部协变量转移较少的输入状态下进行学习,从而加速训练。
3.1训练和拟合批量归一化网络
对网络进行批量归一化时,我们先确定一个激活函数的子集,然后根据算法1为子集中的每一个激活插入BN变换。任何层由先前的接收x作为输入到现在的接收BN(x)作为输入。在加入了批量归一化的网络上,可以使用批量梯度下降,或小批量mgt;1的随机梯度下降,或者它的任何一个随机梯度下降法的变体比如Adagrad来做优化。
在模型训练阶段,依赖小批量的激活的归一化可以有效地加速训练,但是在拟合阶段就没有必要依赖小批量。我们希望在拟合时,输入能够完全确定地决定输出。为此,一旦训练结束,拟合时我们要使用全部样本来计算归一化的统计量:
而不是使用小批量。使用这些统计量的移动平均,我们可以追踪模型训练的精确性。而拟合时,均值和方差都是固定不变的(因为使用了全部样本),归一化仅仅是应用于每个激活的线性变换。
如此,算法2总结了训练批量归一化网络的过程。
算法2:训练一个批量归一化网络
3.2批量归一化卷积网络
批量归一化可以应用于网络中激活的任何集合。在这里,我们考虑由一个仿射变换与一个一元非线性函数组成的激活函数:
其中W和b是模型的学习参数,这个公式涵盖全连接层和卷积层。我们在非线性函数作用之前对X=Wu b进行BN归一化变换。我们之所以不直接归一化层输入u,是因为u一般是另一个非线性层的输出,其分布的形状可能在训练期间改变,只约束其第一和第二矩将不会消除协变量转移。相反的,Wu b更可能具有对称,非稀疏分布,即“更高斯”;归一化它可能产生具有稳定分布的激活。
注意,阈值b可以被忽略,因为他会被随后均值减去(根据算法1的带入阈值的作用),由于我们归一化,因此是可以被
取代的。
对于卷积层,我们还希望归一化服从卷积属性:使得相同特征映射的不同元素在不同位置处以相同方式归一化。为了实现这一点,我们联合归一了小批量中所有所有位置的所有激活。在算法1中,我们把B定义为一个特征映射中的所有值的全体,相当于小批量元素与特征映射的笛卡儿积--因此对于大小为m的小批量和大小为 ptimes;q 的特征映射,我们使用大小 为 m′= |B| = m·pq 的小批量。我们对每个特征映射,而不是每个激活,学习一对参数 gamma;(k),beta;(k)。算法2也是被类似修改,使得在推理期间 BN 变换将相同的线性变换应用在一个给定特征映射中的每个激活。
3.3批量归一化令使用高学习率成为可能
在传统深度网络中,过高的学习率可能会导致梯度发散或者消失为零,以及使得损失函数陷入不好的局部最小值。批量归一化对解决这个问题有所帮助。通过归一化整个网络中的激活,可以防止参数的微小变化通过深层网络扩大为梯度的次优变化:比如它阻止了训练陷入非线性的饱和状态。
批量归一化还使模型训练对参数值的大小变化有更强的容忍度。通常,大的学习率可能增加层参数的绝对数值,然后在反向传播期间放大梯度并导致模型发散。但是,在批量归一化下,一个层的反向传播是不受它的参数绝对大小影响。事实上,对于一个标量a:
参数的绝对大小不影响层的雅可比矩阵,也不影响梯度传播。此外,较大的权重导致较小的梯度,并且批量归一化将使参数稳定增长。
进一步,我们猜想批量归一化可以使层雅可比矩阵具有接近1的奇异值,这也是有益于训练的。考虑到具有归一化输入的两个连续层以及这些归一化向量 = F()之间的转换。如果我们假设,是高斯分布并且不相关,且F() asymp; J是 一个线性变换。那么, 就都有单位协方差矩阵,于是 I = Cov[] = JCov[] =。因此=
资料编号:[3843]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。