目录
老饼讲解:一步一步上手学习

【优化】一篇入门之-AdaGrad-算法

作者 : 老饼 发表日期 : 2025-12-17 00:02:28 更新日期 : 2026-05-11 01:00:26
老饼讲解-简单易懂,干货满满,爽过嗦螺!


AdaGrad优化算法是深度学习中的一种基本训练算法,是之后的RMSProp、AdaDelta、Adam等一系列算法的基础,AdaGrad算法在梯度下降法中加入了自动调节学习率的机制,可以在一定程度上缓解梯度消失或梯度爆炸带来的训练困难问题,下面我们就来看看AdaGrad算法是怎么样的吧!

一、AdaGrad算法-公式与原理

AdaGrad全称为自适应梯度下降算法(Adaptive Gradient Algorithm),它是梯度下降算法的一种改进,就如它名称里所说的那样,它其实就是将梯度下降算法中的固定学习率,改为自适应学习率。

1‌.1. AdaGrad算法的迭代公式

我们都知道,梯度下降算法中不仅学习率是固定的、而且是对每个参数都是固定的,而实际中,不同的迭代阶段、不同的参数,所需的学习率很可能是不一样的,所以AdaGrad就在梯度下降算法的基础上,加入了自适应学习率机制。

不妨记待优化的第个参数为,AdaGrad算法的更新公式如下:

               

 

其中,:参数的梯度                           

                      :初始值为0,它实际就是的累计平方和

 :学习率                              

                       :一个极小的常数,它的作用避免分母为0 

可以看到,AdaGrad就是在梯度下降算法的基础上,通过将学习率 除以来对每一个参数的学习率进行自动调整,这样对于梯度大的参数,学习率相应会变小,而梯度小的参数,学习率会相应变得更大一些。

1.2. AdaGrad-优缺点

AdaGrad最大的优点是,它可以一定程度上解决梯度消失引起的训练困难问题,在深度学习中,浅层的参数往往会因为梯度消失而难以调整,而AdaGrad加入了自适应学习率,梯度小的参数会获得更大的学习率,从而在一定程度上缓解了梯度消失问题。

AdaGrad最大的缺点是,学习率会持续缩小,导致在一定步数后学习率会极小,导致无法继续学习。为什么这么说呢?因为,AdaGrad中的就是的累计平方和在一定步数后,大到一定程度时,学习率就会变得极小,从而无法继续学习。

二、AdaGrad算法-代码实现    

下面我们来实现一下AdaGrad算法,配合代码,就非常具体的理解AdaGrad算法了。

不妨设目标函数为:

下面我们使用AdaGrad算法来求它的最小值。

由于AdaGrad算法需要使用目标函数的梯度,所以需要先算出梯度,如下:

  ,

求出梯度后我们就可以编写代码了,AdaGrad算法的具体实现代码如下:

"""
本代码展示AdaGrad算法求y= (x1-2)^2+(x2-3)^2的最小解
本代码来自《老饼讲解-机器学习》www.bbblearn.com 
"""
import numpy as np
x   = np.array([0,0])                                                          # 初始化x
lr  = 2                                                                        # 设置学习率
s   = np.array([0,0])                                                          # 初始化梯度累计量
esp = 0.000001                                                                 # 很小的常数
for i in range(100):                                                           # 最大迭代100次
    g = np.array([2*x[0]-4, 2*x[1]-6])                                         # 计算x的梯度  
    s = s + g*g                                                                # 更新梯度累计量
    x = x - lr/np.sqrt(s+esp)*g                                                # 调整x
    y = (x[0]-2)**2+(x[1]-3)**2                                                # 当前函数值
    print("第 %d 轮迭代:x=[%.4f,%.4f],y=%.5f"%(i+1,x[0],x[1],y))                # 打印当前结果
    if((max(abs(g))< 0.0001) ):break                                           # 如果梯度过小,则退出迭代

代码运行结果如下:

AdaGrad优化结果

可以看到,经过了13轮迭代,所得到解已经非常接近真实极小解[2,3]  。

总结

总的来说,AdaGrad其实就只是在梯度下降法的基础上加入了自适应学习率,它可以根据梯度自动调节各个变量的学习率,但缺点是经过长期之后,学习率会变得极小,导致难以继续训练。



图标 评论
添加评论