万丈高楼从地起。我们日常直接使用优化器,但各类优化器有什么不同,各有什么特别,我一直没主动去了解。今天就来学习一下,记录并做笔记。
现在的SGD普遍指的是mini-batch SGD。最简单的优化器,即参数往梯度下降的最快方向更新。
θ
?
=
l
r
×
g
r
a
d
heta -= lr imes grad
θ?=lr×grad
梯度下降法一个很明显的问题就是,当batchsize比较小的时候,寻找最优值得速度很慢,因为方向基本呈震荡型。就像是黑暗中摸着手电筒探索道路。 如果batchsize比较小,则优化的方向仅是适合这批样本,而一小部分样本远不能代表数据集的整体分布,所以以这批样本求到的梯度来更新参数,就会出现震荡,而且SGD容易陷入局部极限值点。一个解决办法就是添加动量。
动量来自物理学的运动能量累积。 对于SGD来说,仅凭借当前梯度负方向来更新参数不够全面,那就融合一下上一步的梯度方向。
d
e
l
t
a
=
?
g
r
a
d
+
m
o
m
e
n
t
u
m
?
o
l
d
_
g
r
a
d
delta = - grad + momentum * old\_grad
delta=?grad+momentum?old_grad
θ
+
=
l
r
×
d
e
l
t
a
heta += lr imes delta
θ+=lr×delta
momentum 一般设置为0.8-0.9。 即当前迭代方向,也要参考上一次的方向,用一个小于1的衰减系数融合。
Ada(adaptive)grad。 更新的参数一般是向量或者矩阵,有些参数更新的步长大,有些参数更新的步长短。现在想统一一下步长。learning rate是作用在所有的参数值上的,不能实现为每个参数设置不同的步长的目的。那么该用什么东西描述参数的一种尺度呢,有了一个尺度,我们就可以用尺度衡量参数该走的距离长短。AdaGrad是采用了梯度平方和。
假如某个参数的梯度很大,那么他的梯度和也很大。梯度之和跟之前的梯度加在一起,求个sqrt作为分母,就会让这个参数的梯度变小。
换句话说,梯度大的参数的步长小,梯度小的步长大。
g
r
a
d
_
s
u
m
=
p
r
e
v
_
g
r
a
d
_
s
u
m
+
g
r
a
d
2
grad\_sum = prev\_grad\_sum + grad^2
grad_sum=prev_grad_sum+grad2
d
e
l
t
a
=
?
g
r
a
d
g
r
a
d
_
s
u
m
delta = - \frac{grad}{\sqrt {grad\_sum}}
delta=?grad_sum?grad?
θ
+
=
l
r
×
d
e
l
t
a
heta += lr imes delta
θ+=lr×delta
这样的话,参数的梯度大小自身会影响走的步长。实现每个参数比较均匀的更新。
但是AdaGrad有个致命问题。当迭代次数增大之后,因为我们对梯度求得是平方和,则
g
r
a
d
_
s
u
m
grad\_sum
grad_sum会越来越大。则每个参数最后更新的步长越来越小。则训练速度太缓慢。
AdaGrad的弱点是可以改进的,这就是RMSProp。其实我们只要控制
g
r
a
d
_
s
u
m
grad\_sum
grad_sum不要太大就行了。因为引入衰减因子。
g
r
a
d
_
s
u
m
=
p
r
e
v
_
g
r
a
d
_
s
u
m
×
d
e
c
a
y
+
g
r
a
d
2
×
(
1
?
d
e
c
a
y
)
grad\_sum = prev\_grad\_sum imes decay+ grad^2 imes (1- decay)
grad_sum=prev_grad_sum×decay+grad2×(1?decay)
d
e
l
t
a
=
?
g
r
a
d
g
r
a
d
_
s
u
m
delta = - \frac{grad}{\sqrt {grad\_sum}}
delta=?grad_sum?grad?
θ
+
=
l
r
×
d
e
l
t
a
heta += lr imes delta
θ+=lr×delta
在统计
g
r
a
d
_
s
u
m
grad\_sum
grad_sum的时候,用decay和(1-decay)作为系数,这样的话,得到的梯度平方和不至于太大。
Adaptive moment Esitmation几乎是最常使用的优化器。它集成了动量和梯度和的两个优点。那么理所应当有两个超参数,beta1, beta2. 分别负责融合动量和梯度和。
m
o
m
e
m
t
=
?
g
r
a
d
×
(
1
?
b
e
t
a
1
)
+
o
l
d
_
g
r
a
d
×
b
e
t
a
2
momemt = - grad imes (1-beta1) + old\_grad imes beta2
momemt=?grad×(1?beta1)+old_grad×beta2
g
r
a
d
_
s
u
m
=
?
g
r
a
d
2
×
(
1
?
b
e
t
a
2
)
+
p
r
e
v
_
g
r
a
d
_
s
u
m
×
b
e
t
a
2
grad\_sum = -grad^2 imes (1-beta2) + prev\_grad\_sum imes beta2
grad_sum=?grad2×(1?beta2)+prev_grad_sum×beta2
d
e
l
t
a
=
?
m
o
m
e
n
t
g
r
a
d
_
s
u
m
delta = - \frac{moment}{\sqrt{grad\_sum}}
delta=?grad_sum?moment?
θ
+
=
d
e
l
t
a
×
l
r
heta += delta imes lr
θ+=delta×lr
Beta1是一阶矩梯度之和(动量之和)的衰减率,通常设置为0.9。 Beta2是二阶矩梯度平方和的衰减率,通常设置为0.999。