提起深度学习,没有人不知道梯度下降 (Gradient descent, GD)。但是我们用的往往是Adam优化器。从普通的GD到Adam,经历了哪些改进?Adam的优势又在哪?
SGD
SGD (stochastic Gradient Descent) 和GD是两个极端:前者每次只根据一个样本的梯度进行参数更新。由于这个参数是随机选取的,所以叫做随机梯度下降;后者则一次性地根据全部样本的梯度更新参数。
为了调和二者,我们平常用Mini-batch SGD:取一小部分样本(称为一个batch,batch size根据数据集大小可以取8, 16, 32, 64等),计算梯度下降方向的平均值,更新参数。
好,以下我们提到的优化改进,都是基于Mini-batch SGD的框架的(每次在一个batch上计算梯度)。
Momentum
第一个思路是引入一阶动量。t
时刻的梯度下降方向,不只由当前的梯度方向决定,还要受到此前累积的梯度方向的“制衡”。
这里的 就是Momentum项,它是梯度的指数移动平均值 (Exponential Moving Average, EMA),约等于最近个时刻的梯度平均值。
Momentum的引入会减小震荡,加快收敛速度。
Nesterov Accelerated Gradient (NAG)
Momentum的公式中,当前时刻下降方向主要由累积梯度决定,当前时刻的梯度方向只占一小部分。NAG的思路是,既然如此,与其计算当前梯度方向,不如看看如果跟着累积梯度走了一步,那个时候的下降方向是什么。
与Momentum的对比:
AdaGrad
AdaGrad引入了自适应学习率:神经网络中包含大量参数,但有些经常更新,有些不经常更新。对于经常更新的参数,我们已经积累了关于它的大量知识,不希望它被少数样本影响太大,学习率要小一些;对于不经常更新的参数,对于它的信息太少,希望从更新中多学习知识,学习率要大一些。
衡量第个参数的更新“频率”,越大,对应参数的学习率越小。
为了防止分母为0,特意加了一个小量,一般取
AdaGrad的思路很好,但一项是单调递增的,随着训练过程深入,学习率不断减小,可能导致后来参数无法更新,训练提前结束。
AdaDelta/RMSprop
AdaDelta作为AdaGrad的扩展,它没有累积全部历史梯度,而是只关注过去一段时间窗口的下降梯度。没错,指数移动平均值又要上场了。
Adam (Adaptive moment estimation)
Adam = Mometum + AdaDelta/RMSprop.
Adam在自适应学习率的基础上引入了Mometum,综合了二者的优点。
演化示意图