共计 1878 个字符,预计需要花费 5 分钟才能阅读完成。
从山坡滚下来的小球:梯度下降的直观理解
想象你在浓雾中下山,每一步都沿着最陡的方向迈步。梯度下降就是这种思想的数学实现——通过计算函数梯度(偏导数组成的向量)确定下降方向,用学习率控制步长。对于参数 θ 和损失函数 J(θ),更新规则为:

θ_{t+1} = θ_t - η·∇J(θ_t)
其中 η 是学习率,∇J(θ) 是梯度。这个简单的公式支撑着从线性回归到 BERT 的所有模型训练。
为什么我的模型不收敛:实战中的五大噩梦
- 学习率的两难 :太大导致震荡发散,太小收敛缓慢。曾有个实验,学习率从 0.1 调到 0.001,训练时间从 3 小时延长到 3 天
- 局部最优陷阱 :特别是在高维空间,模型常卡在非全局最低点。ResNet 的残差连接部分就是为了缓解这个问题
- 鞍点沼泽 :梯度接近零但并非极值点,就像平原中的小坑洼。在 GAN 训练中尤为常见
- 梯度消失 / 爆炸 :RNN 中梯度连乘导致指数级变化,LSTM 通过门机制缓解此问题
- 随机噪声干扰 :SGD 的方差导致收敛不稳定,后期容易在最优值附近徘徊
算法变体:没有银弹,只有 trade-off
- 批量梯度下降 (BGD):
- 每次用全量数据计算梯度
- 内存消耗大,但收敛稳定
-
适合小型数据集 (如 <1GB)
-
随机梯度下降 (SGD):
- 每个样本更新一次参数
- 内存占用极小,收敛快但震荡大
-
适合在线学习场景
-
小批量梯度下降 (Mini-batch):
- 折中方案,batch_size 通常取 32-256
- 充分利用 GPU 并行计算
- 现代深度学习的事实标准
PyTorch 实战:手写数字识别中的调参技巧
import torch
import matplotlib.pyplot as plt
# 初始化
model = SimpleCNN().cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
loss_history = []
for epoch in range(100):
for batch_x, batch_y in train_loader:
batch_x, batch_y = batch_x.cuda(), batch_y.cuda()
# 关键三步曲
optimizer.zero_grad() # 不清零会导致梯度累积
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 5.0) # 梯度裁剪
optimizer.step()
scheduler.step() # 学习率衰减
loss_history.append(loss.item())
# 损失曲线可视化
plt.plot(loss_history)
plt.xlabel('Epoch')
plt.ylabel('Loss')
生产环境优化经验
-
梯度裁剪 :当梯度范数超过阈值时缩放,防止 RNN 训练崩溃。经验值通常在 1.0-10.0 之间
-
分布式训练 :
- 使用 NCCL 后端加速 AllReduce
- 考虑梯度压缩技术 (如 1 -bit SGD)
-
适当增大 batch_size 保持等效学习率
-
学习率策略 :
- Warmup:前 5% 训练步线性增大学习率
- Cosine 衰减:平滑下降到初始值的 10%
- 周期性重启:SGDR 策略跳出局部最优
优化器选择指南
| 优化器 | 适用场景 | 超参数 | 备注 |
|---|---|---|---|
| SGD+Momentum | 计算机视觉 | lr, momentum | 需配合学习率调度 |
| Adam | NLP、推荐系统 | lr, (β1,β2) | 默认参数常 work |
| LAMB | 大 batch 训练 | lr, weight decay | BERT 训练首选 |
在实际项目中,我会先用 Adam 快速验证 idea,再用 SGD 精细调优。最近发现的新秀 RAdam(整流 Adam) 在训练初期更加稳定,值得尝试。
进阶思考:二阶优化为什么用不起来?
虽然牛顿法收敛更快,但:
– 海森矩阵计算复杂度 O(n²) 过高
– 非凸问题中可能找到极大值
– 与 GPU 并行架构适配性差
实践中的折衷是使用近似二阶信息的优化器,如:
– Adagrad:自适应学习率
– Adam:结合动量与自适应学习率
– K-FAC:块对角近似海森矩阵
写在最后
梯度下降就像 AI 界的蒸汽机——原理简单但威力巨大。掌握其调参技巧需要:
1. 理解数学本质
2. 熟悉框架实现
3. 积累调参直觉
建议从 CIFAR-10 等小数据集开始,故意设置不同学习率观察训练现象。记住:没有最好的优化器,只有最适合当前任务的优化器。
正文完
