通俗易懂讲透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=Gt−1+gt2
逐参数写法(更严谨):
Gt(j)=∑i=1t(gi(j))2G_t^{(j)} = \sum_{i=1}^t \left(g_i^{(j)}\right)^2Gt(j)=i=1∑t(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}10−8),防止分母为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.1,G0=0G_0=0G0=0,ϵ=10−8\epsilon=10^{-8}ϵ=10−8
第1步迭代
- 梯度:g1=2×4=8g_1=2×4=8g1=2×4=8
- 累积梯度平方:G1=0+82=64G_1=0+8^2=64G1=0+82=64
- 自适应学习率:0.164+10−8≈0.0125\frac{0.1}{\sqrt{64+10^{-8}}}≈0.012564+10−80.1≈0.0125
- 更新参数:θ1=4−0.0125×8=3.9\theta_1=4 - 0.0125×8=3.9θ1=4−0.0125×8=3.9
第2步迭代
- 梯度:g2=2×3.9=7.8g_2=2×3.9=7.8g2=2×3.9=7.8
- 累积梯度平方:G2=64+7.82=124.04G_2=64+7.8^2=124.04G2=64+7.82=124.04
- 自适应学习率:0.1124.04+10−8≈0.009\frac{0.1}{\sqrt{124.04+10^{-8}}}≈0.009124.04+10−80.1≈0.009
- 更新参数:θ2≈3.83\theta_2≈3.83θ2≈3.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 优点
- 自适应学习率:每个参数独立调整,不用全局固定步长
- 特别适合稀疏数据:NLP、推荐系统里很多特征是0,AdaGrad会给这些参数放大学习率
- 不用手动设学习率衰减:自动降速,省掉人工调参
- 凸优化表现好:线性回归、逻辑回归、SVM 用它很稳
七、AdaGrad 缺点(必看)
- 学习率衰减太快
GtG_tGt 一直累加 → 学习率越来越小 → 后期完全不学习 - 不适合深度学习
深度网络训练步数多,后期学习率趋近0,收敛不动 - 非凸优化容易陷局部最优
像GAN这类任务,很难跳出局部最小值
八、适用场景 vs 不适用场景
✅ 适合用 AdaGrad
- 稀疏数据场景:NLP、推荐系统、文本分类
- 凸优化问题:线性/逻辑回归、SVM
- 小数据集、短训练任务
❌ 不适合用 AdaGrad
- 深度神经网络(CNN、RNN、Transformer)
- 非凸优化(GAN、复杂深度模型)
- 大规模长训练任务
九、一句话总结
AdaGrad 是自适应学习率的鼻祖,在稀疏数据与凸优化里很强,但因为学习率衰减太快,不适合深度学习。
深度学习里更推荐用它的改进版:RMSprop、Adam、Adadelta。
十、速记表格
| 特性 | AdaGrad |
|---|---|
| 自适应学习率 | ✅ 每个参数独立 |
| 稀疏数据 | ✅ 非常适合 |
| 凸优化 | ✅ 效果好 |
| 学习率衰减 | ❌ 下降太快 |
| 深度学习 | ❌ 不推荐 |
| 非凸优化 | ❌ 容易局部最优 |
| 推荐替代 | RMSprop、Adam |

2679

被折叠的 条评论
为什么被折叠?



