sgd
假设有一个训练任务,其中样本构成为
{
(
x
(
i
)
,
y
(
i
)
)
}
∣
i
=
1
m
\{(x^{(i)}, y^{(i)})\}|^m_{i=1}
{(x(i),y(i))}∣i=1m,其损失函数为
L
(
θ
)
=
−
l
o
g
∏
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
−
∑
i
=
1
m
l
o
g
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
L(\theta)= -log\prod_{i=1}^{m}p\left ( y^{(i)}|x^{(i)} ;\theta \right ) = -\sum_{i=1}^{m}logp\left ( y^{(i)}|x^{(i)} ;\theta \right )
L(θ)=−logi=1∏mp(y(i)∣x(i);θ)=−i=1∑mlogp(y(i)∣x(i);θ)
对模型参数
θ
\theta
θ来说,其梯度为
g
o
r
i
g
=
∂
L
(
θ
)
∂
θ
=
−
∂
∑
i
=
1
m
l
o
g
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
∂
θ
=
−
∑
i
=
1
m
∂
l
o
g
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
∂
θ
g_{orig}=\frac{\partial L(\theta)}{\partial \theta}=-\frac{\partial \sum_{i=1}^{m}logp\left ( y^{(i)}|x^{(i)} ;\theta \right )}{\partial \theta}=-\sum_{i=1}^{m}\frac{\partial logp\left ( y^{(i)}|x^{(i)} ;\theta \right )}{\partial \theta}
gorig=∂θ∂L(θ)=−∂θ∂∑i=1mlogp(y(i)∣x(i);θ)=−i=1∑m∂θ∂logp(y(i)∣x(i);θ)
参数更新公式为:
θ
:
=
θ
−
ϵ
∂
L
(
θ
)
∂
θ
=
θ
−
ϵ
g
o
r
i
g
\theta :=\theta-\epsilon\frac{\partial L(\theta)}{\partial \theta}=\theta-\epsilon g_{orig}
θ:=θ−ϵ∂θ∂L(θ)=θ−ϵgorig
其中
ϵ
\epsilon
ϵ是学习率。可以看出,每更新一次参数需要计算所有的样本,因而很耗费时间,而batch-sgd的思路为随机找batch_size个样本,仅利用这些样本就完成
θ
\theta
θ的一次参数更新,公式如下:
g
=
−
∑
i
=
1
b
a
t
c
h
_
s
i
z
e
∂
l
o
g
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
∂
θ
g = -\sum_{i=1}^{batch\_size}\frac{\partial logp\left ( y^{(i)}|x^{(i)} ;\theta \right )}{\partial \theta}
g=−i=1∑batch_size∂θ∂logp(y(i)∣x(i);θ)
参数更新公式为:
θ
:
=
θ
−
ϵ
g
\theta :=\theta-\epsilon g
θ:=θ−ϵg
注意BGD、SGD和MBGD的区别:
BGD:batch gradient descent,全量样本进行梯度更新。
SGD:stochastic gradient descent,随机找一个样本进行梯度更新。
momentum
根据<batch-sgd>中的讲述,参数每次更新 − ϵ g -\epsilon g −ϵg,这个恒定值会带来很多麻烦,例如:
- 如果梯度下降过程中曲面太平坦,如果还按照上述步伐走,梯度下降地会比较缓慢,例如下图所示:
- 如果梯度下降过程中太陡峭,下降时会一直震荡,例如下图所示:
上述两种情况都没办法使损失稳定下降。针对上述缺点,momentum引入了
v
v
v,即梯度的改变量,参数更新为如下公式,其中
α
\alpha
α为衰减力度,代表的含义是原先的梯度对当前参数更新的影响程度:
v
=
α
v
−
ε
g
θ
=
θ
+
v
\begin{matrix} v=\alpha v - \varepsilon g\\ \theta = \theta+ v \end{matrix}
v=αv−εgθ=θ+v
多次迭代公式如下,其中 v 1 = − ε g 1 v_1=-\varepsilon g_1 v1=−εg1
1 s t : θ = θ + v 1 = θ − ε g 1 2 n d : θ = θ + v 2 = θ + α v 1 − ε g 2 = θ − ε ( α g 1 + g 2 ) . . . \begin{matrix} 1st: \theta=\theta+v_1 = \theta-\varepsilon g_1\\ 2nd: \theta=\theta+v_2 = \theta + \alpha v_1 -\varepsilon g_2 = \theta -\varepsilon (\alpha g_1+g_2)\\ ... \end{matrix} 1st:θ=θ+v1=θ−εg12nd:θ=θ+v2=θ+αv1−εg2=θ−ε(αg1+g2)...
通过第二个公式可以得到:如果本次和上次梯度符号相同,损失则会加速下降(幅度变大),从而解决原先下降太慢的问题;如果符号相反,则这次更新和上次相互抑制,减缓震荡。
adagrad
momentum一个缺点在于对于
θ
\theta
θ的每一维数据,其学习率都是相同的,adagrad则对低频参数进行较大更新,高频参数进行较小更新,公式如下:
θ
t
+
1
,
i
=
θ
t
,
i
−
ϵ
G
t
,
i
+
σ
g
t
,
i
\theta_{t+1,i}=\theta_{t,i}-\frac{\epsilon}{\sqrt{G_{t,i}+\sigma}}g_{t,i}
θt+1,i=θt,i−Gt,i+σϵgt,i
其中 θ t , i \theta_{t,i} θt,i代表第t轮更新 θ \theta θ的第i维数据, G t , i = ∑ k = 1 t g t , i 2 G_{t,i}=\sum_{k=1}^tg_{t,i}^2 Gt,i=∑k=1tgt,i2, σ \sigma σ为平滑项,可以看出对于低频参数,其 G t , i G_{t,i} Gt,i较小,因而参数更新的幅度会大一些,反之则会小一些。
adadelta
adagrad的缺点在于在梯度更新的中后期,所有参数的
G
t
,
i
G_{t,i}
Gt,i都会很大,从而阻挠梯度更新的进行,因而adadelta将梯度
G
t
,
i
G_{t,i}
Gt,i改为
E
[
g
2
]
t
E[g^2]_t
E[g2]t,具体公式如下所示,从而通过
γ
\gamma
γ控制梯度更新的过程。
E
[
g
2
]
t
=
γ
E
[
g
2
]
t
+
(
1
−
γ
)
g
t
2
E[g^2]_t=\gamma E[g^2]_t+(1-\gamma)g^2_t
E[g2]t=γE[g2]t+(1−γ)gt2
RMSprop
adadelta的特殊情况,即 γ = 0.9 \gamma=0.9 γ=0.9时adadelta的梯度更新公式。
adam
对
g
t
2
g^2_t
gt2和
g
t
g_t
gt同时采用类似momentum的操作,公式如下所示,其中
m
t
m_t
mt代表的是
g
t
g_t
gt的momentum,
v
t
v_t
vt代表的是
g
t
2
g^2_t
gt2的momentum。
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
g
t
2
\begin{matrix} m_t=\beta_1m_{t-1}+(1-\beta_1)g_t\\ v_t=\beta_2v_{t-1}+(1-\beta_2)g^2_t \end{matrix}
mt=β1mt−1+(1−β1)gtvt=β2vt−1+(1−β2)gt2
而为了防止每轮参数更新后
m
t
m_t
mt和
v
t
v_t
vt变得趋近于0,则认为对这两个参数进行放大,公式如下所示:
m
t
^
=
m
t
1
−
β
1
t
v
t
^
=
v
t
1
−
β
2
t
\begin{matrix} \hat{m_t}=\frac{m_t}{1-\beta_1^t}\\ \hat{v_t}=\frac{v_t}{1-\beta_2^t} \end{matrix}
mt^=1−β1tmtvt^=1−β2tvt
参数更新公式如下所示,由于添加了两层momentum的保险,adam在实际使用过程中比其他的优化器效果都好,亲试有效!
θ
t
+
1
=
θ
t
−
ϵ
v
t
^
+
σ
m
t
^
\theta_{t+1}=\theta_{t}-\frac{\epsilon}{\sqrt{\hat{v_t}+\sigma}}\hat{m_t}
θt+1=θt−vt^+σϵmt^
实践过程中,也可以为学习率添加decay_rate,即随着训练步数的变大学习率会变小,使参数学习过程变得更加稳定,不会在训练后期出现震荡的情况。