Adaptive Gradient(AdaGrad)
在此之前的方法,所有的参数的学习率相同,但Adagrad使学习率适应不同的梯度:梯度越大越陡峭学习率越小希望步子迈小一点(不希望越过最低点所以步子要小一点),梯度越小越平坦学习率越大希望步子迈大一点。随着时间的推移步长会衰减到0。
-
公式
AdaGrad算法会使用一个小批量随机梯度按元素平方的累加变量 ,相当于一个梯度存储缓存。在时间步0,AdaGrad将 中每个元素初始化为0。在时间步 ,首先将小批量随机梯度按元素平方后累加到变量 :
接着,我们将目标函数自变量中每个元素的学习率通过按元素运算重新调整一下:
其中 η 是学习率, ϵ 是为了维持数值稳定性而添加的常数,如 10−6 。这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。
- 代码
grad_squared = 0
while True:
dx = compute_gradient(x)
grad_squared += dx * dx
x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
优点
非常适合处理稀疏数据,显著提高SGD的稳健性,不需要手动调整学习率。缺点
在分母中累积平方梯度,导致学习率变小并变得无限小,由此导致还未收敛就已经停滞不前,出现early stopping 的现象。
RMSProp
因为Adagrad算法会出现提前停止的现象,所以在RMSProp算法中解决了这个问题,它采用指数加权平均的思想,只将最近的梯度进行累加计算平方。
公式
代码
grad_squared = 0
while True:
dx = compute_gradient(x)
grad_squared = decay_rate * grad_squared + (1 - decay_rate) * dx * dx
x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)