AdaGrad的迭代公式如下所示:
Δ
x
t
=
η
∑
i
=
1
t
g
i
2
∗
g
t
\Delta{x_{t}}=\frac{\eta}{\sqrt{\sum_{i=1}^{t}{g_i^2}}}*g_t
Δxt=∑i=1tgi2η∗gt
x
t
=
x
t
−
1
−
Δ
x
t
x_t=x_{t-1}-\Delta{x_t}
xt=xt−1−Δxt 其中
g
t
g_t
gt表示当前迭代次数的梯度值。
因为存放 w 之前的梯度是低效的,所以可以用对先前所有梯度均值(使用RMS即均方根值实现)的一个指数衰减作为代替的实现方法。
更新公式如下: ① 将累计梯度信息从全部历史梯度变为当前时间向前的一个窗口期内的累积:
E
[
g
2
]
t
=
ρ
∗
E
[
g
2
]
t
−
1
+
(
1
−
ρ
)
∗
g
t
2
E[g^2]_t=\rho*E[g^2]_{t-1}+(1-\rho)*g_t^2
E[g2]t=ρ∗E[g2]t−1+(1−ρ)∗gt2 相当于历史梯度信息的累计乘上一个衰减系数
ρ
\rho
ρ,然后用
(
1
−
ρ
)
(1-\rho)
(1−ρ)作为当前梯度的平方加权系数相加。
②然后将上述
E
[
g
t
2
]
E[g_t^2]
E[gt2]开方后,作为每次迭代更新后的学习率衰减系数:
x
t
+
1
=
x
t
−
η
E
[
g
2
]
t
+
ϵ
∗
g
t
{x_{t+1}}=x_t-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}*g_t
xt+1=xt−E[g2]t+ϵη∗gt 记
R
M
S
(
g
t
)
=
E
[
g
2
]
t
+
ϵ
RMS(g_t)=\sqrt{E[g^2]_t+\epsilon}
RMS(gt)=E[g2]t+ϵ,其中
ϵ
\epsilon
ϵ是为了防止分母为0而加上的一个极小值。 这种更新方法解决了对历史梯度一直累加而导致学习率一直下降的问题,当时还是需要自己选择初始的学习率。
改进方法二:Correct Units with Hessian Approximation
通过牛顿法可以知道,牛顿法迭代步长是
f
′
′
(
x
)
f^{\prime\prime}(x)
f′′(x),二阶牛顿迭代公式为(求最小值);
x
t
+
1
=
x
t
−
f
′
(
x
)
f
′
′
(
x
)
=
x
t
−
1
f
′
′
(
x
)
∗
f
′
(
x
)
x_{t+1}=x_t-\frac{f^{\prime}(x)}{f^{\prime\prime}(x)} = x_t - \frac{1}{f^{\prime\prime}(x)}*f^{\prime}(x)
xt+1=xt−f′′(x)f′(x)=xt−f′′(x)1∗f′(x)可以看出牛顿算法的迭代步长是二阶近似的解析解,不需要我们手动指定学习率。 而高阶的牛顿法迭代的步长为
H
e
s
s
i
a
n
\boldsymbol{Hessian}
Hessian矩阵。 AdaDelta算法正是采用了这种思想,采用
H
e
s
s
i
a
n
\boldsymbol{Hessian}
Hessian矩阵的对角线近似
H
e
s
s
i
a
n
\boldsymbol{Hessian}
Hessian矩阵。 公式如下所示:
Δ
x
≈
∂
f
∂
x
∂
2
f
∂
x
2
\Delta{x}\approx{\frac{\frac{\partial{f}}{\partial{x}}}{\frac{\partial^2{f}}{\partial{x^2}}}}
Δx≈∂x2∂2f∂x∂f 于是有:
1
∂
2
f
∂
x
2
=
Δ
x
∂
f
∂
x
\frac{1}{{\frac{\partial^2{f}}{\partial{x^2}}}}=\frac{\Delta{x}}{\frac{\partial{f}}{\partial{x}}}
∂x2∂2f1=∂x∂fΔx 而更新公式为:
x
t
+
1
=
x
t
−
1
∂
2
f
∂
x
2
∗
g
t
=
Δ
x
∂
f
∂
x
∗
g
t
x_{t+1}=x_t-\frac{1}{{\frac{\partial^2{f}}{\partial{x^2}}}}*g_t=\frac{\Delta{x}}{\frac{\partial{f}}{\partial{x}}}*g_t
xt+1=xt−∂x2∂2f1∗gt=∂x∂fΔx∗gt
同理对分子分母按照上一个方法进行处理,可以得到以下公式:
其中假设x附近的曲率是平滑的,而
x
t
+
1
x_{t+1}
xt+1可以近似
x
t
x_t
xt
Δ
x
=
R
M
S
[
(
Δ
x
)
]
t
−
1
R
M
S
[
g
]
t
∗
g
t
\Delta{x}=\frac{RMS[(\Delta{x})]_{t-1}}{RMS[g]_t}*g_t
Δx=RMS[g]tRMS[(Δx)]t−1∗gt
x
t
+
1
=
x
t
−
Δ
x
x_{t+1}=x_t-\Delta{x}
xt+1=xt−Δx 其中
g
t
g_t
gt为本次迭代的梯度。