分P:P25 ·
BV1ou411N7X3?p=25· 时长 54:32 · cid 1250616098 官方源:[TA 補充課] Optimization for Deep Learning (2/2)(YouTubee03YKGHXnL8,2020-04-09,3272 s) 主讲:助教 簡仲明——不是李宏毅本人 课程版本:2020 Spring TA 補充課 讲义:ML2020/Optimization.pdf,64 页;与 P24 共用,本文对应 pp.45–64 依据与边界:无字幕、未看画面。P24/P25 共用一份 PDF,pp.45–64 的归属是按章节顺序重建的,不是视频时间戳。讲义没有印刷页码,文中页码均为 PDF 物理页。
1. 这半讲的位置
P24 讲完了"优化器本身怎么改":Adam 的三个病灶、AMSGrad/AdaBound/RAdam、SGDM 的学习率调度、Lookahead。P25 换三个角度收尾:
- 动量的进阶:NAG、Nadam;
- 正则化与优化器的耦合:L2 与 weight decay 在 Adam 下不等价,引出 AdamW / SGDW;
- 训练技巧清单:shuffling、dropout、gradient noise、warm-up、curriculum、fine-tuning、normalization;
- 最后给"什么时候用 SGDM、什么时候用 Adam"的建议。
2. 动量回顾(p45–p46)
P24 已给过 SGDM。p45–p46 只用两张梗图复述一句话:更新方向 = 当前梯度 + 上一步的移动,所以在梯度为 0 的谷底/平台仍能靠惯性前进。这里不重复公式推导,只记住"动量是历史梯度的指数加权和"。
3. NAG:先看一步再算梯度(p47–p48)
SGDM:
NAG(Nesterov accelerated gradient)只改一处——梯度在"按动量预走一步之后"的位置算:
直觉:动量大的时候,先顺着惯性探出去,再在探到的位置看坡度,能更早刹车/转向。p47 的旁注是 "Math Warning",因为直接实现要维护一份"预走位置"的参数副本。
p48 做了一次换元:把"预走位置"吸收进动量的定义,得到一组只依赖当前参数与 \(m\) 的等价更新(讲义该页的推导有下标重排,OCR 后式子不完整,这里只保留结论,不硬凑中间步骤)。
结论(p48 原文):"No need to maintain a duplication of model parameters"。这就是深度学习框架里 NAG 的实际实现方式——看起来像"多减了一项 \(\lambda m_{t-1}\)",本质仍是同一条轨迹。
Nadam(p49)把 NAG 的"预看"塞进 Adam 的一阶矩:
即把偏差修正后的动量再向前推半步。它对 \(\beta_2\) 侧(分母)不做改动。
4. L2 正则 ≠ weight decay(p50–p51)
这是本讲最实用的一节。设
在 SGD 下,两者等价:
每步把参数乘 \((1-\eta\gamma)\),就是"衰减"。
在 Adam 下不等价。若把 \(\gamma\theta\) 加进梯度,它会同时进入 \(m_t\) 与 \(v_t\);更新式里的 \(\eta/\sqrt{\hat v_t}\) 会把这个衰减项按每个参数的梯度尺度重新缩放——梯度小的参数反而被衰减得更狠。p50 末尾连打了三个问号,就是在质疑这件事。
AdamW(p51)把衰减解耦出去:
SGDW 同理:\(\theta_t=\theta_{t-1}-m_t-\gamma\theta_{t-1}\),衰减不参与动量累积(注意这里 \(\gamma\) 未乘 \(\eta\),是讲义原式;不同框架的实现会差一个 \(\eta\),读代码时要对齐)。
【补充】数值对比(Python,\(\eta=10^{-3}\)、\(\gamma=0.01\)、\(\theta=1\)、\(\sqrt{\hat v}=0.01\)):
| 方式 | 单步收缩量 | 说明 |
|---|---|---|
| Adam + L2 | \(\eta\gamma\theta/\sqrt{\hat v}=10^{-3}\) | 被 \(1/\sqrt{\hat v}=100\) 放大 |
| AdamW | \(\eta\gamma\theta=10^{-5}\) | 与梯度尺度无关 |
同一组超参下差 100 倍。这就是"把 L2 直接塞进 Adam 的梯度里"经常训崩的原因:你以为在加 \(0.01\) 的衰减,实际在做 \(1\) 的衰减。
5. 训练技巧清单(p52–p54)
p52 的标题是 "Something helps optimization…",只给了三条并列的名词:
- Shuffling:讲义只写名字;【补充】作用是每个 epoch 打乱顺序,避免固定 batch 顺序带来系统性偏差;
- Dropout:讲义只列了名字,没有给公式、没有讲 train/eval 差异;
- Gradient noise:\(g_{t,i}\leftarrow g_{t,i}+N(0,\sigma_t^2)\),\(\sigma_t=c(1+t)^{-\gamma}\),噪声随时间衰减(此条讲义有公式)。
p53 是 "Teach your model patiently":warm-up、curriculum learning(先易后难,如先干净语音后噪声语音)、fine-tuning。
p54 只有两个词:Normalization / Regularization,没有任何展开。
边界说明:讲义在 p52 只把 dropout 作为一个条目列出,在 p54 只写了 "Normalization" 一词。BatchNorm 的公式、训练/推理差异、dropout 的缩放规则,这份 PDF 都没有讲。下面这段是我补的,不属于本课内容。
【补充·非讲义】训练与推理的两种模式,是读代码时最容易踩的坑:
- Dropout:训练时以概率 \(p\) 置零并以 \(1/(1-p)\) 缩放(inverted dropout),推理时关闭、不缩放;若训练时不做缩放,推理就要整体乘 \(1-p\)。两种写法等价,但不能混用。
- BatchNorm:训练时用当前 batch 的均值/方差归一化,并更新 running mean/var;推理时用 running 统计量,且不再更新。所以
model.eval()不是可有可无的开关——忘了切,batch 大小会改变预测结果。
这两条在 P24/P25 的讲义里找不到对应页,考试若按本课出题不会考;写代码时则需要。
6. 总结与选型(p55–p58)
p55 把方法分成三队:Team SGD(SGD、SGDM、LR scheduling、NAG、SGDWM)、Team Adam(Adagrad、RMSProp、Adam、AMSGrad、AdaBound、LR scheduling、RAdam、Nadam、AdamW)、以及跨队的 SWATS 与 Lookahead。
p56 的四行对比与 P24 一致:SGDM 慢、收敛好、稳、泛化间隙小;Adam 快、可能不收敛、不稳、间隙大。
p57 给的是领域经验,不是定理:
| 领域 | 首选 |
|---|---|
| 计算机视觉(分类/分割/检测) | SGDM |
| NLP(QA、翻译、摘要) | Adam |
| 语音合成 | Adam |
| GAN | Adam |
| 强化学习 | Adam |
p58 一句话收尾:"Universal Optimizer? No Way!!!"
7. 讲义原例与页码
| 内容 | 页码 | 性质 |
|---|---|---|
| SGDM / NAG 公式与等价变形 | p47–p48 | 讲义原文 |
| Nadam 的 \(\hat m_t\) | p49 | 讲义原文 |
| L2 与 Adam 耦合的三个问号 | p50 | 讲义原文 |
| AdamW / SGDW | p51 | 讲义原文 |
| Shuffling / Dropout / Gradient noise | p52 | 讲义原文(仅列条目) |
| Curriculum learning | p53 | 讲义原文 |
| Normalization / Regularization | p54 | 讲义原文(仅两个词) |
| 领域选型表 | p57 | 讲义原文 |
第 4 节的 100 倍数值对比是【补充】计算;第 5 节关于 dropout/BatchNorm 训练推理差异整段是【补充】,讲义无对应内容。
8. 易错对照
| 误区 | 正确 |
|---|---|
| L2 正则和 weight decay 永远等价 | 只在 SGD 下等价;Adam 下 L2 会被 \(1/\sqrt{\hat v}\) 缩放,故有 AdamW |
| AdamW 就是 Adam + L2 | AdamW 把衰减解耦,不进入 \(m,v\);两者数值不同 |
| NAG 要存两份参数 | p48 的等价变形说明不需要,框架实现只用一份 |
| Nadam 改了分母 | 只改一阶矩(动量),\(\beta_2\) 侧不变 |
| dropout 在推理时也随机置零 | 推理时关闭;训练时用 inverted scaling 保持期望 |
| BatchNorm 推理时用当前 batch 统计 | 推理用 running mean/var;训练才更新它们 |
| 讲义讲了 dropout 的机制 | p52 只列了名字,没展开;机制是我补的 |
| 存在万能优化器 | p58 明确否定;按领域与任务选 |
9. 自测
Q1. 写出 NAG 的两种等价形式,并说明为什么实际实现不需要额外参数副本。
参考答案
形式一:\(m_t=\lambda m_{t-1}+\eta\nabla L(\theta_{t-1}-\lambda m_{t-1})\),\(\theta_t=\theta_{t-1}-m_t\)。令 \(\theta'_t=\theta_t-\lambda m_t\) 可整理为 \(\theta_t=\theta_{t-1}-\lambda m_{t-1}-\eta\nabla L(\theta_{t-1})\)、\(m_t=\lambda m_{t-1}+\eta\nabla L(\theta_{t-1})\)。第二式只用当前 \(\theta\) 与 \(m\),所以不必维护"预走位置"的副本。
Q2. 为什么在 Adam 里直接把 \(\gamma\theta\) 加进梯度,效果会和 weight decay 不同?
参考答案
因为 Adam 的分母 \(\sqrt{\hat v_t}\) 会对每个坐标单独缩放整个更新(含衰减项)。梯度尺度小的参数,其 \(\sqrt{\hat v}\) 小,衰减被放大;而且 \(\gamma\theta\) 还进入 \(v_t\),改变了自适应尺度。AdamW 把 \(\gamma\theta\) 移到自适应项之外,衰减就只与 \(\theta\) 成正比。
Q3. 用 \(\eta=10^{-3},\gamma=0.01,\theta=1,\sqrt{\hat v}=0.01\) 估算 Adam+L2 与 AdamW 的单步收缩量。
参考答案
Adam+L2:\(\eta\gamma\theta/\sqrt{\hat v}=10^{-3}\times0.01\times1/0.01=10^{-3}\)。AdamW:\(\eta\gamma\theta=10^{-5}\)。相差 100 倍,前者远超预期。
Q4. 讲义对 dropout 和 BatchNorm 到底讲了多少?如果面试被问"BN 训练和推理有什么区别",能引用本课吗?
参考答案
讲义只在 p52 把 dropout 列为一条名词,在 p54 写了 "Normalization" 一个词,没有公式与训练/推理差异。不能声称本课讲过;BN 的 running statistics 与 eval 模式属于通用知识补充,需另找来源。
Q5. 为什么 CV 常用 SGDM、NLP 常用 Adam?这是定理吗?
参考答案
不是定理,是 p57 的经验总结。一种解释是 CV 的 batch 较大、梯度噪声较低,SGDM 的稳定与平坦解更有利;NLP/语音/GAN 参数稀疏、梯度尺度差异大,自适应步长更合适。属于领域惯例,换任务要实测。
10. 30 秒速记
动量进阶:NAG 在"预走一步"处取梯度,可等价变形为单副本实现;Nadam 把预看塞进一阶矩。L2 ≠ weight decay(Adam 下),因为自适应分母会缩放衰减 → AdamW 解耦。训练技巧讲义只给了清单(shuffling、dropout、gradient noise、warm-up、curriculum、fine-tuning、normalization),dropout/BN 的细节不在本课。选型:CV 用 SGDM,NLP/语音/GAN/RL 用 Adam,没有万能优化器。
与其他 P 的关系:P24 是本节的前半(Adam 病灶与补丁);P22/P23 提供 GD 的几何直观;P17 的鞍点/平台解释了动量为什么有用;P16 的 optimization issue 一格是这一切的诊断入口。