本节摘要:不同维度的参数坡度差别巨大,单一学习率无法两边讨好。本节从 AdaGrad 的单调收缩讲到 RMSProp 的指数衰减,再到 Adam 把动量与自适应合流,讲清每个方法的"补丁"版本,并点出各自踩过的坑,为 4.5 的选型做铺垫。
动量让方向顺畅了,可它忘了一件事:不同参数的"地形坡度"可能差上百倍。 有的参数梯度巨大、陡峭;有的参数几乎不产生梯度、平坦。给它们喂同一个学习率,陡的会抖、平的会磨。这一节的解法是"因材施教"——让每根参数按自己的历史梯度调整步伐。
最朴素的做法是:谁的历史梯度越大,就越该给谁更小的步伐。AdaGrad 就这么干——它给每个参数累计一个历史梯度的平方和 s,然后用"学习率 / 根号下 s"去缩放每个参数的更新。
RMSProp 修 AdaGrad 那个"只增不减"的毛病:它不再让 s 一路累加,而是用一个衰减因子 β 做指数加权平均——新的 s 只保留一部分旧 s,再掺入当前梯度平方。这样:
于是同一根参数能随着梯度"大时降步伐、小时回步伐",比 AdaGrad 健康得多。RMSProp 由此成了很多 RNN 类任务的常见选择。
Adam(Adaptive Moment Estimation)做的事,就是把 4.3 的动量、4.4 的 RMSProp 自适应一起缝进一个框架:
整体出来的更新更顺、更快,也基本免去你反复手挑学习率的痛苦——Adam 在大多数任务里"开箱即用"就是这么来的。
下面这张 SVG 用"两根参数地貌"示意:同一学习率下,平坦参数的走量与陡峭参数完全不同。

Adam 默认参数几乎能打天下:学习率 0.001,β1=0.9、β2=0.999,ε 做数值稳定地板。你通常不用动 β,最多把学习率在 1e-3 到 1e-4 之间试。
它顺带缓解了"误差梯度在早期被校偏""稀疏特征时机不均"一堆旧问题,因此在新模型验证阶段,Adam 几乎总是第一选择。代价是它的二、三阶矩各占内存,参数极多时内存开销比 SGD 大。
几乎每本讲优化的书都提醒一件事:Adam 收敛快,但最终泛化(在测试集上的表现)有时未必比调好的 SGD + 动量更好。 一些研究观测到 Adam 会把模型带到更"尖锐"的解,测试误差略高。所以实践里出现了"先用 Adam 快速探路、再用调好的 SGD 精修"的常见战术——这也是 4.5 选型里最实用的思路。
⚠️ 常见坑:把 Adam 当"永远不会错"的万能解,上来就默认并一路到底。它好在省心、坏在可能泛化略逊。正确做法是跑基线看曲线,不理想再切换策略。
口说无凭,我们把 AdaGrad 的核心动作算一遍:维护累计平方和 s,每一步更新都是 s += g²,并用 lr / sqrt(s) 缩放。
# 概念片段:AdaGrad 的累积平方让步伐单调收窄 s = 0.0 lr = 0.1 for g in [1.0, 1.0, 1.0, 1.0]: # 恒定梯度 s += g * g step = lr / (s ** 0.5) print(f"s={s:4.1f} step={step:.3f}") # 每一步的步长都在变小
梯度恒定时,前面几步步长还像样,越往后 s 越大、步长越小——这就是"学习率提前归零"的数字影子。RMSProp 加了衰减因子 β 后,s 不再无限累加,步长能在波动中回血,这正是两者命运的分水岭。
Adam 区别于朴素 RMSProp 的要点之一是偏差校正。原因在于训练开头那几步,一阶矩 m 和二阶矩 v 从零起步,除以"还没有累积多少样本"的系数会让估计严重偏小(早期更像"只见一两个历史")。偏差校正就是把这个"常数偏小"掰回来,让前几步的估计不至于被起点拖偏。
很多人只在文档里见过 bias correction 这个词,却说不清它是干嘛的。可以这样记:它是在给"刚开张的统计学家"发一套校准系数,让他前几步就敢信自己的平均值。 少了它,Adam 前几个迭代的步长会偏大、轨迹更抖,收敛稳定感差不少。
Adam 帮你免去大量手挑学习率的痛苦,这是真福利,但别把"省心"误读成"学习率不重要"。极端的学习率(比如 1e1 或 1e-6)对任何优化器都是灾难;Adam 只是把"合理区间"变得更宽、更宽容了,并没有把学习率变成无效。实际里你仍会用第 5 章的调度去做后期精修——自适应管"各向异性",调度管"整体随时间的收放",两者职责并不重复。把这块分清楚,你就不会在"都自适应了怎么还要调度"上绕圈了。
很多人把 Adam 当成一个"黑盒按钮",其实它内部是动量与自适应在互相成就:动量在"高频、振动"的方向上做低通滤波,自适应在"陡峭/平坦"的方向上做增益补偿。两者都想让网络更稳更快,但不是完全独立的——动量大、自适应的步子也会被透传得更猛。所以在 Adam 上,你真正常动的不是 β,而是看它"收敛得太飘"(调学习率或动量)还是"在某个轴一直磨"(大概率是自适应权重与激活饱和的问题)。
理解到这层,你就不再需要背 Adam 的参数列表,而是知道"这个量在管天平哪一端"。正是这份"找到旋钮在管哪端"的能力,让你在遇到不熟悉的优化器时也能顺着主线条分缕析,而不是只会在 Adam 和 SGD 之间来回二选一。
四个主流优化器都登场了,下一节真的把它们放到一个项目里去拍板——到底该用 SGD 还是 Adam,怎么进退。