随机梯度下降 (gradient descent)(SGD)及其变体(如Momentum)通常使用单一学习率来控制神经网络 (neural network)中所有参数 (parameter)的更新步骤。尽管学习率调度等方法可以随时间调整此全局速率,但它们没有考虑到不同参数可能需要不同更新幅度这一情况。设想一个稀疏特征的场景:一些与稀有特征相关的参数可能只偶尔接收到有用的梯度,而频繁特征的参数则持续接收更新。统一的学习率对于不频繁的参数可能过小,无法有效训练;对于频繁的参数则可能过大,导致不稳定。
AdaGrad(自适应梯度算法)优化器通过为每个参数维护一个根据该参数梯度历史进行调整的学习率来解决此问题。其思路简单明了:频繁遇到大梯度的参数,其学习率应被降低以避免超调;而与不频繁更新(以及历史上可能较小梯度)相关的参数,应保持较大的学习率以利于训练。
AdaGrad机制
AdaGrad通过累积每个参数 (parameter)在所有先前时间步的梯度平方来实现这种调整。设gt,i是目标函数在时间步t时对参数θi的梯度。AdaGrad为每个参数θi维护一个状态变量,我们称之为Gt,i,它是截至时间步t时对θi的梯度平方和。
Gt,i的更新规则是:
Gt,i=Gt−1,i+gt,i2
通常,G0,i被初始化为零。这个值Gt,i表示为参数θi累积的历史梯度信息。
参数 (parameter)更新规则
更新实际参数θi时,AdaGrad通过将全局学习率η除以累积和Gt,i的平方根来修改标准梯度下降 (gradient descent)更新。分母中会加上一个小的常数ϵ(epsilon,例如10−8)以保持数值稳定性,避免除以零,尤其是在Gt,i可能为零的初始步骤。
参数θi在时间步t的更新是:
θt+1,i=θt,i−Gt,i+ϵηgt,i
我们来分解一下:
- gt,i:参数θi的当前梯度。
- η:一个全局学习率,类似于SGD中使用的学习率。
- Gt,i:参数θi截至当前步骤的梯度平方累积和。
- ϵ:一个小的平滑项,用于防止除以零。
请注意,每个参数θi的有效学习率,即Gt,i+ϵη,是动态变化的。如果一个参数持续收到大梯度,Gt,i将快速增长,导致该参数的有效学习率下降。相反,如果一个参数收到小梯度或不频繁的梯度,Gt,i将缓慢增长,有效学习率将保持相对较高。
向量 (vector)化形式
实践中,这些操作在向量和矩阵上按元素进行。如果θt表示时间步t时所有参数 (parameter)的向量,gt是梯度向量,Gt是累积梯度元素平方的向量,则更新规则为:
Gt=Gt−1+gt⊙gt
θt+1=θt−Gt+ϵη⊙gt
其中⊙表示按元素乘法,平方根和ϵ的加法也是按元素应用的。
AdaGrad的优点
- 学习率自动调整: AdaGrad有效地为每个参数 (parameter)单独调整学习率,减少了对全局学习率η进行大量手动设定的必要。
- 适用于稀疏数据: 它在梯度稀疏的场景中表现良好,例如自然语言处理或推荐系统,其中某些特征(如单词或项目ID)出现不频繁。与频繁特征相比,这些不频繁特征会得到更大的更新。
注意事项
尽管有创新,AdaGrad有一个重要的属性需要记住:梯度平方的累积和Gt只随时间增长。由于Gt出现在分母中,每个参数 (parameter)的有效学习率在训练过程中会单调递减。在某些情况下,这种衰减可能变得过于剧烈,导致学习率收缩到接近零,从而过早地停止训练。这一局限性促使了后续自适应算法(如RMSprop和Adam)的发展,我们接下来会介绍它们。