第八章:Optimization for Training Deep Models

8. Optimization for Training Deep Models

机器学习和纯优化问题的区别:机器学习关注某些性能度量P,定义于测试集上并且可能是不可解的,只能间接地优化P。因此通过降低代价函数J(θ)来提高P。

这一点与纯优化不同,纯优化最小化目标J本身。

批量(batch)梯度算法:使用整个训练集的优化算法被称为批量(batch)或确定性(deterministic)梯度算法。

在线(online)算法:每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(online)算法。

mini batch:介于以上两者之间,使用一个以上,而又不是全部的训练样本。影响mini batch size的因素:1.更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。2.极小批量通常难以充分利用多核架构。

这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。3.在某些硬件上使用特定大小的数组时,运行时间会更少。

尤其是在使用GPU时,通常使用2的幂数作为批量大小可以获得更少的运行时间。

局部极小值(local minima)的问题:如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型被称为可辨认的(identifiable);而神经网络模型是不可辨认的(最直观的原因就是权重空间对称性,weight space symmetry),这意味着神经网络代价函数具有非常多的局部极小值。 对于足够大的神经网络而言,大部分局部极小值都具有很小的代价函数,我们能不能找到真正的全局最小点并不重要,而是需要在参数空间中找到一个代价很小(但不是最小)的点。

鞍点(Saddle)的问题:对于很多高维非凸函数而言,局部极小值事实上远少于另一类梯度为零的点:鞍点。在鞍点处,Hessian矩阵同时具有正负特征值。鞍点激增对训练算法的影响:对于只使用梯度信息的一阶优化算法而言,目前情况还不清楚。
鞍点附近的梯度通常会非常小。 另一方面,实验中梯度下降似乎可以在许多情况下逃离鞍点。对于牛顿法而言,鞍点显然是一个问题。

梯度下降旨在朝”下坡”移动,而非明确寻求临界点。 而牛顿法的目标是寻求梯度为零的点。

高维空间中鞍点的激增或许解释了在神经网络训练中为什么二阶方法无法成功取代梯度下降。

悬崖(cliffs)和梯度爆炸(exploding gradients)

多层神经网络通常存在像悬崖一样的斜率较大区域,这是由于几个较大的权重相乘导致的,在RNN中比较常见。

遇到斜率极大的悬崖结构时,梯度更新会很大程度地改变参数值,通常会完全跳过这类悬崖结构。

启发式梯度截断会干涉来减小步长,从而使其不太可能走出梯度近似为最陡下降方向的悬崖区域。

https://raw.githubusercontent.com/applenob/reading_note/master/res/cliff.png

各种优化算法

随机梯度下降(Stochastic Gradient Descent)算法:计算mini-batch中m个样本对应的梯度,取其平均值来更新参数。关键的超参是学习率ϵ。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-1.png

动量(Momentum)算法:动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。

动量算法使用变量v(velocity,速度)积累之前梯度指数级衰减的移动平均,并且继续沿该方向移动。动量=mv,当m=1时动量即v。如果动量算法总是观测到梯度g,那么它会在方向−g上不停加速,直到达到最终速度,其中步长大小为$\frac{ϵ‖g‖}{1−α}$。因此将动量的超参数视为$\frac{1}{1−α}$有助于理解。

例如,α=0.9对应着最大速度10倍于梯度下降算法。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-2.png

Nesterov 动量算法:Nesterov 动量算法和普通的动量算法的区别在于梯度计算的位置。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-3.png

参数初始化策略:现代的初始化策略是简单的、启发式的。也许完全确知的唯一特性是初始参数需要在不同单元间”破坏对称性”。更大的初始权重具有更强的破坏对称性的作用,有助于避免冗余的单元。有些启发式方法可用于选择权重的初始大小。

一种初始化m个输入和n输出的全连接层的权重的启发式方法是从分布$U(−\frac{1}{\sqrt{m}},\frac{1}{\sqrt{m}})$中采样权重,另一种使用标准初始化,$W_{i,j}\sim
U(−\frac{6}{\sqrt{m+n}},\frac{6}{\sqrt{m+n}})$

自适应学习率的优化算法

AdaGrad:反比于其所有梯度历史平方值总和的平方根来缩放每个参数。

累积参数梯度越大学习率下降越快。AdaGrad在某些深度学习模型上效果不错,但不是全部。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-4.png

RMSProp:修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,
它就像一个初始化于该碗状结构的AdaGrad算法实例。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-5.png

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-6.png

Adam:“Adam”这个名字派生自”adaptive moments”。它结合了RMSProp和动量算法。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-7.png

二阶近似方法

牛顿法(Newton’s Method):牛顿法的主要制约在于计算量巨大,每一次更新参数的迭代都需要计算$H^{-1}$,假如有k个参数,那么复杂度就是$O(k^3)$。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-8.png

共轭法(Conjugate Gradients):共轭梯度是一种通过迭代下降的共轭方向以有效避免Hessian矩阵求逆计算的方法。在共轭梯度法中,我们寻求一个和先前线性搜索方向共轭的搜索方向。

在训练迭代t时,下一步的搜索方向$d_t$的形式如下:$d_t=∇θJ(θ)+β_td{t−1}$,其中,系数$βt$的大小控制我们应沿方向$d_{t−1}$加回多少到当前搜索方向上。所谓共轭,即两个方向$dt$和$d_{t−1}$,满足二次方程$d^⊤tHd{t−1}=0$。

对于二次曲面而言,共轭方向确保梯度沿着前一方向大小不变。

https://raw.githubusercontent.com/applenob/reading_note/master/res/8-9.png

BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法:BFGS等拟牛顿法所采用的方法是使用矩阵$M_t$近似逆,迭代地低秩更新精度以更好地近似$H^{−1}$。$ρ_t=M_tg_t$,更新步骤:$θ_{t+1}=θ_t+ϵ^*ρ_t$。

批标准化(BatchNormalization):它并不是一个优化算法,而是一个自适应的重参数化的方法,试图解决训练非常深的模型的困难。批标准化提出了一种几乎可以重参数化所有深度网络的优雅方法。

重参数化显著减少了多层之间协调更新的问题。

批标准化可应用于网络的任何输入层或隐藏层。$H’=\frac{H−μ}{σ}$,其中,$μ=\frac{1}{m}\sum_iH_{i,:}$, $σ=\sqrt{δ+\frac{1}{m}∑_i(H−μ)^2_i}$

坐标下降(CoordinateDescent):如果我们相对于某个单一变量$x_i$最小化f(x),然后相对于另一个变量$x_j$等等,反复循环所有的变量,我们会保证到达(局部)极小值。
这种做法被称为坐标下降,因为我们一次优化一个坐标。 当一个变量的值很大程度地影响另一个变量的最优值时,坐标下降不是一个很好的方法。

Polyak平均:Polyak平均会平均优化算法在参数空间访问轨迹中的几个点。当应用Polyak平均于非凸问题时,通常会使用指数衰减计算平均值:
$θ^{(t)}=αθ^{(t−1)}+(1−α)θ^{(t)}$

监督预训练(Supervised Pretraning):有时,如果模型太复杂难以优化,或是如果任务非常困难,直接训练模型来解决特定任务的挑战可能太大。

因此可以训练一个较简单的模型来求解问题,然后使模型更复杂会更有效。 训练模型来求解一个简化的问题,然后转移到最后的问题,有时也会更有效些。

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

设计有助于优化的模型:改进优化的最好方法并不总是改进优化算法。
相反,深度模型中优化的许多改进来自于设计易于优化的模型。