优化算法
概念
优化算法的功能是通过改善训练方式来最大化或者最小化损失函数。模型内部有些参数,是用来计算测试集中目标值
Y
Y
Y的真实值和预测值的偏差程序,基于这些参数就形成了损失函数
E
(
x
)
E(x)
E(x)。在有效地训练模型并产生准确结果时,模型的内部参数起到了非常重要的作用。
动量
动量内容可以参考: 动量,EMA指数移动平均
动量特点:
- 下降初期时,使用上一次参数更新,下降方向一致,能够很好地进行加速。
- 下降中后期,在局部最小值来回震荡,使得更新幅度增大,跳出局部最优
- 在梯度改变方向时,能够减少更新。
框架
优化算法大致经历了SGD –>SGDM –>AdaGrad –>AdaDelta —>Adam —>Ndam 的发展过程。以下是优化算法的框架:
设待优化参数为
ω
\omega
ω,目标函数为
f
ω
f{\omega}
fω,初始化学习率为:
l
r
lr
lr。对于每个epoch
t
t
t:
- 计算目标梯度关于当前参数的梯度:
g
t
=
▽
f
(
ω
t
)
g_t = \bigtriangledown f(\omega_t)
gt?=▽f(ωt?)
- 根据历史梯度计算一阶动量和二阶动量:
m
t
=
?
(
g
1
,
g
2
,
.
.
.
g
t
)
;
V
t
=
φ
(
g
1
,
g
2
,
.
.
.
,
g
t
)
m_t=\phi(g_1, g2_,...g_t); V_t=\varphi(g_1, g_2, ..., g_t)
mt?=?(g1?,g2,?...gt?);Vt?=φ(g1?,g2?,...,gt?)
- 计算当前时刻下降梯度:
η
=
a
?
m
t
V
t
\eta=a*\frac{m_t}{\sqrt{V_t}}
η=a?Vt?
?mt??
- 根据下降梯度进行更新:
ω
t
+
1
=
ω
t
?
η
t
\omega_{t+1} = \omega_t-\eta_t
ωt+1?=ωt??ηt?
SGD
?? 为了避免SGD和标准梯度下降中存在的问题,一个改进的方法为小批量梯度下降,对每个批次中的n个训练样本,小批量梯度下降只执行一次更新。使用小批量梯度下降的优点是:
- 减少参数频繁更新,得到更好的收敛效果
- 可以使用最新的深层学习库中通用的矩阵优化方法,使计算小批量数据的梯度更加高效
使用SGD缺点:
- 很难选择合适的学习率。太小的学习率会导致网络收敛过去缓慢,而学习率太大会影响收敛,并导致损失函数在最小值波动,出现梯度发散
- 相同的学习率并不适用于所有的参数更新。如果训练集数据很稀疏,且特征频率非常不同,则不应该在相同的程度上进行参数更新。
- 在神经网络中,最小化非凸误差函数的另一个关键挑战是避免陷于多个其他局部最小值中。
Momentum
????
NAG
??
AdaGrad
Adagrad方法是通过参数来调整合适的学习率η,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。在时间步长中,Adagrad方法基于每个参数计算的过往梯度,为不同参数θ设置不同的学习率。
Adagrad方法的主要好处是,不需要手工来调整学习率。大多数参数使用了默认值0.01,且保持不变。Adagrad方法的主要缺点是,学习率η总是在降低和衰减。因为每个附加项都是正的,在分母中累积了多个平方梯度值,故累积的总和在训练期间保持增长。这反过来又导致学习率下降,变为很小数量级的数字,该模型完全停止学习,停止获取新的额外知识。因为随着学习速度的越来越小,模型的学习能力迅速降低,而且收敛速度非常慢,需要很长的训练和学习,即学习速度降低。因此AdaGrad需要改善学习率不断下降的问题。
RMSProp/AdaDelta
AdaDelta方法的另一个优点是,已经不需要设置一个默认的学习率。目前已完成的改进1) 为每个参数计算出不同学习率;2) 也计算了动量项momentum;3) 防止学习率衰减或梯度消失等问题的出现。 还可以做什么改进?在之前的方法中计算了每个参数的对应学习率,但是为什么不计算每个参数的对应动量变化并独立存储呢?这就是Adam算法提出的改良点。
Adam
Ndam
参考
- 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
- 深度学习中的优化算法串讲
- 深度学习最全优化方法总结比较:SGD,Adagrad,Adadelta,Adam,Adamax,Nadam
|