9 Adadelta算法
- Adadelta是AdaGrad的另一种变体主要区别在于前者减少了学习率适应坐标的数量。此外,广义上Adadelta被称为没有学习率,因为它使用变化量本身作为未来变化的校准。
9.1 Adadelta算法
Adadelta使用两个状态变量,$s_t$用于存储梯度二阶导数的泄露平均值,$\Delta x_t$用于存储模型本身中参数变化二阶导数的泄露平均值。
$$\mathbf{s}t = \rho \mathbf{s}{t-1} + (1-\rho) \mathbf{g}^2_t $$
$$\mathbf{x}t = \mathbf{x}{t-1} - \mathbf{ g ‘}_t$$其中与RMSProp的区别在于使用重新缩放的梯度$g′_t$执行更新:
$$\mathbf{g}’t = \frac{\sqrt{\Delta \mathbf{x}{t-1} + \epsilon}}{\sqrt{\mathbf{s}_t + \epsilon}} \odot \mathbf{g}_t$$
$$\Delta \mathbf{x}t = \rho \Delta \mathbf{x}{t-1} + (1-\rho) \mathbf{g}’^2_t$$- 其中$\Delta x_t$是重新缩放梯度的平方$\mathbf{g}’^2_t$的泄漏平均值,$\Delta x_0$初始化为0。
9.2 从零实现
1 | %matplotlib inline |
loss: 0.245, 0.011 sec/epoch
9.3 简洁实现
1 | trainer = torch.optim.Adadelta |
loss: 0.243, 0.009 sec/epoch