共计 1496 个字符,预计需要花费 4 分钟才能阅读完成。
梯度下降算法直观理解
让我们从一个简单的二维线性回归问题开始。假设我们的模型是 $y = wx + b$,损失函数采用均方误差 $J(w,b) = \frac{1}{2m}\sum_{i=1}^m (y_i – (wx_i + b))^2$。这个曲面就像一个碗,最低点就是最优解。

- 参数更新可视化 :
- 每次迭代沿着梯度反方向移动:$w := w – \alpha \frac{\partial J}{\partial w}$
- 学习率 $\alpha$ 控制步幅大小
-
轨迹类似小球滚下山坡
-
动态演示关键点 :
- 学习率过大导致震荡发散
- 学习率过小收敛缓慢
- 不同初始点可能收敛到不同局部最优
三种梯度下降变体对比
批量梯度下降 (BGD)
- 计算方式 :每次迭代使用全部样本计算梯度
- 特点 :
- 稳定性高但计算量大
- 时间复杂度 $O(m)$ 每轮
- 适合小数据集或简单模型
随机梯度下降 (SGD)
- 计算方式 :每次随机选 1 个样本计算梯度
- 特点 :
- 计算量小但波动大
- 时间复杂度 $O(1)$ 每轮
- 适合大规模数据集
小批量梯度下降 (MBGD)
- 计算方式 :每次使用 batch_size 个样本
- 特点 :
- 平衡计算效率和稳定性
- 典型 batch_size 为 32/64/128
- 现代深度学习主流选择
Python 实现核心代码
NumPy 基础实现
import numpy as np
def gradient_descent(X, y, lr=0.01, epochs=1000):
m, n = X.shape
w = np.zeros(n)
for _ in range(epochs):
grad = X.T @ (X @ w - y) / m # 向量化梯度计算
w -= lr * grad
if np.linalg.norm(grad) < 1e-5: # 收敛判断
break
return w
PyTorch 自动微分版
import torch
X_tensor = torch.tensor(X, requires_grad=True)
w = torch.zeros(n, requires_grad=True)
optimizer = torch.optim.SGD([w], lr=0.01)
for epoch in range(1000):
loss = torch.mean((X_tensor @ w - y)**2)
optimizer.zero_grad()
loss.backward() # 自动求导
optimizer.step()
学习率衰减 + 动量优化
optimizer = torch.optim.SGD([w],
lr=0.1,
momentum=0.9, # 动量项
weight_decay=1e-4 # L2 正则
)
scheduler = torch.optim.lr_scheduler.StepLR(
optimizer,
step_size=30,
gamma=0.1 # 每 30 轮学习率×0.1
)
实战避坑指南
- 梯度爆炸 / 消失 :
- 现象:参数更新出现 NaN 或长期不变化
-
对策:梯度裁剪、权重初始化、BN 层
-
特征缩放必要性 :
- 标准化后收敛速度提升 10 倍
-
常用方法:Z-score 归一化
-
随机种子影响 :
torch.manual_seed(42) np.random.seed(42) - 确保实验结果可复现
拓展思考方向
- Adam 优化器改造 :
- 引入动量 + 自适应学习率
-
代码只需替换优化器:
torch.optim.Adam(model.parameters()) -
分布式训练适配 :
- 梯度聚合:AllReduce 操作
- 学习率线性缩放规则
- 同步 / 异步更新策略选择
学习资源推荐
- 《Deep Learning》第 8 章
- PyTorch 官方优化器文档
- 可视化工具:TensorBoard
通过这篇教程,你应该已经掌握了梯度下降的核心要点。建议动手实现一个完整的回归案例,观察不同参数对训练过程的影响。遇到问题时,多打印中间变量值进行分析调试。
正文完
