1.AdaGrad的缺点
前面在讲到AdaGrad的时候,我们也提到了他的缺点:其梯度累积的历史是单调递增的,导致训练越往后期学习率越小,学习率是一个单调递减不可逆的过程。因此我们可以只关注一段时间内梯度的累积,而不用关心历史所有时间梯度的累积,这样可以使得学习率不会一直保持单调递减,也是AdaDelta算法中Delta的由来。
2.AdaDelta/RMSProp优化
AdaDelta/RMSProp算法,主要是通过一个衰减系数,来控制历史梯度对当前的影响。而指数移动的平均值,差不多是过去一段时间的平均值。因此二阶动量一段时间内的累积可以采用如下类似方式:
V
t
=
β
V
t
−
1
+
(
1
−
β
)
g
t
2
V_t = \beta V_{t-1} + (1- \beta) g_t ^ 2
Vt=βVt−1+(1−β)gt2
通过以上改动,可以避免二阶动量一直累积单调递增,从而导致训练提前结束或者训练不充分的情况。
3.算法流程
假定初始参数为
θ
\theta
θ, 初始全局学习率
ϵ
\epsilon
ϵ,小常数
δ
\delta
δ主要为了数值计算稳定,一般可以取
1
0
−
7
10^{-7}
10−7
算法步骤:
初始化梯度历史累积
r
=
0
r=0
r=0
如果不满足终止条件,如下步骤循环:
1.从训练集中采样m个样本
x
(
1
)
x^{(1)}
x(1),
x
(
2
)
x^{(2)}
x(2)…,
x
(
m
)
x^{(m)}
x(m),对应的标签为
y
(
i
)
y^{(i)}
y(i)。
2.计算当前梯度:
g
=
▽
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g = \bigtriangledown_\theta \sum_i L(f(x^{(i)}; \theta), y^{(i)})
g=▽θ∑iL(f(x(i);θ),y(i))
3.累积历史梯度的平方和:
r
=
β
r
+
(
1
−
β
)
g
⊙
g
r = \beta r + (1-\beta)g \odot g
r=βr+(1−β)g⊙g
4.计算梯度更新:
Δ
θ
=
ϵ
δ
+
r
⊙
g
\Delta \theta = \frac {\epsilon}{\delta + \sqrt r} \odot g
Δθ=δ+rϵ⊙g
5.更新参数:
θ
=
θ
−
Δ
θ
\theta = \theta - \Delta \theta
θ=θ−Δθ
从上面的算法流程不难看出,AdaDelta/RMSProp与AdaGrad的区别,其实就在第三步累积历史梯度的平方和,此时多了一个超参数 β \beta β,用来控制历史累积梯度对当前的影响程度。