通俗易懂讲透AdaGrad优化算法

通俗易懂讲透AdaGrad优化算法(本科生/研究生都能看懂)

本文用最直白的语言+简单案例+公式拆解,把AdaGrad从原理、计算、代码到优缺点讲清楚,不用复杂数学背景也能完全理解,适合深度学习入门与算法复习。


一、先搞懂:我们为什么需要AdaGrad?

在机器学习/深度学习里,我们要做的事很简单:
不断调整模型参数(权重),让预测误差(损失)越小越好

最基础的方法是梯度下降
沿着误差下降的方向,一步一步改参数,直到找到最低点。

但普通梯度下降有个大问题:
全局用一个固定学习率,所有参数步子一样大

  • 有的参数早就快收敛了,还迈大步,容易“走过头”
  • 有的参数几乎没更新过,迈小步,学得太慢

于是就有了AdaGrad
给每个参数单独配自适应学习率,自动调步子大小


二、AdaGrad到底是什么?

核心一句话

AdaGrad = 自适应梯度算法
它会记录每个参数的历史梯度平方和,自动给不同参数分配学习率:

  • 梯度大、更新频繁的参数 → 学习率慢慢变小,走稳一点
  • 梯度小、更新少的参数 → 学习率保持较大,走快一点

超形象比喻

普通梯度下降:穿固定鞋码的鞋,每一步都一样大
AdaGrad:穿智能登山鞋

  • 坡很陡(梯度大)→ 自动缩小步伐,防止摔倒
  • 坡很平(梯度小)→ 保持大步,快速前进

三、核心公式一步步拆(超详细,不跳步)

1. 普通梯度下降(对照看)

参数更新公式:
θt+1=θt−α⋅gt\theta_{t+1} = \theta_t - \alpha \cdot g_tθt+1=θtαgt

  • θ\thetaθ:要优化的参数
  • α\alphaα:固定学习率(比如0.01)
  • gtg_tgt:当前梯度

2. AdaGrad 三步走

第1步:累积梯度平方和

记录每个参数从第1步到当前步的梯度平方总和:
Gt=Gt−1+gt2G_t = G_{t-1} + g_t^2Gt=Gt1+gt2
逐参数写法(更严谨):
Gt(j)=∑i=1t(gi(j))2G_t^{(j)} = \sum_{i=1}^t \left(g_i^{(j)}\right)^2Gt(j)=i=1t(gi(j))2

  • GtG_tGt:历史梯度平方和(只会变大,不会变小)
  • gt(j)g_t^{(j)}gt(j):第j个参数在第t步的梯度
第2步:计算自适应学习率

用历史梯度缩放学习率:
αt(j)=αGt(j)+ϵ\alpha_t^{(j)} = \frac{\alpha}{\sqrt{G_t^{(j)} + \epsilon}}αt(j)=Gt(j)+ϵα

  • α\alphaα:初始学习率(人工设)
  • ϵ\epsilonϵ:极小值(通常10−810^{-8}108),防止分母为0
第3步:更新参数

最终更新公式:
θt+1(j)=θt(j)−αGt(j)+ϵ⋅gt(j)\theta_{t+1}^{(j)} = \theta_t^{(j)} - \frac{\alpha}{\sqrt{G_t^{(j)} + \epsilon}} \cdot g_t^{(j)}θt+1(j)=θt(j)Gt(j)+ϵαgt(j)

3. 公式背后的道理

  • GtG_tGt 越来越大 → 学习率越来越小
  • 频繁更新的参数:GtG_tGt 涨得快 → 学习率降得快
  • 很少更新的参数:GtG_tGt 涨得慢 → 学习率保持较大

四、极简计算案例(手算就能懂)

目标:最小化 f(θ)=θ2f(\theta)=\theta^2f(θ)=θ2,最优解 θ=0\theta=0θ=0

  • 初始:θ0=4\theta_0=4θ0=4α=0.1\alpha=0.1α=0.1G0=0G_0=0G0=0ϵ=10−8\epsilon=10^{-8}ϵ=108

第1步迭代

  1. 梯度:g1=2×4=8g_1=2×4=8g1=2×4=8
  2. 累积梯度平方:G1=0+82=64G_1=0+8^2=64G1=0+82=64
  3. 自适应学习率:0.164+10−8≈0.0125\frac{0.1}{\sqrt{64+10^{-8}}}≈0.012564+1080.10.0125
  4. 更新参数:θ1=4−0.0125×8=3.9\theta_1=4 - 0.0125×8=3.9θ1=40.0125×8=3.9

第2步迭代

  1. 梯度:g2=2×3.9=7.8g_2=2×3.9=7.8g2=2×3.9=7.8
  2. 累积梯度平方:G2=64+7.82=124.04G_2=64+7.8^2=124.04G2=64+7.82=124.04
  3. 自适应学习率:0.1124.04+10−8≈0.009\frac{0.1}{\sqrt{124.04+10^{-8}}}≈0.009124.04+1080.10.009
  4. 更新参数:θ2≈3.83\theta_2≈3.83θ23.83

结论

学习率越变越小,参数更新越来越稳,不会震荡。


五、代码实战:用AdaGrad训练逻辑回归

直接复制可运行,带可视化,清晰看到损失、参数、学习率变化。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 生成模拟二分类数据
np.random.seed(42)
n_samples = 2000
X = np.random.randn(n_samples, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(int)

# 2. 初始化参数
w = np.random.randn(2)
b = 0
alpha = 0.1       # 初始学习率
epsilon = 1e-8    # 防除0
G_w = np.zeros(2) # 权重梯度平方和
G_b = 0           # 偏置梯度平方和

losses = []
w_updates = []
learning_rates = []

# Sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 3. 训练循环
for epoch in range(200):
    z = np.dot(X, w) + b
    pred = sigmoid(z)
    
    # 计算损失
    loss = -np.mean(y * np.log(pred + epsilon) + (1 - y) * np.log(1 - pred + epsilon))
    losses.append(loss)
    
    # 计算梯度
    error = pred - y
    grad_w = np.dot(X.T, error) / n_samples
    grad_b = np.mean(error)
    
    # 累积梯度平方
    G_w += grad_w ** 2
    G_b += grad_b ** 2
    
    # 自适应学习率
    adj_lr_w = alpha / (np.sqrt(G_w) + epsilon)
    adj_lr_b = alpha / (np.sqrt(G_b) + epsilon)
    learning_rates.append(adj_lr_w.mean())
    
    # 更新参数
    w -= adj_lr_w * grad_w
    b -= adj_lr_b * grad_b
    
    w_updates.append(w.copy())

w_updates = np.array(w_updates)

# 4. 可视化
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle("AdaGrad 优化过程可视化", fontsize=16)

# 数据分布
axes[0,0].scatter(X[y==0,0], X[y==0,1], c='red', alpha=0.6, label='类别0')
axes[0,0].scatter(X[y==1,0], X[y==1,1], c='blue', alpha=0.6, label='类别1')
axes[0,0].set_title("数据分布")
axes[0,0].legend()

# 损失变化
axes[0,1].plot(losses, 'purple', linewidth=2)
axes[0,1].set_title("损失随迭代变化")
axes[0,1].grid(True)

# 参数更新轨迹(3D)
ax3 = fig.add_subplot(2,2,3, projection='3d')
ax3.plot(w_updates[:,0], w_updates[:,1], range(len(w_updates)), 'g-', linewidth=2)
ax3.set_title("参数更新轨迹")
ax3.set_xlabel("w1")
ax3.set_ylabel("w2")

# 学习率热力图
sns.heatmap([learning_rates], cmap='coolwarm', annot=True, fmt='.4f', ax=axes[1,1])
axes[1,1].set_title("学习率变化热力图")
axes[1,1].set_yticks([])

plt.tight_layout()
plt.show()

六、AdaGrad 优点

  1. 自适应学习率:每个参数独立调整,不用全局固定步长
  2. 特别适合稀疏数据:NLP、推荐系统里很多特征是0,AdaGrad会给这些参数放大学习率
  3. 不用手动设学习率衰减:自动降速,省掉人工调参
  4. 凸优化表现好:线性回归、逻辑回归、SVM 用它很稳

七、AdaGrad 缺点(必看)

  1. 学习率衰减太快
    GtG_tGt 一直累加 → 学习率越来越小 → 后期完全不学习
  2. 不适合深度学习
    深度网络训练步数多,后期学习率趋近0,收敛不动
  3. 非凸优化容易陷局部最优
    像GAN这类任务,很难跳出局部最小值

八、适用场景 vs 不适用场景

✅ 适合用 AdaGrad

  • 稀疏数据场景:NLP、推荐系统、文本分类
  • 凸优化问题:线性/逻辑回归、SVM
  • 小数据集、短训练任务

❌ 不适合用 AdaGrad

  • 深度神经网络(CNN、RNN、Transformer)
  • 非凸优化(GAN、复杂深度模型)
  • 大规模长训练任务

九、一句话总结

AdaGrad 是自适应学习率的鼻祖,在稀疏数据与凸优化里很强,但因为学习率衰减太快,不适合深度学习。
深度学习里更推荐用它的改进版:RMSprop、Adam、Adadelta


十、速记表格

特性AdaGrad
自适应学习率✅ 每个参数独立
稀疏数据✅ 非常适合
凸优化✅ 效果好
学习率衰减❌ 下降太快
深度学习❌ 不推荐
非凸优化❌ 容易局部最优
推荐替代RMSprop、Adam

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值