梯度下降——雏凤清于老凤声

提起深度学习,没有人不知道梯度下降 (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时刻的梯度下降方向,不只由当前的梯度方向决定,还要受到此前累积的梯度方向的“制衡”。
梯度下降——雏凤清于老凤声_第1张图片
这里的 V d θ [ t ] V_{d\theta}^{[t]} Vdθ[t] 就是Momentum项,它是梯度的指数移动平均值 (Exponential Moving Average, EMA),约等于最近 1 1 − β \frac{1}{1-\beta} 1β1个时刻的梯度平均值。
Momentum的引入会减小震荡,加快收敛速度。

梯度下降——雏凤清于老凤声_第2张图片

Nesterov Accelerated Gradient (NAG)

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

梯度下降——雏凤清于老凤声_第3张图片

与Momentum的对比

梯度下降——雏凤清于老凤声_第4张图片

AdaGrad

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

梯度下降——雏凤清于老凤声_第5张图片
G i , i [ t ] G_{i,i}^{[t]} Gi,i[t]衡量第 i i i个参数的更新“频率”, G i , i [ t ] G_{i,i}^{[t]} Gi,i[t]越大,对应参数的学习率越小。
为了防止分母为0,特意加了一个小量 ϵ \epsilon ϵ,一般取 ϵ = 1 e − 8 \epsilon=1e-8 ϵ=1e8

AdaGrad的思路很好,但 G i , i [ t ] G_{i,i}^{[t]} Gi,i[t]一项是单调递增的,随着训练过程深入,学习率不断减小,可能导致后来参数无法更新,训练提前结束。

AdaDelta/RMSprop

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

梯度下降——雏凤清于老凤声_第6张图片

Adam (Adaptive moment estimation)

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

梯度下降——雏凤清于老凤声_第7张图片

演化示意图

梯度下降——雏凤清于老凤声_第8张图片

你可能感兴趣的:(深度学习,python)