第二十四讲 · 优化地形、Hessian 与小批量训练
训练模型可以想成在一片高维地形上找低处:参数是当前位置,损失是海拔,梯度告诉我们最陡的上坡方向。这个比喻很有用,但也容易让人误以为训练只是沿光滑山谷走到底。真实神经网络的参数空间维度极高,里面既有局部极小值,也有大量平坦方向与鞍点;而 mini-batch 计算出来的梯度还带着噪声。
一、损失曲面从哪里来
以线性模型
为例,每个训练样本产生一个损失 ,整个训练集的目标为
给每组 画出一个高度 ,就得到二维参数上的损失曲面。神经网络只是把参数从两个换成数百万个,无法直接画出来,但梯度和曲率的数学含义没有变。
梯度下降更新为
其中 是学习率。负梯度是当前位置的一阶近似下下降最快的方向,却不保证一步后到达全局最小值。
优化首先关心两个问题:能不能到达梯度接近零的区域,以及到达得有多快。机器学习还多一个问题:训练目标很低时,未见数据上的误差是否也低。
二、梯度与 Hessian 分别告诉我们什么
在 附近,二阶泰勒展开为
其中
- 梯度 描述局部斜率;
- Hessian 描述不同方向上的曲率;
- Hessian 的特征向量给出主曲率方向,特征值给出对应方向弯曲的正负与强弱。
在临界点 处,二阶项成为主要判断依据。对任意非零方向 :
| Hessian 情况 | 局部形状 | |
|---|---|---|
| 正定,全部特征值 | 所有方向都为正 | 严格局部极小值 |
| 负定,全部特征值 | 所有方向都为负 | 严格局部极大值 |
| 不定,正负特征值都有 | 有的方向正、有的方向负 | 鞍点 |
若存在零特征值,二阶信息可能不足以判定,需要看更高阶项。把“梯度为零”直接等同于“到达最小值”是不对的。
三、课件中的鞍点算例
考虑两个串联标量权重:
平方损失为
梯度为
在 ,梯度为零,但损失为 。Hessian 是
特征值为 和 ,所以原点是鞍点。沿负曲率方向 做一个很小的移动:
损失会下降;沿另一个方向则会上升。这说明梯度在鞍点处虽然暂时没有方向,Hessian 的负特征值却揭示了逃离方向。
四、局部极小、鞍点与全局最小
凸函数的任意局部极小值都是全局极小值;深度神经网络的目标通常非凸,因此没有这种整体保证。不过高维空间中,要让 Hessian 所有特征值都为正,比同时出现正负曲率更苛刻,鞍点因而十分常见。
课件展示的历史经验研究把临界点 Hessian 中正特征值比例与训练损失联系起来:损失较低的临界区域更“像”局部极小值,但实验不意味着训练必然到达严格局部极小值,也不能从二维示意图推出所有深网的统一结论。
实际训练停止还可能因为:
- 梯度很小但损失仍高;
- 学习率太小,移动慢到像停住;
- 曲率差异太大,在陡峭方向振荡、平坦方向前进缓慢;
- 参数化存在大量等价解和平坦方向;
- mini-batch 噪声让损失在附近波动。
五、全批量梯度与随机梯度
完整目标梯度为
若每次都扫描全部 个样本,得到 full-batch gradient descent。数据很大时,一次更新就要做完整遍历,代价高且更新频率低。
mini-batch SGD 每次抽取大小为 的批次 :
在均匀随机抽样等常见条件下, 是全数据梯度的无偏或近似无偏估计:
但具体一个批次的 会随机偏离全数据梯度,也就是存在采样误差。batch 越小,梯度方差通常越大;batch 越大,估计更稳定。
六、epoch、iteration 和 shuffle
若数据量为 ,batch size 为 ,一个 epoch 大约包含
次参数更新。三个概念要分开:
- iteration / step:用一个 batch 做一次更新;
- epoch:所有训练样本大致被看过一遍;
- shuffle:每个 epoch 重新打乱样本顺序,避免批次长期保持固定相关性。
例如 :full batch 每个 epoch 更新 1 次, 时更新 20 次。两者都看完同样的数据,却沿着完全不同的参数轨迹前进。
最后一个不足 的 batch 可以保留,也可以丢弃。若模型含 BatchNorm,小到只有一两个样本的尾批次可能使统计量不稳定,这时 drop_last 的选择会影响训练。
七、小 batch 与大 batch 的真实权衡
| 维度 | 较小 batch | 较大 batch |
|---|---|---|
| 单步样本量 | 少 | 多 |
| 梯度噪声 | 大 | 小 |
| 每 epoch 更新次数 | 多 | 少 |
| 单步显存 | 少 | 多 |
| 并行利用率 | 可能不足 | 通常更高,直到硬件饱和 |
| 单步墙钟时间 | 通常短 | 可能相近,也可能更长 |
| 优化轨迹 | 抖动明显 | 更稳定 |
课件用 V100 上的示意实验说明:在一定范围内增大 batch,可以靠 GPU 并行让单步时间不明显增加,因此每个 epoch 更快。但这不是普遍定律;超过显存、算力或通信甜点区后,单步时间一定会增加,分布式大 batch 还会引入同步通信。
小 batch 的噪声有时能帮助离开尖锐区域或鞍点,并在一些实验中得到更好的泛化;课件据此写出“小 batch 优化和泛化更好”。更严谨的结论是:这是依赖模型、数据、学习率调度和训练预算的经验现象,不是数学保证。大 batch 若配合学习率缩放、预热和足够训练步数,也可以取得很强结果。
八、为什么 batch size 会和学习率耦合
batch 变大后,梯度噪声减小,但每个 epoch 的更新次数也减少。如果仍保持相同学习率和 epoch 数,优化器实际执行的更新次数变了,比较并不公平。
实验时至少要同时记录:
- batch size;
- 学习率及调度;
- 总 step 数或总 epoch 数;
- 每步采用
sum还是meanreduction; - 是否做梯度累积。
梯度累积可以用若干小显存 batch 模拟较大的有效 batch,但只有在正确处理 loss 缩放、随机层和 BatchNorm 统计时才近似等价。
九、复习与常见误区
- 梯度为零只说明到达临界点,可能是极小、极大、鞍点或高阶退化点。
- Hessian 的正负特征值决定临界点附近不同方向的曲率;零特征值需要更高阶分析。
- 全批量梯度精确针对当前训练集,mini-batch 梯度是带噪估计。
- 一个 epoch 是看完一遍数据,不是只更新一次。
- batch 越大通常越能利用并行,但“单步耗时不变”只在硬件饱和前的一段范围成立。
- 小 batch 更易泛化是常见经验,不是无条件定理。
- 比较 batch size 时若不控制学习率、总 step 和 reduction,结论往往没有可比性。