共计 1278 个字符,预计需要花费 4 分钟才能阅读完成。
梯度下降的几何直觉
想象你蒙着眼睛站在山坡上,想要找到最低点。每次用脚试探周围最陡的下坡方向,然后迈一小步——这就是梯度下降的直观理解。数学上,我们用 $J(\theta)$ 表示损失函数,$\theta$ 是模型参数,梯度 $\nabla J(\theta)$ 指向函数增长最快的方向,因此负梯度 $-\nabla J(\theta)$ 就是最速下降方向。

图 1:在二维曲面上的梯度下降路径,红色箭头表示负梯度方向
三种梯度下降变体对比
- 批量梯度下降 (BGD, Batch Gradient Descent)
- 每次使用全部训练数据计算梯度
- 优点:稳定收敛到全局最优(凸函数)或局部最优(非凸函数)
-
缺点:计算开销大,不适合大规模数据集
-
随机梯度下降 (SGD, Stochastic Gradient Descent)
- 每次随机选择一个样本计算梯度
- 优点:计算速度快,可以跳出局部最优
-
缺点:收敛不稳定,可能震荡
-
小批量梯度下降 (MBGD, Mini-batch Gradient Descent)
- 折中方案,每次使用 32-256 个样本 (batch size)
- 优点:兼顾计算效率和稳定性
- 缺点:需要调整 batch size 超参数
Python 实现关键代码
import torch
import torch.nn as nn
# 学习率衰减实现
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# Momentum 优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 梯度裁剪
nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
性能优化实验
在 MNIST 数据集上测试不同优化器:
- 学习率影响
- 太大:损失震荡甚至发散(如 lr=0.1)
- 太小:收敛过慢(如 lr=0.0001)
-
经验公式:尝试从 0.01 开始,按 3 倍缩放调整
-
优化器对比
| 优化器 | 测试准确率 | 训练时间 |
|————–|————|———-|
| SGD | 98.2% | 25min |
| SGD+Momentum | 98.5% | 20min |
| Adam | 98.7% | 15min |
避坑指南
- 梯度消失 / 爆炸
- 现象:参数更新量极端小或极端大
-
解决:使用 BatchNorm、梯度裁剪、调整初始化
-
特征缩放
- 必须对输入特征标准化(如 StandardScaler)
-
原因:统一各维度梯度量级
-
学习率选择
- 经验法则:$\eta = 0.01$ 或 $0.001$ 作为起点
- 监控训练损失曲线判断是否合适
进阶思考
- 非凸优化中,梯度下降可能收敛到鞍点 (saddle point),如何改进?
- Adam 优化器自适应调整学习率的机制,在哪些场景可能失效?
通过本文的代码示例和实验数据,希望能帮助你避开初学梯度下降时的常见陷阱。记住调参没有银弹,需要根据具体问题灵活调整策略。
正文完
