首先,深度学习优化算法经历了:BGD→SGD→SGDM→NAG→AdaGrad→AdaDelta→Adam→Nadam
BGD
批量梯度下降,根据整个训练集计算梯度进行梯度下降。
公式: θ = θ − η △ θ J ( θ ) θ = θ-η△_θJ(θ) θ=θ−η△θJ(θ),其中J(θ)是根据整个训练集计算出来的损失。
优点:
- 当损失函数是凸函数时,BGD能收敛到全局最优,非凸时只能局部最优。
缺点:
- 每次根据全部数据来计算梯度,速度较慢。
- BGD不能够在线训练,不能根据新数据来实时更新模型。
SGD
随机梯度下降。和BGD相反,SGD每次只使用一个训练样本来进行梯度更新。
公式: θ = θ − η △ θ J ( θ : x ( i ) : y ( i ) ) θ = θ-η△_θJ(θ:x^{(i)}:y^{(i)}) θ=θ−η△θJ(θ:x(i):y(i)),其中 J ( θ : x ( i ) : y ( i ) ) J(θ:x^{(i)}:y^{(i)}) J(θ:x(i):y(i))是根据样本 ( x ( i ) : y ( i ) ) (x^{(i)}:y^{(i)}) (x(i):y(i))计算出来的损失。
优点:
- SGD每次只根据一个样本计算梯度,速度较快。
- SGD可以根据新样本实时地更新模型。
缺点:
- SGD在优化过程中损失震荡比较严重。
Momentum(引入了一阶动量)
假设模型在时间t的梯度为
△
J
(
θ
)
△J(θ)
△J(θ),则Momentum的梯度更新方法为:
V
t
=
β
V
t
−
1
+
(
1
−
β
)
△
J
(
θ
)
V_t=βV_{t-1}+(1-β)△J(θ)
Vt=βVt−1+(1−β)△J(θ)
θ
=
θ
−
α
V
t
θ=θ-αV_t
θ=θ−αVt
其中
V
t
V_t
Vt是模型前
1
1
+
β
\frac{1}{1+β}
1+β1步梯度的平均值,β通常为0.9,α为学习率。
优点:
- Momentum引入了一阶动量,使用了Momentum的SGD梯度下降的过程更平滑,震荡更少,收敛也更快。
NAG
对Momentum进行了轻微的修改 V t = β V t − 1 + ( 1 − β ) △ J ( θ − β V t − 1 ) V_t=βV_{t-1}+(1-β)△J(θ-βV_{t-1}) Vt=βVt−1+(1−β)△J(θ−βVt−1) θ = θ − α V t θ=θ-αV_t θ=θ−αVt
也就是,在梯度更新之前看一下Momentum指向的方向,然后在Momentum指向的位置计算梯度并进行更新。
Adagrad(引入了二阶动量)
优化器命中包含Ada,其含义是Adaptive,代表“自适应”,自适应优化器时代来临。
在我们训练模型的初期我们的学习率一般比较大,因为这时我们的位置离最优点比较远;当训练快结束时,我们通常会降低学习率,因为训练快结束时我们离最优点比较近,这时使用大的学习率可能会跳过最优点。Adagrad 能使得参数的学习率在训练的过程中越来越小,公式如下:
θ
=
θ
−
η
∑
t
g
2
+
ϵ
g
t
θ = θ-\frac{η}{\sqrt{\sum_{t}g^2+\epsilon}}g_t
θ=θ−∑tg2+ϵηgt
其中,
g
t
g_t
gt是模型在t时刻的梯度,
∑
t
g
2
\sum_{t}g^2
∑tg2是模型前t个时刻梯度的平方和,
ϵ
\epsilon
ϵ一般为
1
0
−
8
10^{-8}
10−8,防止分母为0.
在训练过程中
∑
t
g
2
+
ϵ
\sqrt{\sum_{t}g^2+\epsilon}
∑tg2+ϵ越来越大,
η
∑
t
g
2
+
ϵ
\frac{η}{\sqrt{\sum_{t}g^2+\epsilon}}
∑tg2+ϵη越来越小,所以lr越来越小,
η
η
η通常为0.01。
优点:
- 自动调节参数的学习率。
缺点:
- 学习率下降会比较快,可能造成学习提早停止。
Adadelta
Adadelta是 对Adagrad的改进,解决了Adagrad优化过程中lr减少导致训练停止的问题。
方法:
不再对过去的梯度平方进行累加,而是改用指数平均的方法进行计算。将
∑
t
g
2
\sum_{t}g^2
∑tg2替换为
(
1
−
γ
)
∑
i
=
0
t
γ
i
g
2
(1-\gamma)\sum_{i=0}^tγ^ig^2
(1−γ)∑i=0tγig2(一阶一样,二阶引入了参数γ)
但此时仍然依赖全局学习率η,为了消除影响,定义新的指数平均方法:
E
[
Δ
θ
2
]
t
=
γ
E
[
Δ
θ
2
]
t
−
1
+
(
1
−
γ
)
Δ
θ
t
2
E[Δθ^2]_t=γE[Δθ^2]_{t-1}+(1-γ)Δθ^2_t
E[Δθ2]t=γE[Δθ2]t−1+(1−γ)Δθt2
Adadelta 把 Adagrad 分母中的梯度平方和换成了梯度平方的指数加权平均,这使得 Adadelta 学习率的下降速度没有 Adagrad 那么快。
Adam
自适应矩估计,将Momentum和Adadelta结合的方法。
同时引入一阶动量和二阶动量。
β
1
β_1
β1以及
β
2
β_2
β2。
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t=β_1m_{t-1}+(1-β_1)g_t
mt=β1mt−1+(1−β1)gt
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
g
t
2
v_t=β_2v_{t-1}+(1-β_2)g_t^2
vt=β2vt−1+(1−β2)gt2
作者发现一阶动量和二阶动量在初始训练时很小,接近为0,因为β值很大,所以重新计算一个偏差来校正:
m
t
^
=
m
t
1
−
β
1
t
\hat{m_t}=\frac{m_t}{1-β_1^t}
mt^=1−β1tmt
v
t
^
=
v
t
1
−
β
2
t
\hat{v_t}=\frac{v_t}{1-β_2^t}
vt^=1−β2tvt
其中,
β
t
β^t
βt代表t次方,所以刚开始训练时,通过除(1-β)就可以很好的修正lr,当epoch越大时候,分母就越接近1,又回到了原设计方程。
β
1
β_1
β1默认为0.9,
β
2
β_2
β2为0.999,
ϵ
\epsilon
ϵ为
1
0
−
8
10^{-8}
10−8.
Nadam
Adam是结合了Momentum和Adadelta,而NGA又是Momentum的改进。
所以Nadam将Momentum的一阶动量换成了NGA,结合了NGA以及Adadelta。
参考资料:
https://www.cnblogs.com/flix/p/13144064.html