分P:P24 ·
BV1ou411N7X3?p=24· 时长 54:36 · cid 1250616359 官方源:[TA 補充課] Optimization for Deep Learning (1/2)(YouTube4pUmZ8hXlHM,2020-04-09,3275 s) 主讲:助教 簡仲明(Chung-Ming Chien)——不是李宏毅本人 课程版本:2020 Spring TA 補充課(ML2020),与 2021 的 optimizer 讲义不是同一份 讲义:ML2020/Optimization.pdf,64 页;PDF 无印刷页码,下文页码 = PDF 物理页 依据与边界:无字幕、未下载视频、未看画面。P24/P25 共用这一份 64 页 PDF;本文按章节顺序把 pp.1–44 划给 P24、pp.45–64 划给 P25。这是结构重建,不是从视频时间戳数出来的;若与实际上课切分有出入,以"章节归属"为准,不以分钟数为准。
1. 这半讲在讲什么
标题页 p1/p3/p4 写的是 "New Optimization / New Optimizers for Deep Learning",日期 2020/4/9–4/12。它不是从零教梯度下降,而是:
- 用统一记号把 SGD / SGDM / Adagrad / RMSProp / Adam 快速过一遍(p10–p16);
- 指出 Adam 在实际落地时的毛病(泛化间隙、不稳定、\(v\) 记忆过长),以及一串补丁:SWATS、AMSGrad、AdaBound、RAdam、warm-up;
- 给 SGDM 阵营配学习率调度:LR range test、cyclical、SGDR、one-cycle;
- 用 Lookahead 把任意优化器包一层。
一句话主线:Adam 快但泛化差、SGDM 稳但慢,中间所有工作都在试图同时拿到两者。
2. 记号(p6)
| 符号 | 含义 | 维度 |
|---|---|---|
| \(\theta_t\) | 第 \(t\) 步的模型参数 | \(\mathbb{R}^{D}\) |
| \(g_t=\nabla L(\theta_t)\) | 第 \(t\) 步梯度 | \(\mathbb{R}^{D}\) |
| \(m_t\) | 动量(梯度的滑动和) | \(\mathbb{R}^{D}\) |
| \(v_t\) | 梯度平方的滑动平均 | \(\mathbb{R}^{D}\) |
| \(\eta\) | 学习率 | \(\mathbb{R}_{>0}\) |
| \(\beta_1,\beta_2\) | 动量/平方梯度的衰减率 | \([0,1)\) |
| \(\epsilon\) | 防止除零的小常数 | \(10^{-8}\) |
| \(t\) | 更新步数 | \(\mathbb{N}\) |
注意:讲义里 \(\theta_t\) 用的是 \(g_{t-1}\),即"先算梯度再更新",与"先更新再算梯度"只差一个下标,读公式时不要混。
3. Online vs Off-line(p8–p9)
- Online:每个时间步只来一个 \((x_t,\hat y_t)\),立刻更新;
- Off-line:每一步都把全部数据灌进模型算 \(L(\theta_t)\),再更新。
p9 明确写 "The rest of this lecture will focus on the off-line cases"。所以后面所有 \(g_t\) 都可理解成全量梯度;实际实现用 mini-batch 近似,这个差别本讲不展开。
4. 五个基线优化器(p10–p16)
SGD(p10)
SGDM(p11–p13)
p13 用"停下来!让我看看"的梗讲动量:走到谷底时梯度为 0,但历史动量还在,于是能冲过小坑/平台。\(m_t\) 是历史梯度的指数加权和。
Adagrad(p14)
分母单调增大 ⇒ 学习率单调递减。p14 的提问是 "What if the gradients at the first few time steps are extremely large…"——早期一个大梯度会把之后所有步的学习率永久压小。
RMSProp(p15)
p15 的关键一句:"EMA of squared gradients is not monotonically increasing"——这就是它相对 Adagrad 的改进:旧梯度会被遗忘,学习率可以回升。
Adam(p16)= SGDM + RMSProp + 偏差修正:
默认 \(\beta_1=0.9,\ \beta_2=0.999,\ \epsilon=10^{-8}\)。偏差修正不是可选技巧:\(m_0=v_0=0\),若不做修正,前几步的 \(m_t,v_t\) 都被 0 拉小,\(\hat m/\sqrt{\hat v}\) 会失真。除以 \(1-\beta^t\) 正好把它还原成无偏估计。
5. Adam vs SGDM:快与稳的取舍(p23–p28)
p27 的四条对比:
| Adam | SGDM | |
|---|---|---|
| 速度 | 快 | 慢 |
| 收敛 | 可能不收敛 | 更好 |
| 稳定性 | 不稳定 | 稳定 |
| 泛化间隙 | 大 | 小 |
p28 的 SWATS 是最直白的折中:先用 Adam 快速下降,满足某个判据后切到 SGDM 收尾。它的弱点是"判据"要人定。
【补充】"泛化间隙"指训练 loss 与测试 loss 的差距;Adam 常落到更尖的极小值,测试表现更差。这是经验结论(p27 引 Luo et al., ICLR'19),不是定理。
6. Adam 的三个病灶与补丁
(a)\(v\) 的记忆太长(p29–p30)。\(\beta_2=0.999\) ⇒ 有效记忆约
p29 的例子:前 1000 步梯度都是 1,某一小批突然给出 \(10^5\) 的大梯度。由于 \(v\) 被 1000 步的历史稀释,这个大梯度产生的位移只有约 \(10\eta\),随后迅速衰减;反过来,大量无信息的小梯度会持续贡献位移,反而压过偶尔出现的有信息大梯度。p30 给出单步位移的上界:
(b)AMSGrad(p31):把分母换成历史最大
\(v\) 单调不减 ⇒ 学习率单调不增,压住"后期学习率又被小梯度抬回去"的问题。代价是它只处理了"学习率过大"这一侧。
(c)AdaBound(p33):直接把学习率夹在区间里
上下界随时间收窄到约 \(0.1\),最终退化成固定学习率的 SGD。p33 的自评很刻薄:"That's not 'adaptive' at all…"。
(d)warm-up 与 RAdam(p39–p41)。p39–p40 说:训练前 10 步梯度分布是扭曲的,\(v\) 的 EMA 还没稳定,此时自适应学习率不可信;所以开头要把步长压小。RAdam 把它做成公式:记
\(\rho_t\) 可理解为"当前 EMA 的有效记忆长度"。当 \(\rho_t\le 4\)(最初几步)时退化成 SGD 式更新(不带自适应分母);\(\rho_t>4\) 后按 \(\rho_t/\rho_\infty\) 的比例逐步放开。\(\beta_2=0.999\) 时 \(\rho_\infty=1999\),而 \(t=1\) 时 \(\rho_1=1\)、\(t=4\) 时 \(\rho_4\approx3.997\)——前四步都还在 warm-up 区(数值由 Python 复算)。
7. SGDM 阵营:学习率调度(p34–p38)
p35–p38 的幻灯片只有标题、曲线图与参考文献,没有文字定义;下面四条的具体做法是【补充】的通用解释。
p34 的问题设定很准:自适应方法逐参数调步长,SGD 类则所有参数共用一个 \(\eta\)——小了太慢,大了结果差。"是否存在一个最好的 \(\eta\)?"
- LR range test(p35):从极小学习率开始,逐步增大,记录 loss;取 loss 开始爆掉之前的区间作为可用范围。
- Cyclical LR(p36):学习率在上下界之间周期往复,用"变化"本身跳出局部极小;步长按 epoch 设。
- SGDR(p37):余弦退火 + 周期性重启(warm restart)。
- One-cycle(p38):warm-up → annealing → 微调,一条曲线走完。
p36 的口号是 "The more exploration the better!"——和 p52 的 gradient noise、p53 的 curriculum 是同一思路。
8. Lookahead:\(k\) 步前进,1 步回看(p43–p44)
内层用任意优化器走 \(k\) 步,外层只朝终点插值一步。p44 说它的作用是"避免一次太危险的探索"、找更平坦的极小值、更稳、泛化更好。因为不依赖内层细节,所以叫 universal wrapper(Ranger = RAdam + Lookahead)。
9. 讲义原例与页码
| 内容 | 页码 | 性质 |
|---|---|---|
| 记号与 \(g_t\) 定义 | p6 | 讲义原文 |
| Adagrad / RMSProp / Adam 公式 | p14–p16 | 讲义原文 |
| Adam vs SGDM 四条对比 | p27 | 讲义原文(引 Luo et al.) |
| 1000 步记忆与大梯度例子 | p29–p30 | 讲义原文 |
| AMSGrad / AdaBound | p31、p33 | 讲义原文 |
| RAdam 的 \(\rho_t\) 分段 | p41 | 讲义原文 |
| Lookahead 伪码 | p43 | 讲义原文 |
第 6 节的 \(1000\)、\(693\)(EMA 半衰期)、\(\rho_\infty=1999\)、\(\rho_1=1\) 是我用 Python 复算的数值,讲义只给了 \(1/(1-\beta_2)\) 这个量级说法。
10. 易错对照
| 误区 | 正确 |
|---|---|
| 这是李宏毅的课 | 2020 TA 補充課,主讲助教簡仲明 |
| P24 用 2021 的 optimizer 讲义 | 用 ML2020/Optimization.pdf;2021 那份是另一门课的内容 |
| Adam 的 \(\hat m,\hat v\) 可省 | 不能;前几步偏差极大,必须除以 \(1-\beta^t\) |
| Adam 一定比 SGD 好 | p27:Adam 快但泛化间隙大、可能不收敛 |
| Adagrad 学习率一直降是优点 | 单调递减会让后期几乎不动,RMSProp 正是为此改成 EMA |
| AMSGrad 解决了所有问题 | 只压住学习率过大一侧(p33 明说) |
| warm-up 只是调参玄学 | p40 给了机制:前几步 \(v\) 的 EMA 不可信 |
| Lookahead 是某个具体优化器 | 它是 wrapper,内层可换任意优化器 |
11. 自测
Q1. 写出 Adam 的完整更新式,并解释 \(\hat m_t,\hat v_t\) 为什么要除 \(1-\beta^t\)。
参考答案
\(m_t=\beta_1m_{t-1}+(1-\beta_1)g_{t-1}\),\(v_t=\beta_2v_{t-1}+(1-\beta_2)g_{t-1}^2\),\(\hat m=m_t/(1-\beta_1^t)\),\(\hat v=v_t/(1-\beta_2^t)\),\(\theta_t=\theta_{t-1}-\eta\hat m/(\sqrt{\hat v}+\epsilon)\)。因为 \(m_0=v_0=0\),前几步的滑动平均被 0 拉低,期望偏小;除以 \(1-\beta^t\) 使其成为无偏估计,否则初期步长会被严重低估(\(v\) 侧尤其)。
Q2. \(\beta_2=0.999\),\(v\) 的"记忆"大约多长?为什么这会让罕见大梯度吃亏?
参考答案
约 \(1/(1-\beta_2)=1000\) 步。\(v\) 是 1000 步平方梯度的加权平均,单个大梯度只占约 \(1/1000\) 权重,被历史小梯度稀释;于是"偶尔出现的有信息大梯度"产生的位移,可能小于"长期存在的小梯度"累积的位移,单步位移上界约 \(1000\eta\)。
Q3. AMSGrad 与 AdaBound 分别在修什么?各自的局限?
参考答案
AMSGrad 用 \(\tilde v_t=\max(\tilde v_{t-1},v_t)\) 让分母不减,压住学习率反弹(过大一侧)。AdaBound 直接把学习率 clip 到随时间收窄的区间,最终近似固定学习率 SGD;它自评"根本不 adaptive",且只处理边界、不解决根因。两者都只覆盖 Adam 病灶的一部分。
Q4. RAdam 的 \(\rho_t\) 在 \(t=1\) 和 \(t=100\) 大约是多少?说明它的行为。
参考答案
\(\rho_\infty=1999\);\(\rho_1=1\),\(\rho_4\approx3.997\),\(\rho_{100}\approx98.3\)。\(\rho_t\le4\) 时用 SGD 式更新(前四步等于自动 warm-up),之后按 \(\rho_t/\rho_\infty\) 逐渐放开自适应分母。
Q5. Lookahead 的内层和外层各做什么?为什么说它"通用"?
参考答案
内层用任意优化器从 \(\phi_{t-1}\) 连续走 \(k\) 步得到 \(\theta_{t,k}\);外层只做 \(\phi_t=\phi_{t-1}+\alpha(\theta_{t,k}-\phi_{t-1})\) 的插值。因为它只调用 Optim 接口、不假设内层是 SGD 还是 Adam,所以可包任意优化器(如 Ranger)。
12. 30 秒速记
五个基线:SGD → SGDM(动量)→ Adagrad(累积平方梯度,单调降)→ RMSProp(改 EMA,可回升)→ Adam(两者 + 偏差修正)。Adam 快但泛化差、不稳;补丁分两路:压学习率(AMSGrad、AdaBound)、修初期(warm-up、RAdam);SGDM 侧靠调度(range test、cyclical、SGDR、one-cycle);Lookahead 是通用外壳。没有万能优化器。
与其他 P 的关系:P22/P23 是 GD 的直观演示;P17 讲梯度小/鞍点,是本节"为什么需要动量与自适应"的前置;P25 接着讲 NAG、Nadam、weight decay 与训练技巧;P16 的 optimization issue 一格靠这里的方法解决。