提起深度学习,没有人不知道梯度下降 (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时刻的梯度下降方向,不只由当前的梯度方向决定,还要受到此前累积的梯度方向的“制衡”。

imu梯度下降算法_深度学习


这里的imu梯度下降算法_深度学习_02 就是Momentum项,它是梯度的指数移动平均值 (Exponential Moving Average, EMA),约等于最近imu梯度下降算法_imu梯度下降算法_03个时刻的梯度平均值。

Momentum的引入会减小震荡,加快收敛速度。

imu梯度下降算法_自适应_04

Nesterov Accelerated Gradient (NAG)

Momentum的公式中,当前时刻下降方向主要由累积梯度决定,当前时刻的梯度方向只占一小部分。NAG的思路是,既然如此,与其计算当前梯度方向,不如看看如果跟着累积梯度走了一步,那个时候的下降方向是什么。

imu梯度下降算法_梯度下降_05

与Momentum的对比

imu梯度下降算法_python_06

AdaGrad

AdaGrad引入了自适应学习率:神经网络中包含大量参数,但有些经常更新,有些不经常更新。对于经常更新的参数,我们已经积累了关于它的大量知识,不希望它被少数样本影响太大,学习率要小一些;对于不经常更新的参数,对于它的信息太少,希望从更新中多学习知识,学习率要大一些。

imu梯度下降算法_python_07


imu梯度下降算法_python_08衡量第imu梯度下降算法_自适应_09个参数的更新“频率”,imu梯度下降算法_python_08越大,对应参数的学习率越小。

为了防止分母为0,特意加了一个小量imu梯度下降算法_深度学习_11,一般取imu梯度下降算法_自适应_12

AdaGrad的思路很好,但imu梯度下降算法_python_08一项是单调递增的,随着训练过程深入,学习率不断减小,可能导致后来参数无法更新,训练提前结束。

AdaDelta/RMSprop

AdaDelta作为AdaGrad的扩展,它没有累积全部历史梯度,而是只关注过去一段时间窗口的下降梯度。没错,指数移动平均值又要上场了。

imu梯度下降算法_imu梯度下降算法_14

Adam (Adaptive moment estimation)

Adam = Mometum + AdaDelta/RMSprop.
Adam在自适应学习率的基础上引入了Mometum,综合了二者的优点。

imu梯度下降算法_自适应_15

演化示意图

imu梯度下降算法_深度学习_16