AdaDelta算法

记录一下自己的学习过程~也能让自己的印象更深吧
AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷,下面先介绍一下AdaGrad算法优点和以及存在的问题:

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=xt1Δxt
其中 g t g_t gt表示当前迭代次数的梯度值。

  • 优点
    学习率将随着梯度的倒数增长,也就是说较大梯度具有较小的学习率,而较小的梯度具有较大的学习率,可以解决普通的sgd方法中学习率一直不变的问题
  • 缺点
    还是需要自己手动指定初始学习率,而且由于分母中对历史梯度一直累加,学习率将逐渐下降至0,并且如果初始梯度很大的话,会导致整个训练过程的学习率一直很小,从而导致学习时间变长。

而AdaDelta算法的提出就是为了解决上述的问题,AdaDelta有两种解决方案:

改进方法一:Accumulate Over Window

  • 在一个窗口w中对梯度进行求和,而不是对梯度一直累加
  • 因为存放 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]t1+(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=xtE[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}=x_t-\frac{f^{\prime}(x)}{f^{\prime\prime}(x)} xt+1=xtf(x)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}}}} Δxx22fxf
于是有:
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}}} x22f1=xfΔ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=xtx22f1gt=xfΔxgt

同理对分子分母按照上一个方法进行处理,可以得到以下公式:

  • 其中假设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)]t1gt
    x t + 1 = x t − Δ x x_{t+1}=x_t-\Delta{x} xt+1=xtΔx
    其中 g t g_t gt为本次迭代的梯度。
  • 由于 R M S RMS RMS永远为正,所以能保证更新的方向一直为梯度的负方向
  • 分子作为一个加速项,作为动量在时间窗口 w w w上积累先前的梯度。
    下面是论文中的算法展示:
    AdaDelta算法_第1张图片

有时间自己用python实现一下然后再贴上来

参考文献
ADADELTA: AN ADAPTIVE LEARNING RATE METHOD(2012)

你可能感兴趣的:(深度学习)