1. RMSProp算法介绍
%matplotlib inline import math import torch import sys sys.path.append("..") import d2lzh_pytorch as d2l def rmsprop_2d(x1, x2, s1, s2): g1, g2, eps = 0.2 * x1, 4 * x2, 1e-6 s1 = gamma * s1 + (1 - gamma) * g1 ** 2 s2 = gamma * s2 + (1 - gamma) * 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, gamma = 0.4, 0.9 d2l.show_trace_2d(f_2d, d2l.train_2d(rmsprop_2d))
输出:
epoch 20, x1 -0.010599, x2 0.000000
2. 从零实现RMSProp算法
接下来按照RMSProp算法中的公式实现该算法。
features, labels = d2l.get_data_ch7() def init_rmsprop_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 rmsprop(params, states, hyperparams): gamma, eps = hyperparams['gamma'], 1e-6 for p, s in zip(params, states): s.data = gamma * s.data + (1 - gamma) * (p.grad.data)**2 p.data -= hyperparams['lr'] * p.grad.data / torch.sqrt(s + eps)
我们将初始学习率设为0.01,并将超参数γ \gammaγ设为0.9。此时,变量s t \boldsymbol{s}_tst可看作是最近1 / ( 1 − 0.9 ) = 10 1/(1-0.9) = 101/(1−0.9)=10个时间步的平方项g t ⊙ g t \boldsymbol{g}_t \odot \boldsymbol{g}_tgt⊙gt的加权平均。
d2l.train_ch7(rmsprop, init_rmsprop_states(), {'lr': 0.01, 'gamma': 0.9}, features, labels)
输出:
loss: 0.243452, 0.049984 sec per epoch
3. Pytorch简洁实现RMSProp算法–optim.RMSprop
通过名称为RMSprop
的优化器方法,我们便可使用PyTorch提供的RMSProp算法来训练模型。注意,超参数γ \gammaγ通过alpha
指定。
d2l.train_pytorch_ch7(torch.optim.RMSprop, {'lr': 0.01, 'alpha': 0.9}, features, labels)
输出:
loss: 0.243676, 0.043637 sec per epoch
总结
- RMSProp算法和AdaGrad算法的不同在于,RMSProp算法使用了小批量随机梯度按元素平方的指数加权移动平均来调整学习率。