先记住一句话
gradient 指向局部上升最快方向,负 gradient 是一阶近似下最陡下降方向;learning rate 决定你愿意相信这个局部近似走多远。
1. 从一阶 Taylor expansion 出发
L(θ+Δθ) ≈ L(θ)+∇L(θ)ᵀΔθ若限制 ‖Δθ‖,让线性项下降最快的方向是 −∇L,于是 full-batch gradient descent:
θₜ₊₁=θₜ−η∇L(θₜ)这是局部结论。η 太大时走出 Taylor approximation 有效区域,loss 会震荡/发散;太小则训练极慢。
2. 为什么用 stochastic minibatch
全数据 gradient 昂贵。随机 minibatch B 给 estimator g_B,在正常采样下近似无偏:
E[g_B]≈∇L, Var(g_B) 随 batch 增大而下降noise 不是纯坏事:它降低每步成本并帮助探索,但也让 validation/loss curve 抖动。SGD 的 “stochastic” 来自数据采样,不是给参数额外加随机噪声。
3. Conditioning:为什么走成锯齿
若 loss 在一个方向陡、另一个方向平,单一 learning rate 必须照顾最陡 curvature,于是会在窄方向震荡、沿平方向缓慢移动。quadratic loss 的 Hessian eigenvalue ratio(condition number)刻画这种难度。momentum 和 preconditioning/adaptive scale 都在改善这个几何问题。
4. 参数 scale 与 coordinate
同一函数换一种参数化,plain SGD 轨迹可能完全不同,因为 Euclidean gradient 依赖坐标。normalize layer、residual scale、initialization 和 loss scale 会改变每层 gradient magnitude;optimizer 不能脱离 model parameterization 比较。
5. Gradient norm 看什么
- global norm 突然爆炸:bad batch、numerical overflow、长序列或 unstable recurrence;
- 长期接近零:saturation、dead branch、loss mask 或 scale 错;
- 单层远大于其余:unit/normalization/architecture mismatch;
- gradient finite 不等于 update finite:optimizer state 与 division 也可能坏。
6. Gradient clipping
global norm clipping:
g ← g · min(1, c/‖g‖)它限制一次异常 gradient 的整体 norm,同时保留方向。value clipping 会逐元素截断并改变方向。clipping 是 safety guard,不应长期遮住 loss/data/model 的系统性不稳定;要监控 clip fraction 和 unclipped norm。
7. Step、sample 与 token 不同
optimizer step 可能累积多个 microbatches;不同 sequence length 下每 step tokens 也不同。比较 convergence 要同时报告 steps、samples/tokens 与 wall-clock。只说“100k steps 更快”可能只是 global batch 更大。
8. 最小 SGD loop
for minibatch in data:
loss = model(minibatch)
loss.backward() # accumulate gradients
unscale_if_mixed_precision()
clip_grad_norm_if_needed()
optimizer.step() # mutate parameters + state
scheduler.step_if_per_step()
optimizer.zero_grad(set_to_none=True)gradient accumulation 时,应在完成所有 microbatches 后再 clip/step;distributed data parallel 通常在 backward 中 all-reduce gradient。
9. 四个可手算的 SGD 例子
例 1:一步 gradient descent
L(θ)=(θ−3)²,θ₀=0,则 gradient=2(0−3)=−6。η=0.1 时 θ₁=0−0.1×(−6)=0.6;loss 从 9 降到 (0.6−3)²=5.76。
例 2:minibatch gradient
4 个样本的 scalar gradients 为 [2,−1,3,0],batch mean=(2−1+3+0)/4=1。若 η=0.05,参数更新 Δθ=−0.05;换一批样本,mean 会抖动。
例 3:conditioning 制造锯齿
L=(x²+100y²)/2,从 (1,1) 出发,gradient=(1,100)。η=0.01 后得到 (0.99,0):陡峭 y 方向一步到底,平缓 x 方向只走 0.01;更大 η 会让 y 来回越界。
例 4:global-norm clipping
Gradient vector=(6,8),L2 norm=√(36+64)=10。max norm=5 时 scale=5/10=0.5,clip 后 gradient=(3,4),方向不变而长度变为 5。
训练 loss 暂时上升不一定说明 optimizer 错,因为 minibatch noise 和目标分布会变化;但持续发散、NaN 或 update/weight ratio 激增必须查 LR、precision、data 和 state,而不是只靠更强 clipping。
自测
1. negative gradient 为什么只保证局部下降?
它来自一阶 Taylor approximation;step 太大后 curvature 与 higher-order terms 不能忽略。
2. batch 变大通常怎样影响 gradient noise?
独立样本假设下 variance 降低,但样本相关性、重复和非平稳数据会改变简单缩放。
3. clipping 应在 mixed-precision unscale 前还是后?
后;否则 clip 的是被 loss scale 放大的 gradient,不是实际 gradient norm。
一手资料
Adam 原论文从 stochastic first-order optimization 背景出发,并给出 momentum/adaptive moment 的统一定义;后续文章会逐项展开。