动手学深度学习:7.5 AdaGrad算法

7.5 AdaGrad算法

在之前介绍过的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。举个例子,假设目标函数为ff fst的累加效果使学习率不断衰减,自变量在迭代后期的移动幅度较小。

%matplotlib inline
import math
import torch
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2l

def adagrad_2d(x1, x2, s1, s2):
g1, g2, eps = 0.2 x1, 4 x2, 1e-6 # 前两项为自变量梯度
s1 += g1 2
s2 += g2 2
x1 -= eta / math.sqrt(s1 + eps) g1
x2 -= eta / math.sqrt(s2 + eps) g2
return x1, x2, s1, s2

def f_2d(x1, x2):
return 0.1 x1 ** 2 + 2 x2 ** 2

eta = 0.4
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))Copy to clipboardErrorCopied

输出:

epoch 20, x1 -2.382563, x2 -0.158591Copy to clipboardErrorCopied

下面将学习率增大到2。可以看到自变量更为迅速地逼近了最优解。

eta = 2
d2l.show_trace_2d(f_2d, d2l.train_2d(adagrad_2d))Copy to clipboardErrorCopied

输出:

epoch 20, x1 -0.002295, x2 -0.000000Copy to clipboardErrorCopied

7.5.3 从零开始实现

同动量法一样,AdaGrad算法需要对每个自变量维护同它一样形状的状态变量。我们根据AdaGrad算法中的公式实现该算法。

features, labels = d2l.get_data_ch7()

def init_adagrad_states():
s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)
s_b = torch.zeros(1, dtype=torch.float32)
return (s_w, s_b)

def adagrad(params, states, hyperparams):
eps = 1e-6
for p, s in zip(params, states):
s.data += (p.grad.data**2)
p.data -= hyperparams[‘lr’] * p.grad.data / torch.sqrt(s + eps)Copy to clipboardErrorCopied

与7.3节(小批量随机梯度下降)中的实验相比,这里使用更大的学习率来训练模型。

d2l.train_ch7(adagrad, init_adagrad_states(), {‘lr’: 0.1}, features, labels)Copy to clipboardErrorCopied

输出:

loss: 0.243675, 0.049749 sec per epochCopy to clipboardErrorCopied

7.5.4 简洁实现

通过名称为Adagrad的优化器方法,我们便可使用PyTorch提供的AdaGrad算法来训练模型。

d2l.train_pytorch_ch7(torch.optim.Adagrad, {'lr': 0.1}, features, labels)Copy to clipboardErrorCopied

输出:

loss: 0.243147, 0.040675 sec per epochCopy to clipboardErrorCopied

小结

  • AdaGrad算法在迭代过程中不断调整学习率,并让目标函数自变量中每个元素都分别拥有自己的学习率。
  • 使用AdaGrad算法时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)。

参考文献

[1] Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive subgradient methods for online learning and stochastic optimization. Journal of Machine Learning Research, 12(Jul), 2121-2159.


注:除代码外本节与原书此节基本相同,原书传送门

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