EECS498 · Deep Learning Revisited · 03
Optimization and Training Dynamics
Backprop 给出 gradient;“模型能不能学起来”取决于怎样使用它、信号怎样穿过深层网络,以及 representation 的尺度是否稳定。
30-second recall
30 秒回忆
你写过 SGD、momentum、RMSProp、Adam、dropout、Kaiming initialization 和 BatchNorm。
- learning rate 控制什么?
- Adam 的 m/v 在记什么?
- 初始化与 normalization 为什么影响梯度?
Why Did We Need This?
同一个正确 gradient,步子太小会停滞,太大会越过谷底;层数增加后,activation/gradient 尺度还可能逐层放大或衰减。训练失败常不是“模型不会”,而是优化路径失去可用信号。
What You Actually Implemented
| Mechanism | Repository implementation | Purpose |
|---|---|---|
| SGD / Momentum |
A3/fully_connected_networks.py
|
step + velocity |
| RMSProp / Adam | same file | coordinate-wise scaling + moments |
| Kaiming / BatchNorm |
A3/convolutional_networks.py
|
preserve usable scale |
| Dropout |
A3/fully_connected_networks.py
|
stochastic regularization |
优化器决定如何在 loss landscape 上走;初始化与 normalization 决定这张地形和梯度信号是否处在能走的尺度。
Mechanism · 从 SGD 到 Adam
SGD: θ ← θ − ηg
Momentum: v ← μv − ηg; θ ← θ + v
Adam: m ← β₁m+(1−β₁)g
v ← β₂v+(1−β₂)g²
θ ← θ − η m̂/(√v̂+ε)
m 平滑方向,v 估计每个坐标近期的平方尺度;bias correction 处理训练初期两个状态从零开始的偏差。
Your code · 2022
A3/fully_connected_networks.py · adam()
m = beta1*m + (1-beta1)*dw
mt = m / (1-beta1**t)
v = beta2*v + (1-beta2)*(dw**2)
vt = v / (1-beta2**t)
next_w = w - lr * mt / (torch.sqrt(vt) + eps)
Normalization is about coordinates
BatchNorm 用 batch statistics 校准 channel;后来的 Transformer 更常用 LayerNorm,在每个 token 的 feature 维内校准。二者不是可互换 API:它们选择了不同的归一化轴,也就选择了哪些样本/位置互相影响。
Historical implementation note:
A3/convolutional_networks.py 的普通 BatchNorm section 有填充,但 SpatialBatchNorm.forward/backward 仍保留 pass。本课程不会把后者写成已完成。
Why This Design?
- 没有合适 initialization:深层 ReLU 的 variance 会漂移。
- 没有 regularization:训练 accuracy 可继续升,验证集却可能停滞。
- 没有 optimizer state:狭长谷底中 SGD 容易来回震荡。
Common misconception:Adam 不是“永远更好的 SGD”,BatchNorm 也不只是让数字落进固定范围。它们改变训练动力学与隐式偏好,仍需和 learning rate、batch、architecture 一起看。
Then vs Now
现代 LLM 常见 AdamW、warmup、cosine decay、gradient clipping 与 LayerNorm/RMSNorm;但账本仍是:gradient → optimizer state → parameter update。你当年写的 Adam 状态就是今天大模型训练中昂贵 optimizer memory 的来源。
Concept Checks
参数 θ=[128,64],Adam 的 m 与 v 是什么 shape?
都为 [128,64]。它们为每个参数坐标保存一阶、二阶历史,因此 optimizer state 通常是参数量的倍数。
若把 learning rate 放大 1000 倍,gradient 方向仍正确,为什么训练仍会坏?
一阶局部近似只在小邻域可信;大步会跨过低 loss 区域并让 activation/gradient 爆炸。
BatchNorm 与 LayerNorm 最关键的 shape 区别是什么?
BatchNorm 对同一 channel 汇总 batch/空间样本;LayerNorm 对单个样本或 token 的 feature 维汇总,不依赖其他 batch item。
Depth Lab · optimizer 是 trajectory,不是菜单
Gradient 只描述当前位置最陡上升方向;训练还必须决定步长、怎样平滑噪声、以及每个 coordinate 用多大 effective step。
一维参数 w=2,gradient g=4:
lr=.01 → w'=1.96 小步、稳定但可能慢
lr=.5 → w'=0 大步;在弯曲 loss 上可能越过 valley
SGD: w ← w - ηg
Momentum: v ← μv - ηg; w ← w+v
Adam: track first moment m and squared-gradient v;
scale each coordinate by 1/(√v+ε)- Gradient 提供 local direction。
- Learning rate 把斜率变成实际 displacement。
- Momentum 累积一致方向,抑制来回震荡。
- Adam 的 second moment 让长期大-gradient coordinate 步长相对缩小。
- None of these guarantees generalization;validation curve 是独立证据。
读曲线,而不是只读最终 accuracy
| 现象 | Training loss | Validation | 优先怀疑 |
|---|---|---|---|
| lr too low | 缓慢下降 | 缓慢改善 | 步长太小 |
| lr too high | 震荡/发散 | 不稳定 | 跨过低 loss region |
| underfit | 仍高 | 也差 | capacity/optimization |
| overfit | 持续下降 | 先好后坏 | memorization / regularization |
你能判断 optimization 是否拟合训练集,却无法区分可迁移规律与 memorization。
Adam 不是“自动找到正确 learning rate”。它做 per-parameter adaptive scaling,仍有 global lr、schedule 与稳定性选择。
Training loss 平滑下降、validation 先降后升,继续加 epochs 会怎样?
更可能加剧 overfit;应考虑 early stopping、regularization 或数据,而非只换更强 optimizer。
某 coordinate 最近 gradients 交替 +10/-10,momentum 有何作用?
相反方向贡献部分抵消,减少震荡;持续同方向则累积速度。
Transfer Question
Transformer training 出现 loss spike。若 gradient norm 同时突然升高,你会怎样区分 lr 问题、数据异常与 numerical instability?
闭卷解释
- 方向、步长、历史 gradient 各由什么控制?
- 从两条 loss curves 诊断 overfit。
- 为什么 optimizer 改善 training 不等于改善 validation?
Connection
接下来把“任意 vector function”换成 image-aware function:用 locality 与 weight sharing 改变 parameterization 本身。
Based on your implementation