6.7 AdaGrad算法#
在6.6节内容中,我们介绍了基于动量的梯度下降算法, 其核心思想是目标函数在优化过程中对当前位置梯度进行计算也也应该考虑上一次所处位置时的梯度,以此来提高模型的收敛速度。在本节内容中我们将介绍另外一种从每个特征维度的角度来考虑参数梯度的优化算法。
6.7.1 AdaGrad动机#
在机器学习算法中有一种常见的文本向量化表示方法——词频逆文档频率(Term FrequenceInverse Document Frequence, TF-IDF),它最重要的一点便是引入了逆文档频率这一概念。在仅以词频作为特征的表示方法中一个词出现的频率越高往往会被认为该维度的重要性越高,然而在不少情况下频繁出现的词并不具有较高的重要性,例如一些代词或者虚词等。因此,TF-IDF在此基础上通过逆文档频率来修正这一问题,即一个词总的出现次数除以包含有该词的文档数。可以发现,如果一个词出现频繁但是在每个文档中该词具有出现,那么它对应的逆文档频率便很小,最后作用于词频得到的特征值也会相应变小。
进一步,杜奇(Duchi)[1]等人认为在深度学习中当输入样本的特征维度较高且较为稀疏时,在目标函数优化中频繁出现的特征维度(本质上是该维度对应的权重参数)其对应的学习率应该较小;相反,极少出现的特征维度其对应的的学习率应该相对较大,以此来提高模型对于这部分参数的学习效率。因此,要达到上述目的办法就是在目标函数优化过程中为每个权重参数赋予一个自适应的学习率。基于这样的动机,Duchi J等人提出了一种自适应学习率的梯度下降算法(Adaptive Gradent, AdaGrad),其核心思想便是根据每个参数截止当前时刻梯度的累积情况来自适应计算下一时刻梯度的大小。
6.7.2 AdaGrad原理#
AdaGrad算法可以根据参数历史梯度的平方累积来动态调整学习率,使得对于不同参数的更新可以有不同的尺度,从而更有效地进行参数优化。具体地,设目标函数在第$t$时刻关于所有权重参数的梯度为$g_t$,累积梯度为$a_t$且$a_0=0$,权重参数为$\theta_t$,则第$t+1$时刻的结果$\theta_{t+1}$可通过如下公式计算
$$ \begin{aligned} a_{t+1}&=a_t+g_{t+1}\odot g_{t+1}\\[1ex] \theta_{t+1}&=\theta_t-\frac{\gamma}{\sqrt{a_{t+1}+\epsilon}}g_{t+1} \end{aligned}\tag{6-30} $$其中$\odot$表示按位乘,$\gamma$为学习率,$\epsilon$为平滑项防止分母为0时溢出。
根据式(6-30)可以看出,由于AdaGrad累积了每个参数历史梯度值的平方,这将使得对于特征维度中频繁出现的特征对应的参数梯度以更快的速度进行累积,最终该参数对应的学习率则会逐渐减小;相反,对于不经常出现的特征维度其对应参数的学习率则会相对较大。这样,AdaGrad算法便能够更加灵活地适应不同参数的更新尺度。然而,AdaGrad算法也有一些缺点,例如模型在长时间训练中梯度的累积可能会变得过大,导致学习率一直降低(或不变),最终可能较难找到一个有用的解[2]。为了解决这个问题,后续也出现了一些基于AdaGrad的改进算法,如后续我们将要介绍的AdaDelta、RMSprop和 Adam算法。
6.7.3 使用示例#
在介绍完AdaGrad算法的基本原理以后,我们再来看如何使用这一优化算法。在PyTorch框架中,我们可以通过torch.optim.Adagrad() 模块来使用自适应学习率的梯度下降算法。下面对其中的几个关键参数进行介绍。
1 class Adagrad(Optimizer):
2 def __init__(self, params, lr=1e-2, lr_decay=0,
3 weight_decay=0, initial_accumulator_value=0, eps=1e-10):
4 pass在上述代码中,第2行params表示指定模型的权重参数;lr表示指定学习率;lr_decay学习率衰减系数,即式(6-30)每次在执行梯度下降之前学习率先衰减为$\gamma / (1 +(t-1) \eta)$,其中$\eta$便为学习率衰减系数,默认情况下$\eta=0$。第3行initial_accumulator_value为梯度累积项的初始值,即$a_0$;eps为平滑项系数。
最后,我们只需要在模型训练时指定优化器为Adagrad便可使用基于学习率自适应的梯度下降算法来最小化目标函数。
6.7.4 小结#
在本节内容中,我们首先介绍了AdaGrad算法出现的动机,即使得目标函数在优化过程中能够以自适应的方式来为每个权重参数计算得到一个学习率,以不同的尺度来对权重参数进行学习更新;然后介绍了AdaGrad算法的基本原理以及它所存在的弊端;最后介绍了如何在PyTorch中使用基于学习率自适应的梯度下降算法。在下一节内容中,我们将继续介绍基于梯度下降算法改进的优化算法AdaDelta。
引用#
[1] Duchi J, Hazan E, Singer Y. Adaptive subgradient methods for online learning and stochastic optimization[J]. Journal of machine learning research, 2011, 12(7).
[2] 阿斯顿·张、李沐、扎卡里 C. 立顿等,动手学深度学习[M],2版. 北京:人民邮电出版社, 2019.
[3] Paszke A, Gross S, Massa F, et al. Pytorch: An imperative style, high-performance deep learning library[J]. Advances in neural information processing systems, 2019, 32.