《深度学习》 第8章 深度模型中的优化

《深度学习》 第8章 深度模型中的优化

学习和纯优化有什么不同

纯优化最小化目标 J J 本身。训练深度模型的优化算法通常也会包括对机器学习目标函数的特定结构进行的特化

经验风险最小化

通常不知道真实分布 p data ( x , y ) p_{\text{data}}(x,y) ,只知道训练集上的经验分布 p ^ data ( x , y ) \hat p_{\text{data}}(x,y)

基于最小化平均训练误差的训练过程被称为经验风险最小化

代理损失函数和提前终止

有时真正关心的损失函数并不能被高效优化。代理损失函数作为原目标的代理,可能还具有一些优点,如负对数似然用在0-1损失的代替,还可以给出给定样本的类别的条件概率。

训练算法通常不会停止在局部极小点。提前终止使用真实潜在损失函数,并在过拟合发生之前终止,此时代理损失函数还有较大的导数。

批量算法和小批量算法

机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。

n n 个样本均值的标准差是 σ / n \sigma/\sqrt n ,其中 σ \sigma 是样本值真实的标准差。分母 n n 表明使用更多样本来估计梯度的方法的回报是低于线性的。如果能够快速地计算出梯度估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快(就总的计算量而言,而不是指更新次数)。

另一个促使我们从小数目样本中获得梯度的统计估计的动机是训练集的冗余。

小批量的大小通常由以下几个因素决定:

  • 更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。
  • 极小批量通常难以充分利用多核架构。这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。
  • 如果批量处理中的所有样本可以并行地处理(通常确是如此),那么内存消耗和批量大小会正比。对于很多硬件设施,这是批量大小的限制因素。
  • 在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2的幂数作为批量大小可以获得更少的运行时间。一般,2的幂数的取值范围是32到256,16有时在尝试大模型时使用。
  • 可能是由于小批量在学习过程中加入了噪声,它们会有一些正则化效果。泛化误差通常在批量大小为1时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤,所以会导致总的运行时间非常大。

不同的算法使用不同的方法从小批量中获取不同的信息。有些算法对采样误差比其他算法更敏感,这通常有两个可能原因。一个是它们使用了很难在少量样本上精确估计的信息,另一个是它们以放大采样误差的方式使用了信息。

小批量是随机抽取的这点也很重要。从一组样本中计算出梯度期望的无偏估计要求这些样本是独立的。

小批量随机梯度下降的一个有趣动机是,只要没有重复使用样本,它将遵循着真实泛化误差的梯度。第二次遍历时,估计将会是有偏的,因为它重新抽取了已经用过的样本

神经网络优化中的挑战

病态

代价函数的二阶泰勒级数展开预测梯度下降中的 ϵ g - \epsilon g 会增加
1 2 ϵ 2 g H g ϵ g g \frac 1 2 \epsilon^2g^\top H g - \epsilon g^\top g
到代价中。当 1 2 ϵ 2 g H g \frac 12 \epsilon^2 g^\top H g 超过 ϵ g g \epsilon g^\top g 时,梯度的病态会成为问题。在很多情况中,梯度范数 g g g^\top g 不会在训练过程中显著缩小,但是 g H g g^\top Hg 的增长会超过一个数量级。

局部极小值

如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨认的。由于模型可辨识性(model identifiability)问题,神经网络和任意具有多个等效参数化潜变量的模型都会具有多个局部极小值。

这些模型可辨识性问题意味着神经网络代价函数具有非常多、甚至不可数无限多的局部极小值。然而,所有这些由于不可辨识性问题而产生的局部极小值都有相同的代价函数值。因此,这些局部极小值并非是非凸所带来的问题。

多类随机函数表现出以下性质:低维空间中,局部极小值很普遍。在更高维空间中,局部极小值很罕见,而鞍点则很常见。对于这类函数 f : R n R f:\mathbb R^n \to \mathbb R 而言,鞍点和局部极小值的数目比率的期望随 n n 指数级增长。

很多随机函数一个惊人性质是,当我们到达代价较低的区间时,Hessian矩阵的特征值为正的可能性更大。这也意味着,局部极小值具有低代价的可能性比高代价要大得多。具有高代价的临界点更有可能是鞍点。具有极高代价的临界点就很可能是局部极大值了。

鞍点激增对于训练算法来说有哪些影响呢?对于只使用梯度信息的一阶优化算法而言,目前情况还不清楚。鞍点附近的梯度通常会非常小。对于牛顿法而言,鞍点显然是一个问题。牛顿法的目标是寻求梯度为零的点。如果没有适当的修改,牛顿法就会跳进一个鞍点。

悬崖和梯度爆炸

梯度截断的基本想法源自梯度并没有指明最佳步长,只说明了在无限小区域内的最佳方向。当传统的梯度下降算法提议更新很大一步时,启发式梯度截断会干涉来减少步长,从而使其不太可能走出梯度近似最陡下降方向的悬崖区域。

长期依赖

假设某个计算图中包含一条反复与矩阵 W W 相乘的路径。那么 t t 步后,相当于乘以 W t W^t 。假设 W W 有特征值分解 W = V diag ( λ ) V 1 W = V\text{diag}(\lambda)V −1 。在这种简单的情况下, 很容易看出
W t = ( V diag ( λ ) V 1 ) t = V diag ( λ ) t V 1 W^t = (V \text{diag}(\lambda)V^{-1})^t = V \text{diag}(\lambda)^tV^{-1}
当特征值 λ i \lambda _ i 不在1附近时,若在量级上大于1则会爆炸;若小于1时则会消失。

非精确梯度

在实践中,梯度或Hessian矩阵都会有噪音,甚至是有偏估计。希望最小化的目标函数实际上是难以处理的。

局部和全局结构间的弱对应

有人认为大部分训练的运行时间取决于到达解决方案的轨迹长度。

优化的理论限制

基本算法

随机梯度下降

在实践中有必要随着时间的推移逐渐降低学习率。这是因为SGD中梯度估计引入的噪声源(m个训练样本的随机采样)并不会在极小点处消失。相比之下,当我们使用批量梯度下降到达极小点时,整个代价函数的真实梯度会变得很小,之后为0。

通常,就总训练时间和最终代价值而言,最优初始学习率会高于大约迭代100次左右后达到最佳效果的学习率。因此,通常最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率,但又不能太大导致严重的震荡。

动量

动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿着该方向移动。
g 1 m θ i L ( f ( x ( i ) ; θ ) , y ( i ) ) g \gets \frac 1m \nabla_{\theta} \sum_i L(f(x^{(i)};\theta), y^{(i)})
v α v ϵ g v \gets \alpha v - \epsilon g
θ θ + v \theta \gets \theta + v
之前步长只是梯度范数乘以学习率,现在步长取决于梯度序列的大小和排列。

将动量算法的超参数视为 1 1 α \frac{1}{1-\alpha} 有助于理解, α = 0.9 \alpha = 0.9 对应这最大速度10倍于梯度下降算法。

将动量算法视为模拟连续时间下牛顿动力学下的粒子。推动粒子沿着代价函数表面下坡的方向移动的力正比于代价函数的负梯度 θ J ( θ ) -\nabla_\theta J(\theta)

另外一个力——粘性阻力 v ( t ) -v(t) ——也是必要的。粘性阻力避免了这两个问题——它足够弱,可以使梯度引起的运动直到达到最小,但又足够强,使得坡度不够时可以阻止运动。

Nesterov动量

Nesterov 动量和标准动量之间的区别体现在梯度计算上。 Nesterov 动量中,梯度计算在施加当前速度之后。因此,Nesterov 动量可以解释为往标准动量方法中添加了一个校正因子。

g 1 m θ + α v i L ( f ( x ( i ) ; θ + α v ) , y ( i ) ) g \gets \frac 1m \nabla_{\theta + \alpha v} \sum_i L(f(x^{(i)};\theta + \alpha v), y^{(i)})

参数初始化策略

也许完全确知的唯一特性是初始参数需要在不同单元间“破坏对称性”。

我们几乎总是初始化模型的权重为高斯或均匀分布中随机抽取的值。初始分布的大小确实对优化过程的结果和网络泛化能力都有很大的影响。

更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。它们也有助于避免在每层线性成分的前向或反向传播中丢失信号——矩阵中更大的值在矩阵乘法中有更大的输出。

关于如何初始化网络,正则化和优化有着非常不同的观点。优化观点建议权重应该足够大以成功传播信息,但是正则化希望其小一点。我们可以将初始化参数 θ \theta θ 0 \theta_0 类比于强置均值为 θ 0 \theta_0 的高斯先验 p ( θ ) p(\theta) 。从这个角度来看,选择 θ 0 \theta_0 接近 0 0 是有道理的。这个先验表明,单元间彼此互不交互比交互更有可能。只有在目标函数的似然项表达出对交互很强的偏好时,单元才会交互。另一方面,如果我们初始化 θ 0 \theta_0 为很大的值,那么我们的先验指定了哪些单元应互相交互,以及它们应如何交互。

初始化 m m 个输入和 n n 个输出的全连接层的权重,有人建议使用标准初始化
W i , j ( 6 m + n , 6 m + n ) W_{i,j} \sim \left(-\sqrt{\frac{6}{m+n}}, \sqrt{\frac{6}{m+n}} \right)
其折衷于使其具有相同激活方差和使其具有相同梯度方差之间

很多设计于线性模型的策略在其非线性对应中的效果也不错。

推荐初始化为随机正交矩阵,仔细挑选负责每一层非线性缩放或增益因子 g g 。他们得到了用于不同类型的非线性激活函数的特定缩放因子。

增加缩放因子 g g 将网络推向网络前向传播时激活范数增加,反向传播时梯度范数增加的区域。这种方法的一个重要观点是,在前馈网络中,激活和梯度会在每一步前向传播或反向传播中增加或缩小,遵循随机游走行为。这是因为前馈网络在每一层使用了不同的权重矩阵。如果该随机游走调整到保持范数,那么前馈网络能够很大程度地避免相同权重矩阵用于每层的梯度消失与爆炸问题

可惜,这些初始权重的最佳准则往往不会带来最佳效果。这可能有三种不同的原因。

  • 首先,我们可能使用了错误的标准——它实际上并不利于保持整个网络信号的范数。
  • 其次,初始化时强加的性质可能在学习开始进行后不能保持。
  • 最后,该标准可能成功提高了优化速度,但意外地增大了泛化误差。

在实践中,我们通常需要将权重范围视为超参数,其最优值大致接近,但并不完全等于理论预测。

稀疏初始化(sparse initialization):每个单元初始化为恰好有 k k 个非零权重。这个想法保持该单元输入的总数量独立于输入数目 m m ,而不使单一权重元素的大小随 m m 缩小。

一个好的挑选初始数值范围的经验法则是观测单个小批量数据上的激活或梯度的幅度或标准差。

设置偏置的方法必须和设置权重的方法协调。设置偏置为零通常在大多数权重初始化方案中是可行的。存在一些我们可能设置偏置为非零值的情况:

  • 如果偏置是作为输出单元,那么初始化偏置以获取正确的输出边缘统计通常是有利的。要做到这一点,我们假设初始权重足够小,该单元的输出仅由偏置决定。这说明设置偏置为应用于训练集上输出边缘统计的激活函数的逆。
  • 有时,我们可能想要选择偏置以避免初始化引起太大饱和。
  • 有时,一个单元会控制其他单元能否参与到等式中。

一个常用策略是使用相同的输入数据集,用无监督模型训练出来的参数来初始化监督模型。

自适应学习率算法

损失通常高度敏感于参数空间中的某些方向,而不敏感于其他。

Delta-bar-delta:如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应减小。当然,这种方法只能应用于全批量优化中。

AdaGrad

AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。
Δ θ ϵ δ + r + g g g \Delta \theta \gets - \frac{\epsilon}{\delta + \sqrt{r + g \odot g} } \odot g

RMSProp

RMSProp算法修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。

标准RMSProp:
Δ θ ϵ δ + [ ρ r + ( 1 ρ ) g g ] g \Delta \theta \gets - \frac{\epsilon}{\sqrt{\delta + [\rho r + (1 - \rho)g \odot g]}} \odot g

带Nesterov动量的RMSProp:

θ ~ θ + α v \tilde \theta \gets \theta + \alpha v
g 1 m θ ~ i L ( f ( x ( i ) ; θ ~ ) , y ( i ) ) g \gets \frac 1m \nabla_{\tilde \theta} \sum_i L(f(x^{(i)};\tilde \theta), y^{(i)})
r ρ r + ( 1 ρ ) g g r \gets \rho r + (1 - \rho) g \odot g
v α v ϵ r g v \gets \alpha v - \frac{\epsilon}{\sqrt{r}} \odot g
θ θ + v \theta \gets \theta + v

Adam

最好被看作结合 RMSProp 和具有一些重要区别的动量的变种。

选择正确的优化算法

二阶近似方法

简单起见,只考虑目标函数为经验风险

牛顿法

牛顿参数更新规则:
θ = θ 0 H 1 θ J ( θ 0 ) \theta^* = \theta_0 - H^{-1}\nabla_\theta J(\theta_0)

通过正则化Hessian矩阵来应对Hessian矩阵非正定问题。常用策略包括在Hessian矩阵对角线生增加常数 α \alpha
θ = θ 0 [ H ( f ( θ 0 ) ) + α I ] 1 θ J ( θ 0 ) \theta^* = \theta_0 - [H(f(\theta_0)) + \alpha I]^{-1}\nabla_\theta J(\theta_0)

牛顿法用于训练大型神经网络还受限于其显著的计算负担。

共轭梯度

共轭梯度是一种通过迭代下降的共轭方向(conjugate directions)以有效避免Hessian矩阵求逆计算的方法。

在训练迭代 t t 时,下一步的搜索方向 d t d_t 的形式如下:
d t = θ J ( θ ) + β t d t 1 d_t = \nabla_\theta J(\theta) + \beta_t d_{t-1}
其中,系数 β t \beta_t 的大小控制我们应沿方向 d t 1 d_{t−1} 加回多少到当前搜索方向上。

非线性共轭梯度

BFGS

使用矩阵 M t M_t 近似逆,迭代地低序更新精度以更好地近似 H 1 H^{-1} 。相比于共轭梯度,BFGS 的优点是其花费较少的时间改进每个线搜索。

存储受限的BFGS(L-BFGS)

优化策略和元算法

批标准化

非常深的模型会涉及多个函数或层组合。在其他层不改变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。

批标准化提出了一种几乎可以重参数化所有深度网络的优雅方法。重参数化显著减少了多层之间协调更新的问题。批标准化可应用于网络的任何输入层或隐藏层。

以前的方法添加代价函数的惩罚,以鼓励单元标准化激活统计量,或是在每个梯度下降步骤之后重新标准化单元统计量。前者通常会导致不完全的标准化,而后者通常会显著地消耗时间,因为学习算法会反复改变均值和方差而标准化步骤会反复抵消这种变化。批标准化重参数化模型,以使一些单元总是被定义标准化,巧妙地回避了这两个问题。

批标准化显著地使得模型更易学习,容易学习的代价是使得底层线性网络没有用。因为我们已经标准化了一阶和二阶统计量,但允许单元和单个单元的非线性统计量之间的关系发生变化。

通常会将批量隐藏单元激活 H H 替换为 γ H + β \gamma H'+ \beta ,而不是简单地使用标准化的 H H' 。变量 γ \gamma β \beta 是允许新变量有任意均值和标准差的学习参数。新的参数可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。

批标准化通常作用于 X W + b XW+b 获得之后,非线性函数变换之前。

坐标下降

我们相对于某个单一变量 x i x_i 最小化 f ( x ) f(x) ,然后相对于另一个变量 x j x_j 等等,反复循环所有的变量,我们会保证到达(局部)极小值。这种做法被称为坐标下降(coordinate descent),因为我们一次优化一个坐标。更一般地,块坐标下降(block coordinate descent)是指对于某个子集的变量同时最小化。

稀疏编码的学习问题

Polyak平均

Polyak平均会平均优化算法在参数空间访问轨迹中的几个点。如果 t t 次迭代梯度下降访问了点 θ ( 1 ) , , θ ( t ) \theta^{(1)},\dots,\theta^{(t)} ,那么Polyak平均算法的输出是 θ ^ ( t ) = 1 t i θ ( i ) \hat{\theta}^{(t)} = \frac{1}{t}\sum_i \theta^{(i)}

监督预训练

在直接训练目标模型求解目标问题之前,训练简单模型求解简化问题的方法统称为预训练

贪心算法(greedy algorithm)将问题分解成许多部分,然后独立地在每个部分求解最优值。贪心算法也可以紧接一个精调(fine-tuning)阶段,联合优化算法搜索全问题的最优解。

贪心监督预训练有助于更好地指导深层结构的中间层的学习。一般情况下,预训练对于优化和泛化都是有帮助的。

另一个与监督预训练有关的方法扩展了迁移学习的想法

另一条相关的工作线是FitNets方法。这种方法始于训练深度足够低和宽度足够大(每层单元数),容易训练的网络。然后,这个网络成为第二个网络(被指定为学生)的老师。训练更深更窄的学生网络不仅需要预测原任务的输出,还需要预测教师网络中间层的值,这样使得训练学生网络变得更容易。

设计有助于优化的模型

在实践中,选择一族容易优化的模型比使用一个强大的优化算法更重要。

现代神经网络的设计选择体现在层之间的线性变换,几乎处处可导的激活函数,和大部分定义域都有明显的梯度。其设计方案旨在使其局部梯度信息合理地对应着移向一个遥远的解。

其他的模型设计策略有助于使优化更简单。例如,层之间的线性路径或是跳跃连接减少了从较低层参数到输出最短路径的长度

延拓法和课程学习

延拓法(continuation method)是一族通过挑选初始点使优化更容易的方法,以确保局部优化花费大部分时间在表现良好的空间。延拓法的背后想法是构造一系列具有相同参数的目标函数。这系列代价函数设计为前一个解是下一个的良好初始点。因此,我们首先解决一个简单的问题,然后改进解以解决逐步变难的问题,直到我们求解真正问题的解。

Bengio指出被称为课程学习(curriculum learning)或者塑造(shaping)的方法可以被解释为延拓法。课程学习基于规划学习过程的想法,首先学习简单的概念,然后逐步学习依赖于这些简化概念的复杂概念。

猜你喜欢

转载自blog.csdn.net/Tifa_Best/article/details/85238188