用于深度模型训练的优化算法与传统的优化算法在几个方面有所不同。机器学习通常是简接作用的,再打所述机器学习问题中,我们关注某些性能度量P,其定义于测试集上并且可能是不可解的。因此,我们只是间接地优化P,我们希望通过降低代价函数
来提高P。纯优化使最小化目标J本身。
机器学习算法的目标是降低期望泛化误差,这个数据量被称为风险。强调该期望取值真实潜在分布
,如果知道了真实分布,那么最小化风险就变成另一个可以被优化算法解决的优化问题。然而,通常遇到的机器学习问题,通常不知道数据分布的,只知道训练集中的样本。
将机器学习问题转换为一个优化问题的最简单方法是最小化训练集上的期望损失。意味着用训练集上的经验分布替代真实分布,然后,最小化经验风险。
基于最小化这种平均训练误差的训练过程被称为经验风险最小化。在这种情况下,机器学习仍然和传统的直接优化相似。并不直接优化风险,而是最优化经验风险,希望也能很大地降低风险。
然而,经验风险最小化很容易导致过拟合。高容量的模型会简单地记住训练集。
在深度学习中,很少使用经验风险最小化,反之,会使用一个稍有不同的方法,真正的优化目标会更加不同于我们希望优化的目标。
有时候,真正关心的损失函数(比如分类误差)并不能被高效的优化。在这种情况下,通常会优化代理损失函数。代理损失函数作为原目标的代理,还具备一些优点:正确类别的负对数似然通常用作0-1损失的替代。负对数似然允许模型估计给定样本的类别的条件概率,如果该模型效果好,那么它能够输出期望最小分类误差所对应的类别。
在某些情况下,代理损失函数比原函数学到的更多。例如,使用负对数似然替代函数时,在训练集上的0-1损失达到0之后,测试集上的0-1损失还能持续下降很长一段时间。这是因为即使0-1损失期望是零时,我们还能拉开不同类别的距离以改进分类器的鲁棒性,获得一个更强壮的、更值得信赖的分类器,从而,相对于简单地最小化训练集上的平均0-1损失,它能够从训练数据中抽取更多信息。
一般的优化和我们用于训练算法的优化有一个重要的不同:训练算法通常不会停止在局部极小点。反之,机器学习通常优化代理损失函数,但是在基于提前终止的收敛条件满足时停止。通常,提前终止使用真实潜在损失函数,如验证集上的0-1损失,并设计为在过拟合发生之前终止。与纯优化不同的是,提前终止时代理损失函数仍然有较大的导数,而纯优化终止时导数较小。
机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中的一部分项来估计代价函数的期望值。
如果能够快速地计算梯度的估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快(就总的计算量而言,而不是指更新次数)。
另一个促使我们从小数目样本中获得梯度的统计估计的动机是训练集的冗余。在最坏的情况下,训练集中的所有m个样本都是批次相同的考虑。基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来少花了m倍的时间。很可能会发现大量样本都对梯度做出了非常相似的贡献。
使用整个训练集的优化算法被称为批量或确定性梯度算法,因为他们会在一个大批量中同时处理所有的样本。
每次只使用单个样本的优化算法有时被称为随机或者在线算法。术语在线通常是指从连续产生的样本数据流中抽取样本的情况,而不是从一个固定大小的训练集中遍历多次采样的情况。
大多数用于深度学习的算法介于上述两者之间,使用一个以上而不是全部的训练样本。传统上,这些会被称为小批量或者小批量随机方法,通常将它们简单地称为随机方法。
随机方法的典型示例是随机梯度下降。
小批量的大小通常由以下几个因素决定:
不同的算法使用不同的方法从小批量中获取不同信息,有些算法对采样误差比其他算法更敏感,这通常有两个可能原因。一个是它们使用了很难在少了样本上精确估计的信息,另一个是它们以放大采样误差的方式使用了信息。
小批量是随机抽取也很重要。从一组样本中计算出梯度期望的无偏估计要求这些样本是独立的。
实践中通常将样本顺序打乱一次,然后按照这个顺序存储起来就足够了。
小批量随机梯度下降的一个有趣动机是,只要没有重复使用样本,它将遵循着真实泛化误差的梯度。很多小批量随机梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。第一次遍历时,每个小批量样本都用来计算真实泛化误差的无偏估计。第二次遍历时,估计将会是有偏的,因为它重新抽取了已经用过的样本,而不是从和原先样本相同的数据生成分布中获取新的无偏样本。
在线学习的情况随机梯度下降最小化泛化误差,样本或者小批量都是从数据流中抽取出来。学习器好像是每次看到新样本,样本永远不会重复,每次更新的样本是从分布
中采样获得的无偏样本。
多次遍历数据集更新时,只有第一遍满足泛化误差梯度的无偏估计。但是额外的遍历更新也会由于减小训练误差而得到足够的好处,以抵消其带来的训练误差和测试误差之间差距的增加。
训练深度模型时会涉及一些挑战
在优化凸函数时,会遇到一些挑战,这其中最突出的是Hessian矩阵的H的病态。这是数值优化、凸优化、或其他形式的优化中普遍存在的问题。
病态问题一般被认为存在于神经网络训练过程中,病态体现在随机梯度下降会卡在某些情况,此时很小的步长也会增加代价函数。
代价函数的二阶泰勒级数展开预测梯度下降中的
会增加:
到代价中,当
超过
时,梯度的病态会成为问题。判断病态是否不利于神经网络训练任务,我们可以检测平方梯度范数
和
。在很多情况中,梯度范数不会在训练过程中显著缩小,但是
的增长会超过一个数量级。其结果是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。
尽管病态还存在于处理神经网络训练的其它情况中,有些适用于其它情况的解决病态的技术并不适用于神经网络。牛顿法在解决带有病态条件的Hessian矩阵的凸优化问题时,是一个和优秀的工具。
凸优化问题的一个突出特点是可以简化为寻找一个局部极小点的问题。任何一个局部极小点都是全局极小点。
对于非凸函数时,如神经网络,有可能会存在多个局部极小值。
由于模型可辨识性问题,神经网络和任意具有多个等效参数化潜变量的模型都会具有多个极小值。如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨认的。带有潜变量的模型通常是不可辨认的,因为通过相互交换潜变量,我们能得到等价的模型。比如交换神经网络中两个权重相同的单元可以得到等价的模型,这种不可辨认性被称为权重空间的对称性。
除了空间对称性,很多神经网络还有其他导致不可辨认的原因。
这些模型可辨识性问题意味着,神经网络代价函数具有非常多甚至不可数无限多的局部极小值。然而,所有这些由于不可辨识性问题而产生的局部极小值都有相同的代价函数值。因此,这些局部极小值并非是非凸所带来的问题。
如果局部极小值相比全局最小点拥有很大代价,局部极小值会带来很大隐患。
一种能够排除局部极小值是主要问题的检测方法是画出梯度范数随时间的变化。如果梯度范数没有缩小到一个微笑的值,那么该问题既不是局部极小值,也不是其他形式的临界点。
对于很多高维非凸函数而言,局部极小值(以及极大值)事实上都远少于另一类梯度为0 的点,鞍点。鞍点附近的某些点比鞍点具有更大的代价,而其他点则有更小的代价。在鞍点处。Hessian矩阵同时具有正负特征值。位于正特征值对应的特征向量方向的点比鞍点有更大的代价,反之,位于负特征值对应的特征向量方向有更小的代价。可以将鞍点视为代价函数某个横截面上的局部极小点,同时也可以视为代价函数某个横截面上的局部极大点。
多类随机函数表现出以下性质:低维空间中,局部极小值很普通。在更高维空间中,局部极小值很罕见,而鞍点很常见。对于这类函数
而言,鞍点和局部极小值的数目比率的期望随n指数级而增长。
很多随机函数一个惊人的性质是,当我们到达代价较低的区间是Hessian矩阵的特征值为正的可能性更大。
不具非线性的浅层自编码器只有全局极小值和鞍点,没有代价比全局极小值更大的局部极小值。
真实的神经网络也存在包含很多高代价鞍点的损失函数。
鞍点激增对训练算法来说有哪些影响呢?对于只使用梯度信息的一阶优化算法而言,目前情况还不清楚,鞍点附近的梯度通常会非常小。另一方面,实验中梯度下降似乎可以在许多情况下逃离鞍点。
对于牛顿法而言,鞍点显然是一个问题。梯度下降旨在朝下坡移动,而非明确寻求临界点。而牛顿法的目标是寻求梯度为零的点,如果没有适当的修改,牛顿法就会跳进一个鞍点。高维空间中鞍点的激增或许解释了在神经网络训练中为什么二阶方法无法成功取代梯度下降。二阶优化的无鞍牛顿法,与传统算法相比有明显的改进。
除了极小值和鞍点,还存在其他梯度为零的点。例如从优化的角度看与鞍点很相似的极大值,许多算法不会被吸引到极大值。除了未经修改的牛顿法,和极小值一样,许多种类的随机函数的极大值在高维空间中也是指数稀少。
也可能存在恒值的、宽且平坦的区域。在这些区域中,梯度和Hessian矩阵都是0。这种退化的情形是所有数值优化算法的主要问题。在凸问题中,一个宽而平坦的区间肯定包含全局极小值,但是对于一般的优化问题而言,这样的区域可能会对应着目标函数中一个较高的值。
多层神经网络通常存在像悬崖一样的斜率较大的区域。这是由于几个较大的权重相乘导致的。遇到斜率极大的悬崖结构时,梯度更新会很大程度地改变参数值,通常会完全跳过这类悬崖结构。
不管我们从上还是从下接近悬崖,情况都很糟糕,但是可以使用启发式梯度截断来避免其严重后果。其基本思想源自梯度并没有指明最佳步长,只说明了在无线小区域内的最佳方向,当传统的梯度下降算法提议更新很大一步时,启发式梯度截断会干涉来减小最小步长,从而使其不太可能走出梯度近似为最陡下降方向的悬崖区域。悬崖结构在循环神经网络的代价函数中很常见,因为这类模型会涉及多个因子的相乘,其中每个因子对应一个时间步。因此,长时间序列会产生大量相乘。
当计算图变得极深时,神经网络优化算法会面临另一个难题是长期依赖问题,由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得极其困难。深层的计算图不仅存在于前馈网络,还存在于循环网络中。因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图,并且参数共享,使得问题更加凸显。
假设某个计算图中包含一条反复与矩阵W相乘的路径,那么t步之后,相当于乘以
。假设W有特征值分解
,在这种简单的情况下,很容易看出
,当特征值
不在1附近是,量级上大于1,梯度互爆炸,小于1梯度会消失。梯度消失与爆炸问题(vanishing and exploding gradient problem)是指该计算图上的梯度也会因为
而变化。梯度消失使得我们难以知道参数朝哪个方向移动能够改进代价函,而梯度爆炸会使得学习不稳定。之前描述得促使我们使用梯度截断的悬崖结构辨识梯度爆炸现象的一个例子。
循环网络在各时间步上使用相同的矩阵W,而前馈网络并没有。所以即使使用非常深层的前馈网络,也能很大程度上有效避免梯度消失于爆炸问题。
大多数优化算法的先决条件都是我们知道精确的梯度或是Hessian矩阵。在实践中,通常这些量会有噪声,甚至是有偏估计。几乎每一个深度学习算法都需要机遇采样的估计,至少使用训练样本的小批量来计算梯度。
其它情况下,我们希望最小化的目标函数实际上是难以处理的。当目标函数不可解时,通常其梯度也是难以处理的。在这种情况下,只能近似梯度。这些问题主要出现在一些高级模型中。例如,对比散度是用来近似玻尔兹曼机中难以处理的对数似然梯度的一种技术。
各种神经网络优化算法的设计都考虑到了梯度估计的缺陷,我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。
大部分训练运行时间取决于到达解决方案的轨迹长度。学习轨迹将花费大量的时间探寻一个围绕山形结构的宽弧。
大多数优化研究的难点集中于训练是否找到了全局最小点、局部极小点或是鞍点,但在实践中,神经网络不会到达任何一种临界点。神经网络通常不会到达梯度很小的区域,甚至这些临界点都不一定存在。
许多现有研究方法在求解具有困难全局的结构的问题时,旨在寻求良好的初始点,而不是开发非局部范围更新的算法。
神经网络设计的任何优化算法都有性能限制。
随机梯度下降
随机梯度下降是非常受欢迎的优化方法,但是其学习过程有时会很慢,动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。
动量算法引入了变量v充当速度角色,代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。
nesterov动量可以解释为往标准动量方法中添加了一个校正因子。
有些优化算法本质上是非迭代的,只是求解一个解点。有些其他优化算法本质上是迭代的,但是应用于这一类的优化问题时,能在可接受的时间内收敛到可接受的解,并且与初始值无关。深度学习训练算法通常没有这两种奢侈的性质。深度学习模型的训练算法通常是迭代的,因此要求使用者是定一些开始迭代的初始点。此外,训练深度模型是一个足够困难的问题,以至于大多数算法都很大程度地受这些初始化选择的影响。初始点能够决定算法是否收敛,有些初始点十分不稳定,使得该算法会遭遇数值困难,并完全失败。当学习收敛时,初始点可以决定收敛的多快,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也可以影响泛化。
现代的初始化策略是简单的、启发式的。设定改进的初始化策略是一项困难的任务,因为神经网络优化至今还未被很好地理解。大多数初始化策略基于在神经网络初始化时实现一些很好的性质。然而,并没有很好地理解这些性质中的那些会在学习开始进行后的哪些情况下得以保持。进一步的难点是,有些初始点从优化的观点看或许是有利的,但是从泛化的观点看是不利的。我们对于初始点如何影响泛化的理解是相当原始的,几乎没有提供如何选择初始点的任何指导。
也许完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。最好初始化每个单元使其和其他单元计算不同的函数,这或许有助于保证没有输入丢失在前向传播的零空间中,没有梯度模式丢失在反向传播的零空间中。每个单元计算不同函数的目标促使了参数的随机初始化。
通常情况下,可以为每个单元的偏置设置启发式挑选的常数,仅随机初始化权重,额外的参数(例如用于编码预测条件方差的参数)通常和偏置一样设置为启发式选择的常数。
几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。
更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。也有助于避免在每层线性成分的前向或反向传播中丢失信号,矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向或反向传播中产爆炸的值。在循环网络中很大的权重也可能导致混沌(对于输出中很小的扰动非常敏感,导致确定性前向传播过程表现随机)。在一定程度上,梯度爆炸问题可以通过梯度截断来缓解(指定梯度下降不走之前设置梯度的阈值)。较大的权重也会产生使得激活函数饱和的值,导致饱和单元的梯度完全丢失。这些竞争因素决定了权重的理想初始大小。
初始化网络时,优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。诸如随机梯度下降这类对权重较小的增量更新,区域停止前在更靠近初始参数的区域(不管是由于卡在低梯度的区域,还是由于除法了基于过拟合的提前终止准则)的优化算法倾向于最终参数应接近于初始参数。在一般情况下,提前终止的梯度下降和权重衰减不同,但是提供了一个宽松的类比去考虑初始化的影响。单元间互不及哦啊胡比交互更有可能,只有在目标函数的似然项表达出对交互很强的偏好时,单元才会交互。
有些启发方式可用于选择权重的初始大小,一种初始化m个输入和n输出的全连接层的权重启发式方法是从分布
中采样权重,标准初始化:
,后一种启发式方法初始化所有的层,折衷于使其具有相同激活方差和使其具有相同梯度方差之间。
Saxe推荐初始化为随机正交矩阵,仔细挑选负责每一层非线性缩放或增益因子g。得到了用于不同类型的非线性激活函数的特定缩放因子,这种初始化方案也是启发于不含非线性的矩阵相乘序列的深度网络。在该模型下,这个初始化方案保证了达到收敛所需的训练迭代总数独立于深度。
增加缩放因子g将网络推向网络前传播时激活范数增加,反向传播时梯度范数增加的区域。正确设置缩放因子足以训练深达1000层的网络,而不需要使用正交初始化。这种方法的一个重要观点是,在前馈网络中,激活和梯度会在每一步前向传播或反向传播中增加或缩小,遵循随机游走行为。这是因为前馈网络在每一层使用了不同的权重矩阵。如果该随机游走调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失于爆炸问题。
可惜,这些初始权重的最加准则往往不会带来最加效果,可能有三种不同的原因:首先,可能使用了错误的标准,它实际上不利于保持整个网络信号的范数,其次,初始化时强加的性质可能在学习开始进行后不能报纸,最后,该标准可能成功提高了优化速度,但意外地增大了泛化误差。实践中,通常需要需要将权重范围视为超参数,其最优值大致接近,但并不完全等于理论预测。
数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,会使得层很大时每个单一权重会变得极其小。一种稀疏初始化的替代方案,每个单元初始化为恰好了k个非0权重,这个想法保持该单元输出的总数量独立于输入数目m,而不是单一权重元素的大小随m缩小。稀疏初始化有助于实现单元之间在初始化时更具多样性。但是获得较大取值的权重也同时增加了很强的先验,因为梯度下降需要很长时间缩小不正确的大值,这个初始化方案可能会导致某些单元出问题,例如maxout单元有几个过滤器,互相之间必须仔细调整。
如果计算资源允许,将每层权重的初始数值范围设为超参数通常是好主意,使用超参数搜索算法,如随机搜索,挑选这些数值范围,是否选择使用密集或稀疏初始化也可以设为一个超参数。作为替代,我们可以手动搜索最优初始范围。我们可以手动搜索最优初始范围,一个好的挑选初始数值范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差,如果权重太小,那么激活值在小批量上前向传播于网络时,激活之的幅度会缩小,通过重复识别具有小的不可接受的激活值得第一层,并提高其权重,最终有可能得到一个初始激活全部合理的网络。如果学习在这点上仍然很慢,观测梯度的幅度或标准差可能也会有所帮助。这个过程原则上是自动的,且通常计算量低于验证集误差的超参数优化,因为它是基于初始模型在单批数据上的行为反馈,而不是在验证集上训练模型的反馈。
设置偏置的方法必须和设置权重的方法协调,设置偏置为0通常在大多数权重初始化方案中是可行的。存在一些我们可能设置偏置为非0值的情况:
另一种常见类型的参数是方差或者精确度。通常我们能安全地初始化方差或精确度参数为1,另一种方法假设初始权重足够接近0,设置偏置可以忽略权重的影响,然后设定偏置以产生输出的正确边缘均值,并将方差参数设置为训练集输出的边缘方差。
还可能使用机器学习初始化模型参数,另一个常用策略是使用相同的输入数据集,用无监督模型训练出来的参数来初始化监督模型,也可以在相关问题上使用监督训练。即使是在一个不相关任务上运行监督训练,有时也能得到一个比随机初始化具有更快收敛率的初始值。这些初始化策略有些能够得到更快的收敛率和更好的泛化误差,因为它们正确编码了模型初始参数的分布信息。其他策略显然效果不错的原因主要在于它们设置参数为争取的数值范围,或者是设置不同单元计算互相不同的函数。
Delta-bar-delta算法是一个早期的在训练时使用模型参数各自学习率的启发式方法,该方法基于一个简单的想法,如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率减小。当然这种方法只能应用于全批量优化中。
有一些增量(或者基于小批量)的算法来自适应模型参数的学习率。
AdaGard独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降,净效果是在参数空间中更平缓的倾斜方向会取得更大的进步。
但是对于训练神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。
AdaGrad算法描述如下:
输入:全局学习率
,初始参数
,小常数
,为了数值稳定大约设为
初始化梯度累积变量
while没有达到停止准则 do
从训练集中采包含m个样本
的小批量,对应目标为
计算梯度
累积平方梯度
计算更新
(逐元素地应用除和求平方根)
应用更新
end while
RMSProp算法修改AdaGard以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。
AdaGrad旨在应用于凸问题时快速收敛、当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终达到一个局部是凸碗的区域。AdaGrad根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构之前就变得太小了。
RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗装结构后快速收敛,就像一个初始化于该碗装结构的AdaGrad算法实例。
RMSProp算法描述:
输入:全局学习率
,衰减速率
,初始参数
,小常数
,通常设为
用于被小数整除时的数值稳定
初始化累积变量
while 没有达到停止准则 do
从训练集中采包含m个样本
的小批量,对应目标为
计算梯度:
累积平方梯度:
计算参数更新:
(
逐元素应用)
应用更新:
end while
使用Nesterov动量的RMSProp算法描述:
输入:全局学习率
,衰减速率
,动量系数
,初始参数
,初始参数
初始化累积变量
while没有达到停止准则 do
从训练集中采包含m个样本
的小批量,对应目标为
计算临时更新:
计算梯度:
累积梯度:
计算梯度更新:
(
逐元素应用)
应用更新:
end while
RMSProp已被证明是一种有效且实用的深度神经网络优化算法。
Adam,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次,Adam包括偏置修正,修正从原点初始化一阶矩(动量项)和(非中心的)二阶矩的估计。Adam通常被认为对超参数的选择相当鲁棒。
Adam算法描述:
输入:步长
(建议默认为0.001),矩估计的指数衰减速率
,
均在区间[0,1)内。建议默认为:(分别为0.9和0.999),用于数值稳定的小常数
,建议默认为
,初始参数
初始化一阶和二阶矩变量
初始化时间步
while 没有达到停止准则 do
从训练集中采包含m个样本
的小批量,对应目标为
计算梯度:
更新有偏一阶矩估计:
更新二阶有偏矩估计:
修正一阶矩的偏差:
修正二阶矩的偏差:
计算更新:
应用更新:
end while
牛顿法
共轭梯度
BFGS
许多优化技术并非真正的算法,而是一般化的模板,可以特定地产生算法,或是并入到很多不同算法中。
批标准化是优化深度神经网络中最激动人心的最新创新注意,实际上它并不是一个优化算法,而是一个自适应的重参数化的方向,试图解决训练非常深的模型的困难。
非常深的模型会涉及多个函数或层组合,在其他层不变的假设下,梯度用于如何更新每一个参数,在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。
批标准化提出了一种几乎可以重参数化所有深度网络的优雅方法,重参数化显著减少了多层之间协调更新的问题,批标准化可应用于网络的任何输入层或隐藏层。设H施需要标准化的某层的小批量激活函数,排布为设计矩阵,每个样本的激活出现在矩阵的每一行中。为了标准化H,我们将其替换为
其中
是包含每个单元均值的向量,
是包含每个单元标准差的向量。此处的算术是基于广播向量
和
应用于矩阵H的每一行。在每一行内,运算是逐元素的,因此
标准化为减去
,在除以
。网络的其余部分操作
的方式和原网络操作H的方式一样。
在训练阶段
,
,其中
是个很小的正值,比如
,以强制避免遇到
的梯度在z=0处未定义的问题。至关重要的是,反向传播这些操作,来计算均值和标准差,并应用它们于标准化H,这意味着,梯度不会再简单地增加
的标准差或均值;标准化操作会除掉这一操作的影响,归零其在梯度中的元素。这是批标准化的一个重大创新,以前的方法添加代价函数的惩罚,以鼓励单元标准化激活统计量,或是在每个梯度下降步骤之后重新标准化单元统计量。前者通常会导致不完全的标准化,后者通常会显著消耗时间,因为学习算法会反复改变均值和方差,而标准化步骤会贩毒抵消这种变化。批标准化重参数化模型,以使一些单元总是被定义标准化,巧妙回避了这两个问题。
在测试阶段,
和
可以被替换为训练阶段收集的运行均值,这使得模型可以对单一样本评估,而无需使用定义于整个小批量的
和
。
批标准化显著地使得模型更容易学习。
卷积网络在特征映射中每个空间位置同样地标准化
和
是很重要的,能使特征的统计量在不同空间位置保持相同。
在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。如果我们相对与某个单一变量
最小化f(x),然后相对于另一个变量
等等,反复循环所有的变量,我们会保证达到局部极小值,这种做法被称为坐标下降(coordinate descent),因为一次优化一个坐标。更一般的,块坐标下降,是指对于某个子集的变量同时最小化。
Polyak平均会平均优化算法在参数空间访问轨迹中的几个点。如果t此迭代梯度下降访问了点
,那么平均算法的输出是
。在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好,基本想法是优化算法可能会来回穿过山谷好几次而没有经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。
在非凸问题中,优化的轨迹路径可以非常复杂,并且经过了许多不同的区域。当Polyak平均与非凸问题时,通常会使用指数衰减计算平均值。
在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练。
贪心算法将问题分解成许多个部分,然后独立地在每个部分求解最优值。结合各个最佳的部分并不能保证得到一个最佳的完整解。然而,贪心算法计算上比求解最优联合算法高效的多,并且贪心算法的解在不是最优的情况下,往往也是可以接受的。贪心算法也可以接受一个精调阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。
贪心监督预训练
贪心监督预训练有助于更好地知道深层结构的中间层学习。一般情况下,预训练对于优化和泛化都是有帮助的。
改进优化的最好方法并不总是改进优化算法,相反,深度模型中的优化的许多改进来自设计易于优化的模型。
选择一族容易优化的模型比使用一个强大的优化算法更重要。
现代神经网络的设计选择体现在层之间的线性变换。现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。
延拓法(continuation method)是一族通过挑选初始点使优化更容易的方法,以确保优化花费大部分时间在表现良好的空间。
延拓法引入的简化目标函数能够消除平坦区域,减少梯度估计方差。
课程学习或塑造,是基于规划学习过程的想法,首先学习简单的概念,然后逐步学习依赖于这些简化概念的复杂概念。