SGD
w
=
w
−
l
r
∗
∂
w
w = w - lr*\partial w
w=w−lr∗∂w 其中
l
r
lr
lr是学习速率
∂
w
=
∂
l
o
s
s
∂
w
\partial w = \frac{\partial loss}{\partial w}
∂w=∂w∂loss
sgd_momentum
v
=
m
u
∗
v
−
l
r
∗
∂
w
v=mu*v-lr*\partial w
v=mu∗v−lr∗∂w
w
=
w
+
v
w = w + v
w=w+v
其中
m
u
∈
[
0
,
1
]
mu \in [0,1]
mu∈[0,1]是momentum,一般
m
u
=
0.9
mu=0.9
mu=0.9,
v
v
v是中间变量,令
w
w
w更新更加平缓
后续改进的思路是不同参数自适应的采用不同的学习速率,比如利用对于前一次变化较大的参数降低起学习速率,保持学习的平滑
rmsprop
c
a
c
h
e
=
d
e
c
a
y
∗
c
a
c
h
e
+
(
1
−
d
e
c
a
y
)
∗
(
∂
w
)
2
cache = decay * cache + (1-decay) * (\partial w)^2
cache=decay∗cache+(1−decay)∗(∂w)2
w
=
w
−
l
r
∗
∂
w
c
a
c
h
e
+
ϵ
w = w - lr * \frac{\partial w}{\sqrt{cache}+\epsilon}
w=w−lr∗cache+ϵ∂w
其中
d
e
c
a
y
∈
[
0
,
1
]
decay \in [0,1]
decay∈[0,1] 一般取值0.99
c
a
c
h
e
cache
cache记录
∂
w
\partial w
∂w幅度平方值,幅度变化大的参数降低学习速率,令
w
w
w更新平缓。
随着训练进度,
c
a
c
h
e
cache
cache的值逐渐变大,导致实际
l
r
lr
lr逐渐降低,学习速率越来越慢,这是一个缺陷。
adam
m
=
β
1
∗
m
+
(
1
−
β
1
)
∗
∂
w
m=\beta_1 * m + (1-\beta_1) * \partial w
m=β1∗m+(1−β1)∗∂w
m
t
=
m
1
−
β
1
t
m_t = \frac{m}{1-\beta_1^t}
mt=1−β1tm
v
=
β
2
∗
v
+
(
1
−
β
2
)
∗
(
∂
w
)
2
v=\beta_2*v + (1-\beta_2)*(\partial w)^2
v=β2∗v+(1−β2)∗(∂w)2
v
t
=
v
1
−
β
2
t
v_t = \frac{v}{1-\beta_2^t}
vt=1−β2tv
w
=
w
−
l
r
∗
m
t
v
t
+
ϵ
w = w - lr * \frac{m_t}{\sqrt{v_t}+\epsilon}
w=w−lr∗vt+ϵmt
其中
t
t
t是训练进度,比如更新次数,或epoch
β
1
∈
[
0
,
1
]
\beta_1 \in [0,1]
β1∈[0,1] 一般取值0.9
β
2
∈
[
0
,
1
]
\beta_2 \in [0,1]
β2∈[0,1] 一般取值0.999
m
m
m和
v
v
v分别是平滑后的
∂
w
\partial w
∂w和
(
∂
w
)
2
(\partial w)^2
(∂w)2
m
t
m_t
mt和
v
t
v_t
vt避免训练启动阶段训练速度太慢(因为
m
m
m和
v
v
v初始化都是0,训练最开始的一段时间二者都接近0)