AI机动队
首发于AI机动队

深度学习优化算法比较——深度学习第八章(一)

继续深度学习第八章总结,这章主要讲了深度学习的优化方法,主要涉及的内容有Stochastic Gradient Descent (SGD), Momentum, Adagrad, RMSProp, Adam,模型参数初始化和Batch Normalization,第一部分先总结SGD及其各种改进算法,由于这一部分内容在斯坦福CS231n中的解释更清晰,会结合起来一起总结。

Stochastic Gradient Descent

之前已经在第四章总结过iterative地解决优化问题的Gradient Descent 算法(梯度下降算法——深度学习花书第四章数值计算),它需要每次Gradient Descent计算梯度时利用所有的数据样本,其优点是这样计算的梯度较为准确,但缺点是计算量较大。

如果我们有n个样本,其均值的标准差为 \frac{\sigma}{\sqrt{n}} ,其中 \sigma 是样本值得真实标准差。我们可以看到,分母是 \sqrt{n} 表明随着样本的增多,计算梯度的准确度的回报是小于线性的。例如我们有两种方法:1. 利用100个样本计算梯度 2.利用10000个样本计算梯度。 第二种方法是第一种的100倍的计算量,但只将均值的标准差减少了10倍,我们通常希望我们能更快的达到我们的优化目标,所以不需要每次计算梯度都严格的利用全部样本,而是进行多次iteration,而每次估算的梯度有合适的准确度即可。在优化算法里,我们通常把一次仅利用一个样本来更新的方式叫做stochastic或online 方法。但对于深度学习来讲,我们通常所说的stochastic gradient descent指的是minibatch stochastic methods,即每次计算梯度时利用一部分样本,其样本量是新引入的超参数batch size。随机梯度下降算法参数更新规则如下表示:

注意到,我们引入了另一个超参数学习率 \epsilon _k ,可以说学习率是深度学习中最重要的需要调节的参数,如果学习率过大,我们可能会一次就跳过极小点而到山谷的另一侧,那么训练的loss可能会有较大波动而不是一致的向极小点步进,另一方面,如果学习率过小,训练更新过小,需要较长时间才能达到较好效果。通常我们需要经过不断的试验来选取合适的学习率,另外也可以在初始时使用稍大一些的学习率,随着训练的进行我们可以逐步的降低学习率从而避免波动,例如通常采用的方法是对于前 \tau 次iteration,线性的降低学习率 \epsilon _k = (1-\frac{k}{\tau}) \epsilon _0 + \frac{k}{\tau} \epsilon _\tau ,而之后保持学习率恒定。

但是,对于SGD,常常会遇到两个问题,一种情况是当遇到局域极小值或是鞍点时,梯度为零,SGD无法继续更新而卡在这一局域,如下图所示。

还有一种是在不同的方向上曲率不同,而SGD过程会在曲率较高的方向上来回震荡,而在曲率较低的方向上进展缓慢,如下图所示,不能选取最优路径达到极值点。用更严格的数学语言表示就是对于其Hessian Matrix的condition number(最大本征值与最小本征值的比值)较大的情况,SGD的效率过低,而对于深度学习维度很多的情况,很容易造成condition number较大的情况。

为了解决这些问题,不同的基于SGD的修正算法被提出,如以下常用的几种。

Momentum

Momentum,顾名思义,来自物理学中的动量概念,即我们用一个新的变量 vv 可以看做是速度,在质量为单位质量时大小等于Momentum)来记录之前的梯度变化的速度,其优势在于对于局域极小值或鞍点的情况,由于保持了原有的速度,模型可以继续更新。

而对于不同方向的曲率不同的问题,由于其保持一定原有方向的速度,不会在曲率较大的山峰间进行剧烈波动,如下图蓝线所示:

更新法则用公式表示为

v \leftarrow \alpha v - \epsilon \triangledown _{\theta}\left( \frac{1}{m}\sum_{i=1}^{m}{L(f(x^{(i)};\theta), y^{(i)})} \right)

\theta \leftarrow \theta + v

其中 \alpha 表示了之前的梯度的贡献衰减的速率,如果 \alpha 相对于 \epsilon 越大,则之前的梯度对当前方向影响越大。与SGD比较,可以看出原SGD只要梯度大步进幅度较大,而对于Momentum来说,如果之前若干次梯度方向一致,才有较大的步进幅度。


以下三种方法均是自适应学习率(Adaptive learning rate)的算法,即随着模型进行自我调控学习率并对于不同的参数采取不同的学习率。

AdaGrad

与Momentum方法比较,AdaGrad没有引入速度变量 v ,而是记录每个参数方向上的梯度的值的平方和,在该参数方向上步进时除以这个平方和的平方根,则对于原梯度较小学习进展较慢的方向相较于原梯度较大的方向rescale的程度较小,从而加速在该方向上的学习进程。其具体的更新规则为:

其中 \odot 为元素乘积符号,即对于每个元素求平方,其输出结果为矢量。矢量 r 即为每个参数方向的梯度平方和的积累值,注意我们对其做除法时会假如一个极小量 \delta 以防除数为零的情况发生。

RMSProp

Adagrad虽然可以较好的解决不同方向曲率差异过大的情况,但是我们可以看到随着训练的进行,除数 \sqrt{r} 在不断增大,学习率衰减依赖于所有之前的梯度的历史结果,可能在我们未达到极值点前学习率已经减至过低从而无法有效的更新模型。所以RMSProp方法在其上做了改进,即对于 r 加入一定的衰减,使较早的梯度贡献较小,即我们计算的是一个带有指数权重的moving average。其更新法则与AdaGrad不同的地方在于

Adam

Adam 可以看做是RMSProp 与Momentum方法的一种结合,其得名于Adaptive moments,意在结合两者的优点。它引入两个moment, 第一个即为速度的Momentum,第二个moment则是如RMSProp中的梯度的平方和,并分别对两个moment进行一些随时间变化的修正。其完整更新法则如下:

Alec Radford做了几种主要优化方法(其中未包含Adam)的动态图解,可以直观的比较几种算法效果

总结

这里总结了深度学习中进行minibatch 步进更新的方法,其基础算法是SGD,为了解决SGD不同方向曲率差异过大而造成低效更新及梯度局域消失的问题,有不同的改进方法Momentum, AdaGrad, RMSProp和Adam。实际应用中,选择Adam和合适的参数能够适用于大部分深度学习优化问题。


注:截图均来自Ian Goodfellow等合著的Deep Learning一书以及斯坦福CS231n讲义CS231n: Convolutional Neural Networks for Visual Recognition,推荐阅读原书及原讲义。

编辑于 2018-09-30

文章被以下专栏收录