梯度下降
梯度下降是训练神经网络最核心的优化算法。通过沿损失函数梯度的反方向更新参数,模型逐步找到最优解。
学习难度:入门·阅读时间:约10分钟
什么是梯度下降
核心思想
梯度下降是一种迭代优化方法:
- 计算损失函数关于参数的梯度
- 沿梯度的反方向移动
- 逐步接近损失函数的最小值
数学表达
θ = θ - η × ∇L(θ)
其中θ是参数,η是学习率,∇L是损失函数的梯度。
为什么沿着负梯度方向
- 梯度指向函数增长最快的方向
- 负梯度指向函数下降最快的方向
- 沿此方向移动可以最快降低损失
梯度下降变体
批量梯度下降(BGD)
每次使用全部数据计算梯度:
- ✅ 梯度准确,收敛稳定
- ❌ 速度慢,内存占用大
- ❌ 无法处理大数据集
随机梯度下降(SGD)
每次使用一个样本计算梯度:
- ✅ 计算快,可以在线学习
- ✅ 有助于跳出局部最优
- ❌ 梯度噪声大,收敛震荡
小批量梯度下降(Mini-batch)
每次使用一小批样本:
- ✅ 平衡了计算效率和梯度准确性
- ✅ 可以利用向量化加速
- ✅ 实践中最常用
典型批次大小
| 场景 | 批次大小 |
|---|---|
| 小模型/小数据 | 32, 64, 128 |
| 大模型预训练 | 256, 512, 1024+ |
| GPU内存受限 | 梯度累积 |
学习率
学习率的作用
学习率控制每次更新的步长:
- 太小:收敛太慢
- 太大:可能震荡或发散
- 需要找到合适的平衡
学习率调度
步进衰减
每N轮将学习率乘以衰减因子。
指数衰减
学习率按指数函数衰减。
余弦退火
学习率按余弦曲线变化,大模型训练常用。
预热(Warmup)
开始时逐步增加学习率,防止早期不稳定。
面临的挑战
局部最优
梯度下降可能陷入局部最优而非全局最优。但在高维空间中,真正的局部最优很少,更多是鞍点。
鞍点
某些方向是极小值,某些方向是极大值:
- 高维空间中很常见
- SGD的噪声有助于逃离
病态曲率
损失曲面在不同方向上曲率差异大:
- 某些方向下降快,某些方向下降慢
- 导致震荡或收敛缓慢
- 自适应优化器可以缓解
优化技巧
动量(Momentum)
累积历史梯度方向:
v = β × v + ∇L
θ = θ - η × v
动量有助于加速收敛并减少震荡。
自适应方法
- AdaGrad:根据历史梯度调整学习率
- RMSprop:改进AdaGrad,使用滑动平均
- Adam:结合动量和自适应学习率
梯度裁剪
限制梯度的最大范数:
- 防止梯度爆炸
- RNN训练中常用
直观理解
下山类比
梯度下降可以类比为蒙眼下山:
- 当前位置是参数值
- 海拔高度是损失值
- 梯度是山坡最陡的方向
- 学习率是每一步的步长
不同优化器的行为
- SGD:沿最陡方向走,可能曲折
- Momentum:保持惯性,走得更直
- Adam:自适应调整步长,走得更快