1. 梯度下降和随机梯度下降
1.1 一阶梯度下降
一维函数泰勒展开为:
f
(
x
+
ϵ
)
≈
f
(
x
)
+
ϵ
f
′
(
x
)
f(x+\epsilon) \approx f(x)+\epsilon f^\prime(x)
f(x+ϵ)≈f(x)+ϵf′(x)
将
ϵ
\epsilon
ϵ 替换为
−
η
f
′
(
x
)
-\eta f^\prime(x)
−ηf′(x)得到:
f
(
x
−
η
f
′
(
x
)
)
≈
f
(
x
)
−
η
f
′
(
x
)
2
f(x - \eta f^\prime(x)) \approx f(x)-\eta f^\prime(x)^2
f(x−ηf′(x))≈f(x)−ηf′(x)2
如果导数
f
′
(
x
)
≠
0
f^\prime (x) \neq0
f′(x)=0,那么
η
f
′
(
x
)
2
>
0
\eta f^ \prime(x)^2>0
ηf′(x)2>0, 所以
f
(
x
−
η
f
′
(
x
)
)
<
=
f
(
x
)
f(x-\eta f^ \prime (x)) <=f(x)
f(x−ηf′(x))<=f(x)
通过使用
x
←
x
−
η
f
′
(
x
)
x\leftarrow x-\eta f^ \prime(x)
x←x−ηf′(x)
更新
x
x
x,函数
f
(
x
)
f(x)
f(x)的值会降低。
1.2 学习率
上述梯度下降算法中 η \eta η 叫做学习率,是一个超参数。太小会导致更新缓慢,太大会导致震荡不收敛。
1.3其他
多维梯度下降:
目标函数的输入是
x
=
[
x
1
,
x
2
.
.
.
x
d
]
T
x=[x_1,x_2...x_d]^T
x=[x1,x2...xd]T,目标函数f(x)的梯度是一个由
d
d
d个偏导数组成的向量:
∇
x
f
(
x
)
=
[
∂
f
(
x
)
∂
x
1
,
∂
f
(
x
)
∂
x
2
,
.
.
.
,
∂
f
(
x
)
∂
x
d
]
T
\nabla _xf(x)=[\frac {\partial f( x)}{\partial x_1}, \frac {\partial f( x)}{\partial x_2},...,\frac {\partial f( x)}{\partial x_d} ]^T
∇xf(x)=[∂x1∂f(x),∂x2∂f(x),...,∂xd∂f(x)]T
更新方式变为:
x
←
x
−
η
∇
f
(
x
)
x\leftarrow x-\eta \nabla f(x)
x←x−η∇f(x)
随机梯度下降:
由于深度学习任务里,数据量很大,如果使用所有数据,梯度下降每次迭代的计算开销很高。随机梯度下降在每次迭代时,随机均匀采样一个样本用来计算。
2. 动量法
问题:
目标函数为
f
(
x
)
=
0.1
x
1
2
+
2
x
2
2
f(x) =0.1x_1^2+2x_2^2
f(x)=0.1x12+2x22时,迭代时梯度下降可能会震荡下降或者发散。
动量法:
在第
t
t
t次迭代时,随机梯度为
g
t
g_t
gt,则:
v
t
←
γ
v
t
−
1
+
η
t
g
t
v_t \leftarrow \gamma v_{t-1} + \eta _tg_t
vt←γvt−1+ηtgt
x
t
←
x
t
−
1
−
v
t
x_t \leftarrow x_{t-1}-v_t
xt←xt−1−vt
说明:
选择比较小的学习率,可以保障自变量在梯度较大的维度上不发散,但是会导致在梯度较小的维度上迭代过慢。
3. AdaGrad算法
目标函数为
f
(
x
)
=
0.1
x
1
2
+
2
x
2
2
f(x) =0.1x_1^2+2x_2^2
f(x)=0.1x12+2x22时,由于
x
1
x_1
x1和
x
2
x_2
x2使用了相同的学习率,所以会产生震荡。
AdaGrad根据自变量在每个维度的梯度值的大小调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。
AdaGrad:
在第
t
t
t次迭代时,所有随机梯度
g
t
g_t
gt按元素的平方累加到
S
t
S_t
St:
s
t
←
s
t
−
1
+
g
t
⨀
g
t
s_t \leftarrow s_{t-1}+g_t\bigodot g_t
st←st−1+gt⨀gt
x
t
←
x
t
−
1
−
η
s
t
+
ϵ
⨀
g
t
x_t \leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}} {\bigodot g_t}
xt←xt−1−st+ϵη⨀gt
说明:
由于
s
t
s_t
st的增大,学习率将不断衰减,可能后面下降缓慢。
每个自变量 x t x_t xt拥有自己的学习率。
4. RMSProp算法
由于AdaGrad在后期可能由于学习率过小,找不到有用的解,RMSProp算法对此进行了优化。
RMSProp:
不同于AdaGrad算法,RMSProp将梯度按元素平方做指数加权移动平均:
s
t
←
γ
s
t
−
1
+
(
1
−
γ
)
g
t
⨀
g
t
s_t \leftarrow \gamma s_{t-1}+(1-\gamma)g_t \bigodot g_t
st←γst−1+(1−γ)gt⨀gt
x
t
←
x
t
−
1
−
η
s
t
+
ϵ
⨀
g
t
x_t \leftarrow x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\bigodot g_t
xt←xt−1−st+ϵη⨀gt
5. Adam算法
在RMSProp算法上进一步进行优化
Adam算法:
首先对随机梯度
g
t
g_t
gt进行指数加权平均,得到
t
t
t时刻的动量:
v
t
←
β
1
v
t
−
1
+
(
1
−
β
1
)
g
t
v_t \leftarrow \beta _1 v_{t-1}+(1-\beta _1)g_t
vt←β1vt−1+(1−β1)gt
再和RMSProp中一样,将
g
t
g_t
gt按指数加权平均得到
s
t
s_t
st
s
t
←
β
2
s
t
−
1
+
(
1
−
β
2
)
g
t
⨀
g
t
s_t \leftarrow \beta _2 s_{t-1}+(1-\beta _2)g_t \bigodot g_t
st←β2st−1+(1−β2)gt⨀gt
由于
β
1
=
0.9
\beta_1 =0.9
β1=0.9时,
v
1
=
0.1
g
1
v_1=0.1g_1
v1=0.1g1,
v
1
v_1
v1就会比较小,需要做一下修正:
v
t
^
←
v
t
1
−
β
1
′
\hat{v_t} \leftarrow \frac{v_t}{1-\beta^ \prime _1}
vt^←1−β1′vt
s
t
^
←
s
t
1
−
β
2
′
\hat{s_t} \leftarrow \frac{s_t}{1-\beta^ \prime _2}
st^←1−β2′st
则:
g
t
′
←
η
v
t
^
s
t
^
+
ϵ
g^\prime _t \leftarrow \frac{\eta\hat{v_t}}{\sqrt{\hat{s_t}} +\epsilon}
gt′←st^+ϵηvt^
x
t
←
x
t
−
1
−
g
t
′
x_t \leftarrow x_{t-1}-g^ \prime _t
xt←xt−1−gt′