共计 1763 个字符,预计需要花费 5 分钟才能阅读完成。
在训练神经网络时,我们经常会遇到损失函数卡在某个位置不再下降的情况,这很可能就是陷入了局部最优。就像下图中的小球,卡在了半山腰的凹陷处,而无法到达最低点(全局最优)。

# 二维凸函数示意图代码示例
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 100)
y = x**4 - 3*x**3 + 2
plt.plot(x, y)
plt.xlabel('参数值')
plt.ylabel('损失值')
plt.title('局部最优示意')
plt.show()
1. 突破局部最优的 5 大方法
1.1 动量法(Momentum)
想象一下推下山坡的保龄球:
- 传统梯度下降:像小球每一步都重新计算方向
- 动量法:给小球加上 ” 惯性 ”,$v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta)$
- Nesterov 改进:先看未来一步的位置再计算梯度
1.2 自适应学习率
不同参数应该有不同学习节奏:
- AdaGrad:累加历史梯度平方 $G_t = G_{t-1} + g_t^2$
- RMSProp:引入衰减因子 $E[g^2]t = \gamma E[g^2] + (1-\gamma)g_t^2$
- Adam:结合动量与自适应(最常用)
1.3 随机重启
简单但有效的逃生策略:
- 当验证集 loss 连续 N 轮不下降时
- 随机初始化部分参数重新训练
- 适合与早停机制配合使用
1.4 模拟退火
受冶金工艺启发的智能随机:
- 初始 ” 温度 ” 高时允许跳出不利移动
- 温度调度常用余弦退火:$\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max}-\eta_{min})(1+\cos(\frac{T_{cur}}{T_{max}}\pi))$
1.5 批标准化(BatchNorm)
改变优化地形的高效方法:
- 使各层输入保持稳定分布
- 相当于平滑了损失函数表面
- 允许使用更大学习率
2. PyTorch 实战示例
# MNIST 分类任务完整示例
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR
# 网络结构
model = nn.Sequential(nn.Linear(784, 256),
nn.BatchNorm1d(256),
nn.ReLU(),
nn.Linear(256, 10)
)
# 优化器组合
optimizer = optim.SGD(model.parameters(),
lr=0.1,
momentum=0.9,
nesterov=True)
scheduler = CosineAnnealingLR(optimizer, T_max=10)
# 训练循环
for epoch in range(100):
# 学习率热启动
if epoch < 5:
lr = 0.01 * (epoch+1)
for param_group in optimizer.param_groups:
param_group['lr'] = lr
# 常规训练步骤
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
scheduler.step()
3. 性能优化要点
GPU 内存管理
- batch_size=128 时各方法显存占用:
- SGD: 1.2GB
- Adam: 1.5GB
- Adam+BN: 1.8GB
早停机制设置
- patience=5~10 是常用范围
- 监控验证集 loss 而非训练 loss
- 配合模型 checkpoint 保存
4. 常见陷阱规避
Adam 在 CV 任务的问题
- 可能导致最终解不够尖锐
- 对超参数敏感
- 建议配合权重衰减使用
学习率与权重衰减
- 两者会相互影响
- 建议比例 lr:wd ≈ 100:1
- 使用 AdamW 优化器可解耦
5. 拓展思考
- 如何设计实验验证优化器对模型泛化能力的影响?
- 在不同数据子集上测试
-
对比验证集和测试集表现
-
在 Transformer 结构中是否仍需担心局部最优?
- 自注意力机制改变了优化地貌
- 但初始化策略仍然关键
在实践中,我通常会先用 Adam 快速验证模型可行性,再切换到 SGD 进行精细调优。记住没有万能的优化器,关键是根据任务特点选择合适的策略组合。
正文完
