目录
1. 优化算法在DL中的挑战
1.1 优化算法定义
在一个深度学习问题中,我们首先会定义一个损失函数(loss function),一旦有了损失函数,我们就可以用优化算法去最小化这个损失函数的loss值。而深度学习中绝大多数目标函数都很复杂,是一个非凸函数。因此,很多优化问题并不存在解析解,而需要使用基于数值方法的优化算法找到近似解。
1.2 挑战:局部最小值与鞍点
若
x
0
x_0
x0是函数
f
(
x
)
f(x)
f(x)的局部最小值也就是说在
x
0
x_0
x0附近,
f
(
x
0
)
f(x_0)
f(x0)是最小值,但相对于全局范围,
f
(
x
0
)
f(x_0)
f(x0)并不是全局最小值。而深度学习模型的目标函数可能有若干局部最优值,当一个优化问题的数值解在局部最优解附近时,由于目标函数有关解的梯度接近或变为0,最终迭代求得的数值解可能只令目标函数局部最小化而非全局最小化。如下图所示:
除了局部最优解外,同时,还有一种情况会使得梯度接近或变成0,这个点叫鞍点(saddle point),例如函数
f
(
x
)
=
x
3
f(x)=x^3
f(x)=x3,在
x
=
0
x=0
x=0的时候,梯度为0,但该点是一个鞍点,如下图所示:
虽然在深度学习中,找到目标函数的全局最优解很难,但是一些常用的优化算法,在很多实际问题中都能够训练出有效的深度学习模型,接下来,会对这几种优化算法做一个介绍。
2. 常见的优化算法
2.1 梯度下降 (gradient descent)
2.1.1 梯度下降算法可以降低目标函数值原因
首先大多数人可能会有过这样的疑问:为什么梯度下降算法可以降低目标函数值?
让我们来做一个简单的推导,假设有一个连续可导函数
f
(
x
)
f(x)
f(x),给定一个足够小的数
ε
\varepsilon
ε,根据泰勒展开式,得到以下近似等式:
f
(
x
+
ε
)
≈
f
(
x
)
+
ε
f
′
(
x
)
(
1
)
f(x+\varepsilon) \approx f(x)+\varepsilon f^{'}(x) \text{ }\text{ } (1)
f(x+ε)≈f(x)+εf′(x) (1)
这里
f
′
(
x
)
f^{'}(x)
f′(x)是函数在
x
x
x处的梯度,一维函数的梯度是一个标量,也称导数。
令
ε
=
−
a
f
′
(
x
)
\varepsilon = -af^{'}(x)
ε=−af′(x),其中常数
a
>
0
a>0
a>0,且使得
∣
a
f
′
(
x
)
∣
\begin{vmatrix} a f^{'}(x) \end{vmatrix}
∣∣af′(x)∣∣足够小,则上述等式(1)变换形式如下:
f
(
x
−
a
f
′
(
x
)
)
≈
f
(
x
)
−
a
f
′
(
x
)
2
(
2
)
f(x-a f^{'}(x)) \approx f(x) - af^{'}(x)^{2} \text{ }\text{ } (2)
f(x−af′(x))≈f(x)−af′(x)2 (2)
如果导数
f
′
(
x
)
≠
0
f^{'}(x) \ne 0
f′(x)=0,那么
a
f
′
(
x
)
2
>
0
af^{'}(x)^{2} > 0
af′(x)2>0,则上述(2)等式变换形式如下:
f
(
x
−
a
f
′
(
x
)
)
≤
f
(
x
)
f(x-af^{'}(x)) \le f(x)
f(x−af′(x))≤f(x)
也就是说,通过
x
←
x
−
a
f
′
(
x
)
x \gets x-af^{'}(x)
x←x−af′(x),来迭代
x
x
x,函数
f
(
x
)
f(x)
f(x)的值可能会降低。因此在平时训练深度学习模型时,我们会初始化变量值
x
x
x,然后设定一个学习率
a
a
a来不断迭代
x
x
x,直到到达停止条件,比如loss值足够小,或者试验指标已经不再提高等。
下面通过实现一个简单的函数来体验下梯度下降过程,假如我们的目标函数是
f
(
x
)
=
x
2
f(x)=x^2
f(x)=x2,我们知道最小化
f
(
x
)
f(x)
f(x)的解是
x
=
0
x=0
x=0,用梯度下降法,假设初始
x
=
10
x=10
x=10,并设学习率
a
=
0.2
a=0.2
a=0.2,则10次迭代后,
x
x
x的值已经和最优解十分接近了,如下python代码演示:
# -*-coding:utf8 -*-
import sys
def gd(rate, epoch=10):
'''
y=x*x函数,梯度求解过程验证
'''
x = 10
results = [x]
for i in range(epoch):
x -= rate*2*x
results.append(x)
print('epoch %d, x: %f:'%(epoch,x))
return results
如下图为自变量
x
x
x的迭代过程图:
2.1.2 学习率设定
学习率是一个超参数,需要人工设定,如果使用过小的学习率,学习过程较缓慢,需要更多次迭代,
x
x
x才能够得到较好的解。函数
f
(
x
)
=
x
2
f(x)=x^2
f(x)=x2,若设置学习率
a
=
0.05
a=0.05
a=0.05,则10次迭代后,x的值和最优解还存在较大的差距,这是10次后的结果值:
自变量
x
x
x的迭代过程图形如下:
相反,如果学习率
a
a
a设置过大,那么会出现什么现象呢?如果学习率过大,上述的假设
∣
a
f
′
(
x
)
∣
\begin{vmatrix} a f^{'}(x) \end{vmatrix}
∣∣af′(x)∣∣很小不成立,则最开始的一阶泰勒展开公式不再成立,则无法保证迭代
x
x
x会降低
f
(
x
)
f(x)
f(x)的值,还是以上面的例子为例,假设设置学习率
a
=
1.1
a=1.1
a=1.1,则
x
x
x不断越过最优解
x
=
0
x=0
x=0并逐渐发散。
x
x
x的迭代变化过程如下图所示:
2.2 随机梯度下降 (stochastic gradient descent)
2.2.1 方法
在深度学习中,目标函数通常是训练样本数据集中所有样本的损失函数的平均。假设
f
i
(
x
)
f_i(x)
fi(x)是第
i
i
i个训练样本的损失函数,
n
n
n是总样本数,
x
x
x是模型的参数向量,那么目标函数定义为:
f
(
x
)
=
1
n
∑
i
=
1
n
f
i
(
x
)
f(x) = \frac{1}{n} \sum_{i=1}^{n}f_i(x)
f(x)=n1i=1∑nfi(x)
目标函数在
x
x
x处的梯度计算为:
∇
f
(
x
)
=
1
n
∑
i
=
1
n
∇
f
i
(
x
)
\nabla f(x) = \frac{1}{n}\sum_{i=1}^{n}\nabla f_i(x)
∇f(x)=n1i=1∑n∇fi(x)
如果使用梯度下降,每次自变量迭代的计算开销为
O
(
n
)
O(n)
O(n),若样本量
n
n
n很大时,每次迭代开销很大。
而随机梯度下降就是为了减少每次迭代的计算开销,在随机梯度下降的每次迭代中,我们随机均匀采样一个样本索引
i
∈
1
,
2
,
.
.
.
,
n
i \in {1,2,...,n}
i∈1,2,...,n,并计算梯度
∇
f
i
(
x
)
\nabla f_i(x)
∇fi(x)来迭代
x
x
x:
x
←
x
−
a
∇
f
i
(
x
)
x \gets x - a\nabla f_i(x)
x←x−a∇fi(x)
所以每次迭代的计算开销从
O
(
n
)
O(n)
O(n)降低到
O
(
1
)
O(1)
O(1)。
2.2.2 总结
总结两点:
- 学习率过大或过小都是不合理的,平时可以根据经验和试验设定一个较合理的值
- 使用适当的学习率,沿着梯度反方向更新自变量可能降低目标函数值
2.3 批量随机梯度下降 ( batch gradient descent)
Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models
2.3.1 方法
梯度下降和随机梯度下降一个计算完整数据集梯度,再进行参数变量的更新,一个随机采样一个样本计算梯度,再进行参数变量的更新。梯度下降每次更新参数变量计算开销代价太大,而随机梯度每次更新参数变量容易受单样本影响,使得学习过程变得困难,不够平滑。所以,批量梯度下降是这两者方法的折中,开销代价既没有梯度下降大,学习过程也比随机梯度方法更加平滑。
从名字可知,批量随机梯度每次随机采样一个批量,也就是平时在训练深度学习模型过程中的一个batch样本来计算梯度。
2.4 Momentum
On the importance of initialization and momentum in deep learning
2.4.1 方法
假设我们有一个二维向量输入的目标函数 f ( x ) = 0.1 x 1 2 + 2 x 2 2 f(x)=0.1x_1^2+2x_2^2 f(x)=0.1x12+2x22,实现这个目标函数的梯度下降,代码如下所示:
def function(x1,x2):
return 0.1 * x1 ** 2 + 2 * x2 ** 2
def gd_f(x1, x2, a):
return (x1 - a * 0.2 * x1, x2 - a * 4 * x2)
假设我们令学习率
a
=
0.4
a=0.4
a=0.4, 参数更新迭代的图形变化如下:
由于目标函数在
x
2
x_2
x2方向比在
x
1
x_1
x1方向的斜率更大,从图中也可以看出,梯度下降迭代自变量在
x
2
x_2
x2方向比在
x
1
x_1
x1方向移动幅度更大,为了避免自变量
x
2
x_2
x2方向上目标函数越过最优解,需要调小学习率,但是,在
x
1
x_1
x1方向上,朝最优解移动会变慢。若将学习率再调大一些
a
=
0.6
a=0.6
a=0.6,在
x
2
x_2
x2方向上发散,越过最优解,如下图所示:
而动量(momentum)方法就是解决上述梯度下降问题。数学公式定义为如下:
v
t
=
β
v
t
−
1
+
g
t
v_t = \beta v_{t-1} + g_{t}
vt=βvt−1+gt
其中
β
∈
(
0
,
1
)
\beta \in (0,1)
β∈(0,1)。
v
v
v叫做 momentum,让我们对
v
v
v进行循环展开得到如下表达式:
v
t
=
β
2
v
t
−
2
+
β
g
t
−
1
+
g
t
=
.
.
.
,
=
∑
i
=
0
t
−
1
β
i
g
t
−
i
v_t = \beta^2v_{t-2} + \beta g_{t-1} + g_{t} = ..., = \sum_{i=0}^{t-1}\beta^i g_{t-i}
vt=β2vt−2+βgt−1+gt=...,=i=0∑t−1βigt−i
而当时间
t
t
t达到极限的时候,有如下公式:
∑
i
=
0
∞
β
i
=
1
1
−
β
\sum_{i=0}^{\infty}\beta^i =\frac{1}{1-\beta}
i=0∑∞βi=1−β1
而基于momentum方法的梯度更新公式如下:
v
t
←
β
v
t
−
1
+
g
t
v_t \gets \beta v_{t-1} + g_{t}
vt←βvt−1+gt
x
t
←
x
t
−
1
−
η
v
t
x_t \gets x_{t-1} - \eta v_t
xt←xt−1−ηvt
当
β
=
0
\beta =0
β=0时,就是最初的梯度下降算法了,基于momentum方法,更新的梯度不再是当前最近一个step
t
t
t计算的梯度,而是根据历史前时间
t
t
t步数的梯度加权之后,但离当前时间
t
t
t越前的时间,
i
i
i越大,由于
β
i
\beta^{i}
βi指数形式,对当前会产生很小甚至不产生作用,也就是说与当前时间
t
t
t越近,
i
i
i越大,由于
β
∈
(
0
,
1
)
\beta \in (0,1)
β∈(0,1), 则
β
t
−
i
\beta^{t-i}
βt−i越大,所以越近的梯度产生较大的比重。上述函数
f
(
x
)
=
0.1
x
1
2
+
2
x
2
2
f(x)=0.1x_1^2+2x_2^2
f(x)=0.1x12+2x22,momentum方法梯度更新代码如下:
def momentum(beta, a, x1, x2, v1, v2):
v1 = beta * v1 + 0.2 * v1
v2 = beta * v2 + 4 * v2
return x1 - eta * v1, x2 - eta * v2, v1, v2
我们还是设学习率
η
=
0.6
\eta=0.6
η=0.6,
β
=
0.5
\beta=0.5
β=0.5,则基于momentum方法的参数更新过程如下图所示:
我们可以看到,和上述我们使用过的梯度下降算法一样的学习率
η
=
0.6
\eta=0.6
η=0.6,momentum方法也能够较好的收敛。
2.4.2 总结
总结三点:
- 动量法使用了指数加权移动平均的思想,它将过去的梯度做了加权平均,且权重按照时间步指数进行删减,离当前越近步的梯度权重越大
- 动量法使得相邻的自变量更新在方向上更加一致
- 动量法依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能
- 在动量法中,自变量在各个方向上的移动幅度不仅取决于当前梯度,还取决于过去的各个梯度在各个方向上是否一致
2.5 Adagrad
Adaptive Subgradient Methods for
Online Learning and Stochastic Optimization∗
2.5.1 方法
上述的几个优化算法在相同的时间步里,目标函数对变量的每个元素都使用相同的学习率进行更新迭代。但是,实际情况中,可能会有很多稀疏特征,训练模型过程中,出现频率高的特征,学习率可能需要慢慢减少,但是一些比较低频率出现的特征,可能需要大一点的学习率。所以,Adagrad根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题 。
从Adagrad算法的核心思想出发,在计算各自变量值的时候,我们可以基于批量随机梯度方法调整如下:
g
t
=
∂
w
l
(
y
t
,
f
(
x
t
,
w
)
)
g_t = \partial_wl(y_t, f(x_t, w))
gt=∂wl(yt,f(xt,w))
s
t
=
s
t
−
1
+
g
t
2
s_t = s_{t-1} + g_t^2
st=st−1+gt2
w
t
=
w
t
−
1
−
η
s
t
+
ε
g
t
w_t = w_{t-1} - \frac{\eta}{\sqrt{s_t+\varepsilon}}g_t
wt=wt−1−st+εηgt
其中
η
\eta
η是学习率,
ε
\varepsilon
ε是一个很小的常量,比如
1
0
−
6
10^{-6}
10−6,为了维持数值稳定性,从上面三个公式可以看出,每个自变量的学习率
η
s
t
+
ε
\frac{\eta}{\sqrt{s_t+\varepsilon}}
st+εη会根据历史累计梯度的平方进行变化,若之前的历史累积梯度较大,则学习率会慢慢变小,相反,则会慢慢变大,初始
s
0
=
0
s_0=0
s0=0。
接下来,让我们仍然以目标函数
f
(
x
)
=
0.1
x
2
+
2
x
2
2
f(x)=0.1x^2+2x_2^2
f(x)=0.1x2+2x22为例,看Adagrad算法是怎样对自变量进行迭代的,梯度更新代码如下:
import math
eta = 0.4
def adagrad(x1, x2, s1, s2):
g1, g2, eps = 0.2*x1, 4*x2, 1e-6
s1 += g1 ** 2
s2 += g2 ** 2
x1 -= eta / math.sqrt(s1 + eps) * g1
x2 -= eta / math.sqrt(s2 + eps) * g2
return x1, x2, s1, s2
我们还是按照学习率为0.4,adagrad优化算法图形如下:
可以看出,由于
s
t
s_t
st的累加效果,自变量随着时间步拉长,变化幅度越来越小。如果调大学习率为2,自变量更为迅速地逼近了最优解,如下图所示:
2.5.2 总结
- Adagrad算法会根据每个变量的历史累计梯度,不断降低(不变)学习率的大小
- 历史梯度累积越大,则学习率下降的越快
- Adagrad算法对稀疏特征较有效,当频率出现较低的特征在学习过程中需要较大的学习率
- Adagrad算法对于学习率降低有点过于极端,如果一开始某个变量的学习率很大,但是一直没学好,则后面学习率降低很小,很有可能不会再找到最优解
2.6 RMSProp
divide the gradient by a running average of its recent magnitude. COURSERA
2.6.1 方法
由于在Adagrad算法中,我们是通过对之前时间步
t
t
t的梯度平方累加而不断降低学习率。如果学习率在一开始早期迭代没有到达最佳值,到后面由于学习率太小,可能很难再找到合适的解。
为了解决Adagrad算法后期迭代学习率过小,而还没有达到最优解的这种问题,从上述Adagrad公式可以看出,一种方法是最后的
s
t
s_t
st可以求个时间
t
t
t的平均,
s
t
/
t
s_t/t
st/t,这样
s
t
s_t
st不会因为时间
t
t
t的累积,一直在变大,而导致学习率一直在下降。但是这种求平均方式学习过程很缓慢。可以用一个类似的平均方法取代,在前面讲解的momentum方法中使用过的指数加权移动平均。RMSProp更新迭代的数学公式如下:
s
t
←
γ
s
t
−
1
+
(
1
−
γ
)
g
t
2
s_t \gets \gamma s_{t-1} + (1-\gamma)g_t^2
st←γst−1+(1−γ)gt2
x
t
←
x
t
−
1
−
η
s
t
+
ε
⊙
g
t
x_t \gets x_{t-1} - \frac{\eta}{\sqrt{s_t+\varepsilon}}⊙g_t
xt←xt−1−st+εη⊙gt
常量
ε
>
0
\varepsilon>0
ε>0,用来保证除数不为0或者不会除以很小的数,维持数值稳定。让我们对
s
t
s_t
st展开,得到如下形式:
s
t
=
(
1
−
γ
)
g
t
2
+
γ
s
t
−
1
=
(
1
−
γ
)
(
g
t
2
+
γ
g
t
−
1
2
+
γ
2
g
t
−
2
2
+
.
.
.
,
)
s_t = (1-\gamma)g_t^2+\gamma s_{t-1}=(1-\gamma)(g_t^2+\gamma g_{t-1}^2 +\gamma^2g_{t-2}^2+...,)
st=(1−γ)gt2+γst−1=(1−γ)(gt2+γgt−12+γ2gt−22+...,)
而
1
+
γ
+
γ
2
+
.
.
.
,
=
1
1
−
γ
1+\gamma+\gamma^2+...,=\frac{1}{1-\gamma}
1+γ+γ2+...,=1−γ1,因此并不是随着时间增加,
s
t
s_t
st一直增加,因为随着时间增加,梯度按照最近的指数加权平均,可以看做最近时间步
1
1
−
γ
\frac{1}{1-\gamma}
1−γ1的梯度指数加权平均。
还是以函数
f
(
x
)
=
0.1
x
1
2
+
2
x
2
2
f(x)=0.1x_1^2+2x_2^2
f(x)=0.1x12+2x22为例,迭代代码如下:
import math
eta, gamma = 0.4, 0.9
def Rmsprop(x1, x2, s1, s2):
g1, g2, eps = 0.2 * x1, 4 * x2, 1e-6
s1 = gamma * s1 + (1 - gamma) * g1 **2
s2 = gamma * s2 + (1 - gamma) * g2 **2
x1 -= eta / math.sqrt(s1 + eps) * g1
x2 -= eta / math.sqrt(s2 + eps) * g2
return x1, x2, s1, s2
我们还是用学习率为0.4,在Adagrad迭代方法中,后期自变量移动幅度较小,而下图是RMSProp优化迭代过程,相同的迭代条件下,收敛速度更快。
2.6.2 总结
- RMSProp算法和Adagrad算法十分相近,不同点在于,RMSProp算法使用指数加权移动平均来调整学习率,保证了学习率并不会一直单调降低
- 系数 γ \gamma γ决定了累积历史多久时间步的梯度值更新参数 s t s_t st
2.7 AdaDelta
ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
2.7.1 方法
Adadelta是AdaGrad算法的一种变体,类似RMSProp算法,主要针对AdaGrad后期迭代因为学习率降低的太小,可能较难找到最优解问题而做的改进,同时Adadelta没有学习率这个超参数。
Adadelta保留了两个状态变量,
s
t
s_t
st存储了历史梯度变化情况,
Δ
x
t
\Delta x_t
Δxt存储的是历史自变量变化情况。所以具体数学公式如下:
s
t
=
ρ
s
t
−
1
+
(
1
−
ρ
)
g
t
2
s_t = \rho s_{t-1} + (1-\rho)g_t^2
st=ρst−1+(1−ρ)gt2
g
t
′
=
Δ
x
t
−
1
+
ε
s
t
+
ε
g_t^{'}=\frac{\sqrt{\Delta x_{t-1} + \varepsilon}}{\sqrt{s_t+\varepsilon}}
gt′=st+εΔxt−1+ε
Δ
x
t
=
ε
Δ
x
t
−
1
+
(
1
−
ε
)
g
t
′
2
\Delta x_t = \varepsilon \Delta x_{t-1} + (1-\varepsilon)g_t^{{'}^2}
Δxt=εΔxt−1+(1−ε)gt′2
x
t
=
x
t
−
1
−
g
t
′
x_t = x_{t-1} - g_t^{'}
xt=xt−1−gt′
其中
ε
\varepsilon
ε是一个很小的数值,比如
1
0
−
5
10^{-5}
10−5,为了维持计算的稳定性。从上面公式可以看出,AdaDelta算法相比RMSProp算法的主要区别是用
Δ
x
\Delta x
Δx这个变量来替换RMSProp的超参数学习率
η
\eta
η。其中
Δ
x
0
\Delta x_0
Δx0和
s
0
s_0
s0初始化都是0。
2.7.2 总结
- Adadelta算法没有学习率这个超参数,通过计算自变量的指数加权平均来替代学习率
- Adadelta使用两个变量来存储梯度的变化和自变量本身的变化
2.8 Adam
ADAM: A METHOD FOR STOCHASTIC OPTIMIZATIONfang’f
2.8.1 方法
Adam是一个综合了上述所有优化算法的一个有效的算法。目前为止,Adam是在深度学习模型里使用较多,也是教鲁棒的优化器之一。不过Adam算法也有一些问题,具体可以参考以下两篇论文:
On the Convergence of Adam and Beyond
Adaptive Methods for Nonconvex Optimization
Adam算法的使用了动量变量
v
t
v_t
vt和RMSProp算法中的批量随机梯度平方的指数加权移动平均变量
s
t
s_t
st。数学公式如下:
v
t
←
β
1
v
t
−
1
+
(
1
−
β
1
)
g
t
v_t \gets \beta_1v_{t-1} + (1-\beta_1)g_t
vt←β1vt−1+(1−β1)gt
s
t
←
β
2
s
t
−
1
+
(
1
−
β
2
)
g
t
2
s_t \gets \beta_2 s_{t-1} + (1-\beta_2)g_t^2
st←β2st−1+(1−β2)gt2
其中
β
1
\beta_1
β1和
β
2
\beta_2
β2是一个小于1的正数,一般设置是
β
1
=
0.9
\beta_1=0.9
β1=0.9
β
2
=
0.999
\beta_2=0.999
β2=0.999,初始值
v
0
=
s
0
=
0
v_0=s_0=0
v0=s0=0。
v
t
=
(
1
−
β
1
)
∑
i
=
1
t
β
1
t
−
i
g
i
v_t = (1-\beta_1)\sum_{i=1}^t\beta_1^{t-i}g_i
vt=(1−β1)∑i=1tβ1t−igi,将过去各时间步批量随机梯度权值相加,得到
(
1
−
β
1
)
∑
i
=
1
t
β
1
t
−
i
=
1
−
β
1
t
(1-\beta_1)\sum_{i=1}^t\beta_1^{t-i}=1-\beta_1^t
(1−β1)∑i=1tβ1t−i=1−β1t,当时间
t
t
t很小时。过去各时间步批量梯度权值之和很小,例如当
β
1
=
0.9
\beta_1=0.9
β1=0.9,
v
1
=
0.1
g
1
v_1=0.1g_1
v1=0.1g1,为了避免这样的影响,除以
1
−
β
1
t
1-\beta_1^t
1−β1t归一化因子,修正后如下:
v
t
^
=
v
t
1
−
β
1
t
\hat{v_t}=\frac{v_t}{1-\beta_1^t}
vt^=1−β1tvt
s
t
^
=
s
t
1
−
β
2
t
\hat{s_t} = \frac{s_t}{1-\beta_2^t}
st^=1−β2tst
Adam算法用
v
t
v_t
vt和
s
t
s_t
st来调整每个参数的学习率,如下公式:
g
t
′
←
η
v
t
^
s
t
^
+
ε
g_t^{'} \gets \frac{\eta \hat{v_t}}{\sqrt{\hat{s_t}}+\varepsilon}
gt′←st^+εηvt^
x
t
←
x
t
−
1
−
g
t
′
x_t \gets x_{t-1} - g_t^{'}
xt←xt−1−gt′
η
\eta
η是学习率,
ε
\varepsilon
ε是为了维持数值计算稳定的一个很小的常量,如
1
0
−
8
10^{-8}
10−8,和AdaGrad、RMSProp以及AdaDelta算法一样,每个自变量都有自己的学习率。
2.8.2 总结
- Adam算法集合了许多优化算法的特性,是一个较鲁棒的优化算法
- Adam相对于RMSPro算法,在时间 t t t步上,用历史所有时间 t t t步的批量随机梯度指数加权移动平均来替代当前时间 t t t的梯度 g t g_t gt
- Adam算法y也使用了偏差修正,保证了在刚开始,时间步 t t t很小的时候,指数加权权重之和较小问题