1、学习和纯优化有什么不同
在大多数机器学习问题中,我们关注某些性能度量,其定义于测试集上并且可能是不可解的。因此,我们只是间接地优化。我们希望通过降低代价函数来提高 。这一点与纯优化不同,纯优化最小化目标本身。
通常,我们希望最小化取自数据生成分布的期望:
1.1、经验风险最小化
机器学习算法的目标是降低上式所示的期望泛化误差。这个数据量被称为风险(risk)。在这里,我们强调该期望取自真实的潜在分布。如果我们知道了真实分布,那么最小化风险变成了一个可以被优化算法解决的优化问题。
然而,我们遇到的机器学习问题,通常不知道,只知道训练集中的样本。将机器学习问题转化回一个优化问题的最简单方法是最小化训练集上的期望损失。这意味着用训练集上的经验分布替代真实分布。现在,我们将最小化经验风险(empirical risk):
其中表示训练样本的数目。
基于最小化这种平均训练误差的训练过程被称为经验风险最小化(empirical risk minimization)。在这种情况下,机器学习仍然和传统的直接优化很相似。我们并不直接最优化风险,而是最优化经验风险,希望也能够降低风险。
然而,经验风险最小化很容易导致过拟合。高容量的模型会简单地记住训练集。在很多情况下,经验风险最小化并非真的可行。最有效的现代优化算法是基于梯度下降的,但是很多有用的损失函数,如 0 − 1 损失,没有有效的导数。这两个问题说明,在深度学习中我们很少使用经验风险最小化。反之,我们会使用一个稍有不同的方法,我们真正优化的目标会更加不同于我们希望优化的目标。
1.2、代理损失函数和提前终止
有时,我们真正关心的损失函数(比如分类误差)并不能被高效地优化。例如,即使对于线性分类器而言,精确地最小化 0 − 1 损失通常是不可解的。在这种情况下,我们通常会优化代理损失函数(surrogate loss function)。
代理损失函数作为原目标的代理,还具备一些优点。例如,正确类别的负对数似然通常用作 0 − 1 损失的替代。负对数似然允许模型估计给定样本的类别的条件概率,如果该模型效果好,那么它能够输出期望最小分类误差所对应的类别。
在某些情况下,代理损失函数比原函数学到的更多。例如,使用对数似然替代函数时,在训练集上的 0 − 1 损失达到 0 之后,测试集上的 0 − 1 损失还能持续下降很长一段时间。这是因为即使 0 − 1 损失期望是零时,我们还能拉开不同类别的距离改进分类器的鲁棒性,获得一个更强壮的、更值得信赖的分类器,从而,相对于简单地最小化训练集上的平均 0 − 1 损失,它能够从训练数据中抽取更多信息。
一般的优化和我们用于训练算法的优化有一个重要不同:训练算法通常不会停止在局部极小点。反之,机器学习通常优化代理损失函数,但是在基于提前终止的收敛条件满足时停止。通常,提前终止使用真实潜在损失函数,如验证集上的 0 − 1 损失,并设计为在过拟合发生之前终止。与纯优化不同的是,提前终止时代理损失函数仍然有较大的导数,而纯优化终止时导数较小。
1.3、批量算法和小批量算法
机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。
优化算法用到的目标函数J 中的大多数属性也是训练集上的期望。例如,最常用的属性是梯度:
准确计算这个期望的计算代价非常大,因为我们需要在整个数据集上的每个样本上评估模型。在实践中,我们可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。
回想一下,样本均值的标准差是,其中是样本值真实的标准差。分母表明使用更多样本来估计梯度的方法的回报是低于线性的。比较两个假想的梯度计算,一个基于100 个样本,另一个基于10000个样本。后者需要的计算量是前者的100 倍,但却只降低了10 倍的均值标准差。如果能够快速地计算出梯度估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快(就总的计算量而言,而不是指更新次数)。
另一个促使我们从小数目样本中获得梯度的统计估计的动机是训练集的冗余。在最坏的情况下,训练集中所有的个样本都是彼此相同的拷贝。基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来的做法少花了倍时间。实践中,我们不太可能真的遇到这种情况,但我们可能会发现大量样本都对梯度做出了非常相似的贡献。
使用整个训练集的优化算法被称为批量(batch)梯度算法,因为它们会在一个大批量中同时处理所有样本。每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(on-line)算法。大多数用于深度学习的算法介于以上两者之间,使用一个以上,而又不是全部的训练样本。传统上,这些会被称为小批量(minibatch)方法。
小批量的大小通常由以下几个因素决定:
更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。
极小批量通常难以充分利用多核架构。这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。
如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会正比。对于很多硬件设施,这是批量大小的限制因素。
在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用 GPU 时,通常使用 2 的幂数作为批量大小可以获得更少的运行时间。一般,2 的幂数的取值范围是 32 到 256,16 有时在尝试大模型时使用。
可能是由于小批量在学习过程中加入了噪声,它们会有一些正则化效果(Wilson and Martinez, 2003)。泛化误差通常在批量大小为1时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤,所以会导致总的运行时间非常大。
小批量是随机抽取的这点也很重要。从一组样本中计算出梯度期望的无偏估计要求这些样本是独立的。我们也希望两个连续的梯度估计是互相独立的,因此两个连续的小批量样本也应该是彼此独立的。
实践中通常将样本顺序打乱一次,然后按照这个顺序存储起来就足够了。之后训练模型时会用到的一组组小批量连续样本是固定的,每个独立的模型每次遍历训练数据时都会重复使用这个顺序。然而,这种偏离真实随机采样的方法并没有很严重的有害影响。不以某种方式打乱样本顺序才会极大地降低算法的性能。
小批量随机梯度下降的一个动机是,只要没有重复使用样本,它将遵循着真实泛化误差的梯度。很多小批量随机梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。第一次遍历时,每个小批量样本都用来计算真实泛化误差的无偏估计。第二次遍历时,估计将会是有偏的,因为它重新抽取了已经用过的样本,而不是从和原先样本相同的数据生成分布中获取新的无偏的样本。但是,额外的遍历更新当然会由于减小训练误差而得到足够的好处,以抵消其带来的训练误差和测试误差间差距的增加。
随着数据集的规模迅速增长,超越了计算能力的增速,机器学习应用每个样本只使用一次的情况变得越来越常见,甚至是不完整地使用训练集。在使用一个非常大的训练集时,过拟合不再是问题,而欠拟合和计算效率变成了主要的顾虑。
2、神经网络优化中的挑战
2.1、病态
在优化凸函数时,会遇到一些挑战。这其中最突出的是 Hessian 矩阵的病态。这是数值优化、凸优化或其他形式的优化中普遍存在的问题。
在深度学习背景下,我们遇到的大多数函数的Hessian几乎处处都是对称的。因为 Hessian 矩阵是实对称的,我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向上的二阶导数可以写成。当是的一个特征向量时,这个方向的二阶导数就是对应的特征值。对于其他的方向,方向二阶导数是所有特征值的加权平均,权重在 0 和 1 之间,且与夹角越小的特征向量的权重越大。最大特征值确定最大二阶导数,最小特征值确定最小二阶导数。我们可以通过(方向)二阶导数预期一个梯度下降步骤能表现得多好。我们在当前点处作函数的近似二阶泰勒级数:
其中是梯度,是点的Hessian。如果我们使用学习率,那么新的点将会是。代入上述的近似,可得:
其中有 3 项:函数的原始值、函数斜率导致的预期改善、函数曲率导致的校正。当最后一项太大时,梯度下降实际上是可能向上移动的。
当超过时,梯度的病态会成为问题。判断病态是否不利于神经网络训练任务,我们可以监测平方梯度范数和。在很多情况中,梯度范数不会在训练过程中显著缩小,但是的增长会超过一个数量级。其结果是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。
2.2、局部极小值
对于非凸函数时,如神经网络,有可能会存在多个局部极小值。事实上,几乎所有的深度模型基本上都会有非常多的局部极小值。然而,我们会发现这并不是主要问题。
由于模型可辨识性(model identifiability)问题,神经网络和任意具有多个等效参数化潜变量的模型都会具有多个局部极小值。如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨认的。带有潜变量的模型通常是不可辨认的,因为通过相互交换潜变量我们能得到等价的模型。例如,考虑神经网络的第一层,我们可以交换单元 i 和单元 j 的传入权重向量、传出权重向量而得到等价的模型。如果神经网络有层,每层有个单元,那么会有种排列隐藏单元的方式。这种不可辨认性被称为权重空间对称性(weight space symmetry)。
除了权重空间对称性,很多神经网络还有其他导致不可辨认的原因。例如,在任意整流线性网络或者 maxout 网络中,我们可以将传入权重和偏置扩大倍,然后将传出权重扩大倍,而保持模型等价。
这些模型可辨识性问题意味着神经网络代价函数具有非常多、甚至不可数无限多的局部极小值。然而,所有这些由于不可辨识性问题而产生的局部极小值都有相同的代价函数值。因此,这些局部极小值并非是非凸所带来的问题。
如果局部极小值相比全局最小点拥有很大的代价,局部极小值会带来很大的隐患。我们可以构建没有隐藏单元的小规模神经网络,其局部极小值的代价比全局最小点的代价大很多 (Sontag and Sussman, 1989; Brady et al., 1989; Gori and Tesi,1992)。如果具有很大代价的局部极小值是常见的,那么这将给基于梯度的优化算法带来极大的问题。
对于实际中感兴趣的网络,是否存在大量代价很高的局部极小值,优化算法是否会碰到这些局部极小值,都是尚未解决的公开问题。学者们现在猜想,对于足够大的神经网络而言,大部分局部极小值都具有很小的代价函数,我们能不能找到真正的全局最小点并不重要,而是需要在参数空间中找到一个代价很小(但不是最小)的点。
2.3、高原、鞍点和其他平坦区域
对于很多高维非凸函数而言,局部极小值(以及极大值)事实上都远少于另一类梯度为零的点:鞍点。鞍点附近的某些点比鞍点有更大的代价,而其他点则有更小的代价。在鞍点处,Hessian 矩阵同时具有正负特征值。位于正特征值对应的特征向量方向的点比鞍点有更大的代价,反之,位于负特征值对应的特征向量方向的点有更小的代价。我们可以将鞍点视为代价函数某个横截面上的局部极小点,同时也可以视为代价函数某个横截面上的局部极大点。
多类随机函数表现出以下性质:低维空间中,局部极小值很普遍。在更高维空间中,局部极小值很罕见,而鞍点则很常见。对于这类函数而言,鞍点和局部极小值的数目比率的期望随指数级增长。我们可以从直觉上理解这种现象——Hessian矩阵在局部极小点处只有正特征值。而在鞍点处,Hessian矩阵则同时具有正负特征值。试想一下,每个特征值的正负号由抛硬币决定。在一维情况下,很容易抛硬币得到正面朝上一次而获取局部极小点。在维空间中,要抛掷次硬币都正面朝上的难度是指数级的。
鞍点激增对于训练算法来说有哪些影响呢?对于只使用梯度信息的一阶优化算法而言,目前情况还不清楚。鞍点附近的梯度通常会非常小。另一方面,实验中梯度下降似乎可以在许多情况下逃离鞍点。
2.4、悬崖和梯度爆炸
多层神经网络通常存在像悬崖一样的斜率较大区域,如图所示。这是由于几个较大的权重相乘导致的。遇到斜率极大的悬崖结构时,梯度更新会很大程度地改变参数值,通常会完全跳过这类悬崖结构。
不管我们是从上还是从下接近悬崖,情况都很糟糕,但幸运的是我们可以用使用启发式梯度截断(gradient clipping)来避免其严重的后果。其基本想法源自梯度并没有指明最佳步长,只说明了在无限小区域内的最佳方向。当传统的梯度下降算法提议更新很大一步时,启发式梯度截断会干涉来减小步长,从而使其不太可能走出梯度近似为最陡下降方向的悬崖区域。
2.5、长期依赖
当计算图变得极深时,神经网络优化算法会面临的另外一个难题就是长期依赖问题——由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得极其困难。
假设某个计算图中包含一条反复与矩阵相乘的路径。则步后,相当于乘以。假设有特征值分解。在这种简单的情况下,很容易看出:
当特征值不在1附近时,若在量级上大于1则会爆炸;若小于1时则会消失。梯度消失与爆炸问题(vanishing and exploding gradient problem)是指该计算图上的梯度也会因为大幅度变化。梯度消失使得我们难以知道参数朝哪个方向移动能够改进代价函数,而梯度爆炸会使得学习不稳定。之前描述的促使我们使用梯度截断的悬崖结构便是梯度爆炸现象的一个例子。
2.6、非精确梯度
大多数优化算法的先决条件都是我们知道精确的梯度或是 Hessian 矩阵。在实践中,通常这些量会有噪声,甚至是有偏的估计。几乎每一个深度学习算法都需要基于采样的估计,至少使用训练样本的小批量来计算梯度。
各种神经网络优化算法的设计都考虑到了梯度估计的缺陷。我们可以选择比真实损失函数更容易估计的代理损失函数来避免这个问题。
2.7、局部和全局结构间的弱对应
迄今为止,我们讨论的许多问题都是关于损失函数在单个点的性质——若 是当前点的病态条件,或者在悬崖中,或者是一个下降方向不明显的鞍点,那么会很难更新当前步。
如果该方向在局部改进很大,但并没有指向代价低得多的遥远区域,那么我们有可能在单点处克服以上所有困难,但仍然表现不佳。
大多数优化研究的难点集中于训练是否找到了全局最小点、局部极小点或是鞍点,但在实践中神经网络不会到达任何一种临界点。神经网络通常不会到达梯度很小的区域。甚至,这些临界点不一定存在。
许多现有研究方法在求解具有困难全局结构的问题时,旨在寻求良好的初始点,而不是开发非局部范围更新的算法。如果存在一个区域,我们遵循局部下降便能合理地直接到达某个解,并且我们能够在该良好区域上初始化学习,那么这些问题都可以避免。最终的观点还是建议在传统优化算法上研究怎样选择更佳的初始化点,以此来实现目标更切实可行。
2.8、优化的理论限制
一些理论结果表明,我们为神经网络设计的任何优化算法都有性能限制 (Blum and Rivest, 1992; Judd, 1989; Wolpert and MacReady, 1997)。通常这些结果不影响神经网络在实践中的应用。
在神经网络训练中,我们通常不关注某个函数的精确极小点,而只关注将其值下降到足够小以获得一个良好的泛化误差。对优化算法是否能完成此目标进行理论分析是非常困难的。因此,研究优化算法更现实的性能上界仍然是学术界的一个重要目标。
3、基本算法
3.1、随机梯度下降
随机梯度下降(SGD)及其变种很可能是一般机器学习中应用最多的优化算法,特别是在深度学习中。按照数据生成分布抽取个小批量(独立同分布的)样本,通过计算它们梯度均值,我们可以得到梯度的无偏估计。
SGD 算法中的一个关键参数是学习率。因为 SGD 中梯度估计引入的噪声源(个训练样本的随机采样)并不会在极小点处消失,所以在实践中,有必要随着时间的推移逐渐降低学习率,因此我们将第步迭代的学习率记作(相比之下,当我们使用批量梯度下降到达极小点时,整个代价函数的真实梯度会变得很小,之后为 0,因此批量梯度下降可以使用固定的学习率)保证 SGD 收敛的一个充分条件是:
实践中,一般会线性衰减学习率直到第次迭代:
其中。在步迭代之后,一般使 ϵ 保持常数。
使用线性策略时,需要选择的参数为。通常被设为需要反复遍历训练集几百次的迭代次数。通常应设为大约的1%。主要问题是如何设置。若太大,学习曲线将会剧烈振荡,代价函数值通常会明显增加。温和的振荡是良好的,容易在训练随机代价函数(例如使用Dropout的代价函数)时出现。如果学习率太小,那么学习过程会很缓慢。如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。通常,就总训练时间和最终代价值而言,最优初始学习率会高于大约迭代100次左右后达到最佳效果的学习率。因此,通常最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率,但又不能太大导致严重的震荡。
SGD 及相关的小批量亦或更广义的基于梯度优化的在线学习算法,一个重要的性质是每一步更新的计算时间不依赖训练样本数目的多寡。即使训练样本数目非常大时,它们也能收敛。对于足够大的数据集,SGD可能会在处理整个训练集之前就收敛到最终测试集误差的某个固定容差范围内。
3.2、动量
虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法 (Polyak, 1964) 旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。
从形式上看,动量算法引入了变量充当速度角色——它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量(momentum)来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量也可以看作是粒子的动量。超参数决定了之前梯度的贡献衰减得有多快。更新规则如下:
速度累积了梯度元素,相对于 越大,之前梯度对现在方向的影响也越大。带动量的SGD算法如下:
如果动量算法总是观测到梯度,那么它会在方向上不停加速,直到达到最终速度,由得出,步长大小为:
因此将动量的超参数视为有助于理解。例如对应着最大速度10倍于梯度下降算法。在实践中,的一般取值为0.5,0.9 和 0.99。和学习率一样,也会随着时间不断调整。一般初始值是一个较小的值,随后会慢慢变大。随着时间推移调整没有收缩重要。
我们可以将动量算法视为模拟连续时间下牛顿动力学下的粒子。这种物理类比有助于直觉上理解动量和梯度下降算法如何表现。如果代价函数的梯度是唯一的力,那么粒子可能永远不会停下来。想象一下,假设理想情况下冰面没有摩擦,一个冰球从山谷一端下滑,上升到另一端,永远来回振荡。要解决这个问题,我们添加一个正比于的力。在物理术语中,此力对应于粘性阻力,就像粒子必须通过一个抵抗介质,如糖浆。这会导致粒子随着时间推移逐渐失去能量,最终收敛到局部极小点。
3.3、Nesterov 动量
受 Nesterov 加速梯度算法 (Nesterov, 1983, 2004) 启发,Sutskever et al. (2013)提出了动量算法的一个变种。这种情况的更新规则如下:
Nesterov 动量和标准动量之间的区别体现在梯度计算上。Nesterov 动量中,梯度计算在施加当前速度之后。因此,Nesterov 动量可以解释为往标准动量方法中添加了一个校正因子。
4、参数初始化策略
深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。训练深度模型是一个足够困难的问题,以致于大多数算法都很大程度地受到初始化选择的影响。当学习收敛时,初始点可以决定学习收敛得多快,以及是否收敛到一个代价高或低的点。
我们对于初始点如何影响泛化的理解是相当原始的,几乎没有提供如何选择初始点的任何指导。也许完全确知的唯一特性是初始参数需要在不同单元间 ‘‘破坏对称性’’。如果具有相同激活函数的两个隐藏单元连接到相同的输入,那么这些单元必须具有不同的初始参数。如果它们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。
我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。高斯或均匀分布的选择似乎不会有很大的差别,但也没有被详尽地研究。然而,初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。
更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元,也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。如果初始权重太大,那么会在前向传播或反向传播中产生爆炸的值。
关于如何初始化网络,正则化和优化有着非常不同的观点。优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。
有些启发式方法可用于选择权重的初始大小。一种初始化个输入和输出的全连接层的权重的启发式方法是从分布中采样权重,而Glorot and Bengio (2010) 建议使用标准初始化(normalized initialization):
这种启发式方法初始化所有的层,折衷于使其具有相同激活方差和使其具有相同梯度方差之间。
Saxe et al. (2013)推荐初始化为随机正交矩阵,仔细挑选负责每一层非线性缩放或增益 (gain) 因子。他们得到了用于不同类型的非线性激活函数的特定缩放因子。
Sussillo (2014) 表明,正确设置缩放因子足以训练深达1000层的网络,而不需要使用正交初始化。这种方法的一个重要观点是,在前馈网络中,激活和梯度会在每一步前向传播或反向传播中增加或缩小,遵循随机游走行为。这是因为前馈网络在每一层使用了不同的权重矩阵。如果该随机游走调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失与爆炸问题。
数值范围准则的一个缺点是,设置所有的初始权重具有相同的标准差,例如,会使得层很大时每个单一权重会变得极其小。Martensm(2010) 提出了一种被称为稀疏初始化(sparse initialization)的替代方案,每个单元初始化为恰好有个非零权重。这个想法保持该单元输入的总数量独立于输入数目,而不使单一权重元素的大小随缩小。稀疏初始化有助于实现单元之间在初始化时更具多样性。但是,获得较大取值的权重也同时被加了很强的先验。
计算资源允许的话,将每层权重的初始数值范围设为超参数通常是个好主意,使用超参数搜索算法,如随机搜索,挑选这些数值范围。
设置偏置的方法必须和设置权重的方法协调。设置偏置为零通常在大多数权重初始化方案中是可行的。存在一些我们可能设置偏置为非零值的情况:
如果偏置是作为输出单元,那么初始化偏置以获取正确的输出边缘统计通常是有利的。
有时,我们可能想要选择偏置以避免初始化引起太大饱和。例如,我们可能会将 ReLU 的隐藏单元设为 0.1 而非 0,以避免 ReLU 在初始化时饱和。
有时,一个单元会控制其他单元能否参与到等式中。在这种情况下,我们有一个单元输出,另一个单元,那么我们可以将视作门,以决定还是。在这种情形下,我们希望设置偏置,使得在初始化的大多数情况下。否则,没有机会学习。
5、自适应学习率算法
神经网络研究员早就意识到学习率肯定是难以设置的超参数之一,因为它对模型的性能有显著的影响。动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数。如果我们相信方向敏感度在某种程度是轴对齐的,那么每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。
Delta-bar-delta算法 (Jacobs,1988) 是一个早期的在训练时适应模型参数各自学习率的启发式方法。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应减小。当然,这种方法只能应用于全批量优化中。
5.1、AdaGrad
AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根 (Duchi et al., 2011)。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
5.2、RMSProp
RMSProp算法 (Hinton, 2012) 修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛。
相比于AdaGrad,使用移动平均引入了一个新的超参数,用来控制移动平均的长度范围。经验上,RMSProp已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
5.3、Adam
Adam(Kingma and Ba, 2014)是另一种学习率自适应的优化算法。“Adam’’ 这个名字派生自短语 “adaptive moments’’。早期算法背景下,它被看作结合RMSProp和具有一些重要区别的动量的变种。在Adam中,动量直接并入梯度一阶矩(指数加权)的估计。Adam 通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
目前,最流行并且使用很高的优化算法包括 SGD、具动量的 SGD、MSProp、具动量的 RMSProp、AdaDelta 和 Adam。此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)。
6、二阶近似方法
为表述简单起见,我们只考察目标函数为经验风险:
6.1、牛顿法
牛顿法是基于二阶泰勒级数展开在某点附近来近似的优化方法,其忽略了高阶导数:
其中是相对于的Hessian矩阵在处的估计。如果我们再求解这个函数的临界点(令上式对求导为0),我们将得到牛顿参数更新规则:
牛顿法只适用于 Hessian 矩阵是正定的情况。在深度学习中,目标函数的表面通常非凸(有很多特征),如鞍点。因此使用牛顿法是有问题的。如果 Hessian 矩阵的特征值并不都是正的,例如,靠近鞍点处,牛顿法实际上会导致更新朝错误的方向移动。这种情况可以通过正则化 Hessian 矩阵来避免。常用的正则化策略包括在 Hessian 矩阵对角线上增加常数。正则化更新变为:
在曲率方向更极端的情况下,的值必须足够大,以抵消负特征值。然而,如果持续增加,Hessian 矩阵会变得由对角矩阵主导,通过牛顿法所选择的方向会收敛到普通梯度除以。当很强的负曲率存在时,可能需要特别大,以致于牛顿法比选择合适学习率的梯度下降的步长更小。
除了目标函数的某些特征带来的挑战,如鞍点,牛顿法用于训练大型神经网络还受限于其显著的计算负担。Hessian 矩阵中元素数目是参数数量的平方,因此,如果参数数目为(甚至是在非常小的神经网络中也可能是百万级别),牛顿法需要计算矩阵的逆,计算复杂度为。另外,由于参数将每次更新都会改变,每次训练迭代都需要计算 Hessian 矩阵的逆。其结果是,只有参数很少的网络才能在实际中用牛顿法训练。
6.2、共轭梯度
共轭梯度是一种通过迭代下降的 共轭方向(conjugate directions)以有效避免 Hessian 矩阵求逆计算的方法。
这种方法的灵感来自于对最速下降方法弱点的仔细研究,其中线搜索迭代地用于与梯度相关的方向上(根据几个计算,并选择其中能产生最小目标函数值的。这种策略被称为线搜索)。实际上,每一个由梯度给定的线搜索方向,都保证正交于上一个线搜索方向(假设上一个搜索方向是。在极小值处,线搜索终止,方向处的方向导数为零:。因为该点的梯度定义了当前的搜索方向,将不会贡献于方向。因此方向正交于)。这产生了锯齿形的过程:
通过遵循每次线搜索结束时的梯度,我们在某种程度上撤销了在之前线搜索的方向上取得的进展。在共轭梯度法中,我们寻求一个和先前线搜索方向共轭(conjugate)的搜索方向,即它不会撤销该方向上的进展。在训练迭代时,下一步的搜索方向的形式如下:
系数的大小控制我们应沿方向加回多少到当前搜索方向上。
如果,其中是 Hessian 矩阵,则两个方向和被称为共轭的。两种用于计算的流行方法是:
6.3、BFGS
Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法具有牛顿法的一些优点,但没有牛顿法的计算负担。拟牛顿法所采用的方法(BFGS 是其中最突出的)是使用矩阵近似逆,迭代地低秩更新精度以更好地近似。
当Hessian逆近似更新时,下降方向为。该方向上的线搜索用于决定该方向上的步长。参数的最后更新为:
和共轭梯度法相似,BFGS算法迭代一系列线搜索,其方向含二阶信息。然而和共轭梯度不同的是,该方法的成功并不严重依赖于线搜索寻找该方向上和真正极小值很近的一点。因此,相比于共轭梯度,BFGS的优点是其花费较少的时间改进每个线搜索。在另一方面,BFGS算法必须存储Hessian逆矩阵,需要的存储空间,使BFGS不适用于大多数具有百万级参数的现代深度学习模型。
7、优化策略和元算法
许多优化技术并非真正的算法,而是一般化的模板,可以特定地产生算法,或是并入到很多不同的算法中。
7.1、批标准化
批标准化 (Ioffe and Szegedy, 2015) 是优化深度神经网络中最激动人心的最新创新之一。实际上它并不是一个优化算法,而是一个自适应的重参数化的方法,试图解决训练非常深的模型的困难。
非常深的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。
(以下摘自https://zhuanlan.zhihu.com/p/34879333)
随着训练的进行,网络中的参数也随着梯度下降在不停更新。一方面,当底层网络中参数发生微弱变化时,由于每一层中的线性变换与非线性激活映射,这些微弱变化随着网络层数的加深而被放大(类似蝴蝶效应);另一方面,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难。上述这一现象叫做Internal Covariate Shift。Internal Covariate Shift一个较规范的定义为:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程。Internal Covariate Shift会带来什么问题呢?
(1)上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低
梯度下降的过程会让每一层的参数发生变化,进而使得每一层的线性与非线性计算结果分布产生变化。后层网络就要不停地去适应这种分布变化,这个时候就会使得整个网络的学习速率过慢。
(2)网络的训练过程容易陷入梯度饱和区,减缓网络收敛速度
当我们在神经网络中采用饱和激活函数(saturated activation function)时,例如sigmoid,tanh激活函数,很容易使得模型训练陷入梯度饱和区(saturated regime)。
我们如何减缓Internal Covariate Shift?
要缓解ICS的问题,就要明白它产生的原因。ICS产生的原因是由于参数更新带来的网络中每一层输入值分布的改变,并且随着网络层数的加深而变得更加严重,因此我们可以通过固定每一层网络输入值的分布来对减缓ICS问题。
(1)白化(Whitening)
白化(Whitening)是机器学习里面常用的一种规范化数据分布的方法,主要是PCA白化与ZCA白化。白化是对输入数据分布进行变换,进而达到以下两个目的:
使得输入特征分布具有相同的均值与方差。其中PCA白化保证了所有特征分布均值为0,方差为1;而ZCA白化则保证了所有特征分布均值为0,方差相同。
去除特征之间的相关性。
通过白化操作,我们可以减缓ICS的问题,进而固定了每一层网络输入分布,加速网络训练过程的收敛(LeCun et al.,1998b;Wiesler&Ney,2011)。
(2)Batch Normalization提出
既然白化可以解决这个问题,为什么我们还要提出别的解决办法?当然是现有的方法具有一定的缺陷,白化主要有以下两个问题:
白化过程计算成本太高,并且在每一轮训练中的每一层我们都需要做如此高成本计算的白化操作。
白化过程由于改变了网络每一层的分布,因而改变了网络层中本身数据的表达能力。底层网络学习到的参数信息会被白化操作丢失掉。
为解决上面两个问题,我们的思路很简单,一方面,我们提出的normalization方法要简化计算过程;另一方面又需要经过规范化处理后让数据尽可能保留原始的表达能力。于是就有了简化+改进版的白化——Batch Normalization。
既然白化计算过程比较复杂,那我们就简化一点,比如我们可以尝试单独对每个特征进行normalizaiton就可以了,让每个特征都有均值为0,方差为1的分布就OK。
另一个问题,既然白化操作减弱了网络中每一层输入数据表达能力,那我就再加个线性变换操作,让这些数据再能够尽可能恢复本身的表达能力就好了。
图中可以看到共有8列,代表当前训练样本的batch中共有8个样本,每一行代表当前层神经元的一个节点,可以看到当前层共有4个神经元结点,即维度为4。我们可以看到,每行的数据分布都不同。
对于第一个神经元,我们求得,对第一行数据进行normalize得到新的值,同理我们可以计算出其他输入维度归一化后的值。如下图:
通过上面的变换,我们解决了第一个问题,即用更加简化的方式来对数据进行规范化,使得各层的输入每个特征的分布均值为0,方差为1。
Normalization操作我们虽然缓解了ICS问题,让每层网络的输入数据分布都变得稳定,但却导致了数据表达能力的缺失。也就是我们通过变换操作改变了原有数据的信息表达(representation ability of the network),使得底层网络学习到的参数信息丢失。
因此,BN又引入了两个可学习(learnable)的参数和。这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换,即,通过上面的步骤,我们就在一定程度上保证了输入数据的表达能力。
以上就是整个Batch Normalization在模型训练中的算法和思路。
7.2、坐标下降
在某些情况下,将一个优化问题分解成几个部分,可以更快地解决原问题。如果我们相对于某个单一变量最小化,然后相对于另一个变量,反复循环所有的变量,我们会保证到达局部极小值。这种做法被称为坐标下降(coordinate descent),因为我们一次优化一个坐标。更一般地, 块坐标下降(block coordinate descent)是指对于某个子集的变量同时最小化。术语 “坐标下降’’ 通常既指块坐标下降,也指严格的单个坐标下降。
当优化问题中的不同变量能够清楚地分成相对独立的组,或是当优化一组变量明显比优化所有变量效率更高时,坐标下降最有意义。例如,考虑代价函数:
我们可以将训练算法的输入分成两个集合:参数和。最小化关于这两者之一的任意一组变量的目标函数都是凸问题。因此,块坐标下降允许我们使用高效的凸优化算法,交替固定优化和固定优化。
7.3、Polyak 平均
Polyak平均 (Polyak and Juditsky, 1992) 会平均优化算法在参数空间访问轨迹中的几个点。如果次迭代梯度下降访问了点,那么Polyak平均算法的输出是,在某些问题中,如梯度下降应用于凸问题时,这种方法具有较强的收敛保证。当应用于神经网络时,其验证更多是启发式的,但在实践中表现良好。基本想法是,优化算法可能会来回穿过山谷好几次而没经过山谷底部附近的点。尽管两边所有位置的均值应比较接近谷底。
当应用 Polyak 平均于非凸问题时,通常会使用指数衰减计算平均值:
7.4、监督预训练
有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。有时训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。这些在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练(pretraining)。
贪心算法(greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。令人遗憾的是,结合各个最佳的部分不能保证得到一个最佳的完整解。贪心算法也可以紧接一个精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。使用贪心解初始化联合优化算法,可以极大地加速算法,并提高寻找到的解的质量。
在贪心监督预训练的原始版本 (Bengio et al., 2007c) 中,每个阶段包括一个仅涉及最终神经网络的子集层的监督学习训练任务。
贪心监督预训练的一个例子如上图所示,其中每个附加的隐藏层作为浅层监督多层感知机的一部分预训练,以先前训练的隐藏层输出作为输入。最初由Bengio et al. (2007d) 提出的假说是,其有助于更好地指导深层结构的中间层的学习。一般情况下,预训练对于优化和泛化都是有帮助的。
7.5、设计有助于优化的模型
改进优化的最好方法并不总是改进优化算法。相反,深度模型中优化的许多改进来自于设计易于优化的模型。
在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。神经网络学习在过去 30 年的大多数进步主要来自于改变模型族,而非改变优化过程。1980 年代用于训练神经网络的带动量的随机梯度下降,仍然是现代神经网络应用中的前沿算法。
具体来说,现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激活函数,和大部分定义域都有明显的梯度。特别地,创新的模型,如 LSTM,整流线性单元和 maxout 单元都比先前的模型(如基于 sigmoid 单元的深度网络)使用更多的线性函数。这些模型都具有简化优化的性质。线性函数在一个方向上一致增加,所以即使模型的输出远离正确值,也可以简单清晰地计算梯度,使其输出方向朝降低损失函数的方向移动。换言之,现代神经网络的设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。
其他的模型设计策略有助于使优化更简单。例如,层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度,因而缓解了梯度消失的问题(Srivastava et al., 2015)。
7.6、延拓法和课程学习
延拓法(continuation method)是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。延拓法背后想法是构造一系列具有相同参数的目标函数。为最小化代价函数,我们构建新的代价函数。这些代价函数的难度逐步提高,其中是最容易最小化的,是最难的,真正的代价函数驱动整个过程。当我们说比更容易时,是指在更多的空间上表现良好。随机初始化更可能落入局部下降可以成功最小化代价函数的区域,因为其良好区域更大。这系列代价函数设计为前一个解是下一个的良好初始点。因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求得真正问题的解。
尽管延拓法最初用来解决局部最小值的问题,而局部最小值已不再认为是神经网络优化中的主要问题了。幸运的是,延拓法仍然有所帮助。延拓法引入的简化目标函数能够消除平坦区域,减少梯度估计的方差,提高 Hessian 矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向与朝向全局解方向之间的对应关系。
Bengio et al. (2009) 指出被称为课程学习(curriculum learning)或者塑造(shaping)的方法可以被解释为延拓法。课程学习被证实为与人类教学方式一致 (Khan et al., 2011):教师刚开始会展示更容易、更典型的示例,然后帮助学习者在不太显然的情况下提炼决策面。