第二十四讲 · 优化地形、Hessian 与小批量训练

Views: --

训练模型可以想成在一片高维地形上找低处:参数是当前位置,损失是海拔,梯度告诉我们最陡的上坡方向。这个比喻很有用,但也容易让人误以为训练只是沿光滑山谷走到底。真实神经网络的参数空间维度极高,里面既有局部极小值,也有大量平坦方向与鞍点;而 mini-batch 计算出来的梯度还带着噪声。

一、损失曲面从哪里来

以线性模型

y=b+wxy=b+wx

为例,每个训练样本产生一个损失 Li(b,w)L_i(b,w),整个训练集的目标为

J(b,w)=1Ni=1NLi(b,w).J(b,w)=\frac1N\sum_{i=1}^N L_i(b,w).

给每组 (b,w)(b,w) 画出一个高度 J(b,w)J(b,w),就得到二维参数上的损失曲面。神经网络只是把参数从两个换成数百万个,无法直接画出来,但梯度和曲率的数学含义没有变。

梯度下降更新为

θt+1=θtηJ(θt),\theta_{t+1}=\theta_t-\eta\nabla J(\theta_t),

其中 η\eta 是学习率。负梯度是当前位置的一阶近似下下降最快的方向,却不保证一步后到达全局最小值。

优化首先关心两个问题:能不能到达梯度接近零的区域,以及到达得有多快。机器学习还多一个问题:训练目标很低时,未见数据上的误差是否也低。

二、梯度与 Hessian 分别告诉我们什么

θ\theta' 附近,二阶泰勒展开为

J(θ)J(θ)+(θθ)Tg+12(θθ)TH(θθ),J(\theta) \approx J(\theta') +(\theta-\theta')^{\mathsf T}g +\frac12(\theta-\theta')^{\mathsf T} H(\theta-\theta'),

其中

g=J(θ),Hij=2Jθiθjθ.g=\nabla J(\theta'), \qquad H_{ij}=\frac{\partial^2J} {\partial\theta_i\partial\theta_j}\bigg|_{\theta'}.
  • 梯度 gg 描述局部斜率;
  • Hessian HH 描述不同方向上的曲率;
  • Hessian 的特征向量给出主曲率方向,特征值给出对应方向弯曲的正负与强弱。

在临界点 g=0g=0 处,二阶项成为主要判断依据。对任意非零方向 vv

Hessian 情况vTHvv^{\mathsf T}Hv局部形状
正定,全部特征值 >0>0所有方向都为正严格局部极小值
负定,全部特征值 <0<0所有方向都为负严格局部极大值
不定,正负特征值都有有的方向正、有的方向负鞍点

若存在零特征值,二阶信息可能不足以判定,需要看更高阶项。把“梯度为零”直接等同于“到达最小值”是不对的。

三、课件中的鞍点算例

考虑两个串联标量权重:

x=1,y=w1w2x,y^=1,x=1,\qquad y=w_1w_2x,\qquad \hat y=1,

平方损失为

J(w1,w2)=(1w1w2)2.J(w_1,w_2)=(1-w_1w_2)^2.

梯度为

Jw1=2w2(1w1w2),Jw2=2w1(1w1w2).\begin{aligned} \frac{\partial J}{\partial w_1} &=-2w_2(1-w_1w_2),\\ \frac{\partial J}{\partial w_2} &=-2w_1(1-w_1w_2). \end{aligned}

(w1,w2)=(0,0)(w_1,w_2)=(0,0),梯度为零,但损失为 11。Hessian 是

H=[0220],H= \begin{bmatrix} 0&-2\\ -2&0 \end{bmatrix},

特征值为 222-2,所以原点是鞍点。沿负曲率方向 v=(1,1)Tv=(1,1)^{\mathsf T} 做一个很小的移动:

J(ε,ε)=(1ε2)2<1,J(\varepsilon,\varepsilon) =(1-\varepsilon^2)^2<1,

损失会下降;沿另一个方向则会上升。这说明梯度在鞍点处虽然暂时没有方向,Hessian 的负特征值却揭示了逃离方向。

四、局部极小、鞍点与全局最小

凸函数的任意局部极小值都是全局极小值;深度神经网络的目标通常非凸,因此没有这种整体保证。不过高维空间中,要让 Hessian 所有特征值都为正,比同时出现正负曲率更苛刻,鞍点因而十分常见。

课件展示的历史经验研究把临界点 Hessian 中正特征值比例与训练损失联系起来:损失较低的临界区域更“像”局部极小值,但实验不意味着训练必然到达严格局部极小值,也不能从二维示意图推出所有深网的统一结论。

实际训练停止还可能因为:

  • 梯度很小但损失仍高;
  • 学习率太小,移动慢到像停住;
  • 曲率差异太大,在陡峭方向振荡、平坦方向前进缓慢;
  • 参数化存在大量等价解和平坦方向;
  • mini-batch 噪声让损失在附近波动。

五、全批量梯度与随机梯度

完整目标梯度为

J(θ)=1Ni=1Ni(θ).\nabla J(\theta) =\frac1N\sum_{i=1}^N\nabla\ell_i(\theta).

若每次都扫描全部 NN 个样本,得到 full-batch gradient descent。数据很大时,一次更新就要做完整遍历,代价高且更新频率低。

mini-batch SGD 每次抽取大小为 BB 的批次 Bt\mathcal B_t

gt=1BiBti(θt),θt+1=θtηgt.g_t=\frac1B\sum_{i\in\mathcal B_t} \nabla\ell_i(\theta_t), \qquad \theta_{t+1}=\theta_t-\eta g_t.

在均匀随机抽样等常见条件下,gtg_t 是全数据梯度的无偏或近似无偏估计:

E[gt]=J(θt).\mathbb E[g_t]=\nabla J(\theta_t).

但具体一个批次的 gtg_t 会随机偏离全数据梯度,也就是存在采样误差。batch 越小,梯度方差通常越大;batch 越大,估计更稳定。

六、epoch、iteration 和 shuffle

若数据量为 NN,batch size 为 BB,一个 epoch 大约包含

NB\left\lceil\frac NB\right\rceil

次参数更新。三个概念要分开:

  • iteration / step:用一个 batch 做一次更新;
  • epoch:所有训练样本大致被看过一遍;
  • shuffle:每个 epoch 重新打乱样本顺序,避免批次长期保持固定相关性。

例如 N=20N=20:full batch 每个 epoch 更新 1 次,B=1B=1 时更新 20 次。两者都看完同样的数据,却沿着完全不同的参数轨迹前进。

最后一个不足 BB 的 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 还是 mean reduction;
  • 是否做梯度累积。

梯度累积可以用若干小显存 batch 模拟较大的有效 batch,但只有在正确处理 loss 缩放、随机层和 BatchNorm 统计时才近似等价。

九、复习与常见误区

  • 梯度为零只说明到达临界点,可能是极小、极大、鞍点或高阶退化点。
  • Hessian 的正负特征值决定临界点附近不同方向的曲率;零特征值需要更高阶分析。
  • 全批量梯度精确针对当前训练集,mini-batch 梯度是带噪估计。
  • 一个 epoch 是看完一遍数据,不是只更新一次。
  • batch 越大通常越能利用并行,但“单步耗时不变”只在硬件饱和前的一段范围成立。
  • 小 batch 更易泛化是常见经验,不是无条件定理。
  • 比较 batch size 时若不控制学习率、总 step 和 reduction,结论往往没有可比性。

评论