引述
上一篇我们讲到,反向传播能算出损失函数对每个参数的梯度。但梯度本身只是方向信息 —— 它告诉我们往哪走损失会下降,却不会替我们迈出那一步。
如何把梯度转化为参数更新,让网络从随机初始一步步逼近最优解,这个任务交给了优化器。

梯度下降
为什么用梯度下降
-
在数学上,训练神经网络本质上是求一个最小化问题,等价于求解:
θ ∗ = arg min θ L ( θ ) \theta^* = \arg\min_{\theta} L(\theta) θ∗=argθminL(θ)
其中 θ \theta θ 是网络所有参数的集合, L ( θ ) L(\theta) L(θ) 是损失函数 -
听起来像高中数学题 —— 求导、令导数为零、解方程。但现代大模型动辄百亿参数,令导数为零会得到一个百亿元方程组,根本没有解析解。
-
既然一步解不出来,那就一步一步逼近 —— 这就是 梯度下降 的基本思想,也是为什么将其作为训练引擎的原因
梯度下降的概念
-
想象自己被蒙着眼丢在一座山上,你的目标是走到山谷最低处。没有地图,只能用脚感受脚下的坡度,按照下面的步骤一步步往下走:
- 判断当前位置哪个方向最陡
- 朝那个方向迈一小步
- 站稳后再重新感受,再迈一步
- 如此循环,直到四周都是平的,再也走不动了
-
把这个直觉过程翻译成数学,就是梯度下降的更新公式:
θ t + 1 = θ t − η ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t) θt+1=θt−η⋅∇L(θt)
其中 θ t \theta_t θt 是当前位置(第 t t t 步时的参数值), ∇ L ( θ t ) \nabla L(\theta_t) ∇L(θt) 是脚下感受到的坡度(损失函数对参数的梯度,后面详细说明), η \eta η 是每一步迈多大(学习率)这里的负号意味着朝坡度的反方向走 —— 因为梯度指向上升最快的方向,取负号才是下山
一维情况的梯度下降
-
现在来看梯度下降公式在一维的情况,由于参数只有一个,梯度 ∇ L ( θ t ) \nabla L(\theta_t) ∇L(θt) 退化为普通的导数 f ′ ( x t ) f'(x_t) f′(xt) ,公式简化为:
梯度下降公式 : θ t + 1 = θ t − η ⋅ ∇ L ( θ t ) 简化 : x t + 1 = x t − η ⋅ f ′ ( x t ) 梯度下降公式:\theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t)\\ 简化:x_{t+1} = x_t - \eta \cdot f'(x_t) 梯度下降公式:θt+1=θt−η⋅∇L(θt)简化:xt+1=xt−η⋅f′(xt) -
考虑最简单的抛物线 f ( x ) = x 2 f(x) = x^2 f(x)=x2,导数为 f ′ ( x ) = 2 x f'(x) = 2x f′(x)=2x。观察不同位置的导数取值:

- x = − 3 x = -3 x=−3 时 f ′ = − 6 < 0 f' = -6 < 0 f′=−6<0,梯度为负,减去一个负数等于加上一个正数,参数沿 x x x 增大方向移动,函数下降;
- x = 0 x = 0 x=0 时 f ′ = 0 f' = 0 f′=0,梯度为零,参数不再更新,此处是最低点;
- x = 2 x = 2 x=2 时 f ′ = 4 > 0 f' = 4 > 0 f′=4>0,梯度为正,参数沿 x x x 减小方向移动,函数同样下降。
- 导数的大小告诉我们坡度有多陡,符号告诉我们下山方向 —— 梯度下降公式中的负号保证了无论导数是正是负,参数总是朝着函数值减小的方向移动。
-
下面从 x 0 = 4 x_0 = 4 x0=4 出发,设置学习率 η = 0.1 \eta = 0.1 η=0.1,用梯度下降迭代:
步数 x t x_t xt f ( x t ) f(x_t) f(xt) f ′ ( x t ) f'(x_t) f′(xt) x t + 1 x_{t+1} xt+1 0 4.000 16.000 8.000 3.200 1 3.200 10.240 6.400 2.560 2 2.560 6.554 5.120 2.048 3 2.048 4.194 4.096 1.638 … … … … … 
-
这个简单例子揭示了三个重要性质:
- 自带刹车:越靠近最低点梯度越小,步长自动变小,无需手动调节
- 单调下降:每一步函数值都比上一步更小
- 永远逼近:只能无限趋近最低点而永远到不了,所以工程上需要"差不多就停"的终止条件
多维情况的梯度下降
-
将一维推广到多维,损失函数 L ( θ ) L(\theta) L(θ) 有上亿个参数,对每个参数求偏导,打包成一个向量,就是梯度:
∇ L ( θ ) = [ ∂ L ∂ θ 1 , ∂ L ∂ θ 2 , … , ∂ L ∂ θ n ] T \nabla L(\theta) = \left[ \frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, \ldots, \frac{\partial L}{\partial \theta_n} \right]^T ∇L(θ)=[∂θ1∂L,∂θ2∂L,…,∂θn∂L]T -
梯度指向 L L L 在当前点处上升最快的方向。取负号,就是下降最快的方向:
θ t + 1 = θ t − η ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t) θt+1=θt−η⋅∇L(θt) -
因此,整个训练就是反复执行下面的过程:
- 前向传播 —— 算损失值 L ( θ t ) L(\theta_t) L(θt)
- 反向传播 —— 算梯度值 ∇ L ( θ t ) \nabla L(\theta_t) ∇L(θt)
- 参数优化 —— 按公式更新参数 θ t + 1 = θ t − η ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t) θt+1=θt−η⋅∇L(θt)
- 反复迭代直到损失值不再明显下降
为什么需要各种各样的优化器
公式 θ t + 1 = θ t − η ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t) θt+1=θt−η⋅∇L(θt) 看起来简洁优雅,但在真实训练中会有下面四个问题:
- 用多少样本: 一次更新用全部训练数据、单个样本、还是一小批?这直接决定了梯度的准确度和计算开销。
- 怎么走步: 在窄长山谷里,梯度指向谷底侧壁而非谷口方向,参数会在两侧反复横跳,收敛极慢
- 学习率怎么分配: 不同参数的梯度量级差异巨大,要不要让它们各自拥有独立的学习率
- η \eta η 该不该变: 学习率应该是固定值,还是随训练进程自动衰减
围绕上面四个问题,优化器不断解决演化,从基础的 S G D SGD SGD,到带动量的 M o m e n t u m Momentum Momentum,再到自适应学习率的 A d a G r a d AdaGrad AdaGrad、 R M S p r o p RMSprop RMSprop,最后到集大成的 A d a m Adam Adam——每一种优化器的诞生,都是为了解决前一代留下的某个痛点
、
下面介绍的各个优化器,我们不再手动实现,感兴趣的同学可以参考附录中的
common/optimizer.py。在后续 M N I S T MNIST MNIST 数据集的训练实战中,我们将直接在代码中调用这些优化器。
B a t c h G D Batch GD BatchGD:每次都用全部样本
-
起源
- 1847 1847 1847 年,法国数学家柯西在研究彗星轨道时,面对无法解析求解的方程组,首次提出沿函数下降方向逐步逼近最优解的思想。
- 这一思想也成为 B a t c h G D Batch GD BatchGD 的理论基石。
-
思路 —— 每次参数更新前,用全部样本的平均梯度作为更新方向
-
公式 —— 第 t t t 次更新,使用全部 N N N 个样本的平均梯度,更新参数:
θ t + 1 = θ t − η ⋅ 1 N ∑ i = 1 N ∇ L i ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{N} \sum_{i=1}^{N} \nabla L_i(\theta_t) θt+1=θt−η⋅N1i=1∑N∇Li(θt)
第 t t t 步更新时,模型遍历完整个训练集,计算所有样本损失的平均梯度,再执行一次更新 -
优点
- 方向准确 —— 每步都沿全数据集的真实梯度方向前进,更新路径几乎无噪声。
- 理论性质好 —— 在凸优化问题中配合合适的学习率,有严格的收敛保证。
-
缺点
-
训练成本极高 —— 每走一步就要跑完全部数据,数据集一大就寸步难行。
-
缺少随机性 —— 梯度一旦进入鞍点或梯度小的区域,没有噪声扰动,模型可能卡住跳不出来

如上图的阶段 2 2 2、 3 3 3,此时模型进入的区域梯度小或者为 0 0 0,根据上面的梯度下降公式:
θ t + 1 = θ t − η ⋅ 1 N ∑ i = 1 N ∇ L i ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{N} \sum_{i=1}^{N} \nabla L_i(\theta_t) θt+1=θt−η⋅N1i=1∑N∇Li(θt)
此时的 ∇ L ( θ t ) → 0 \nabla L(\theta_t)→0 ∇L(θt)→0 ,无论 η \eta η 值为多少,整体均 → 0 →0 →0,则有:
θ t + 1 = θ t \theta_{t+1} = \theta_t θt+1=θt
参数不再更新,模型陷入无法学习的状态。此时就需要某个离群点(噪声,即梯度不为 0 0 0),把模型拉离这种状态,这就引出了下面的 S G D SGD SGD 思想
-
-
应用场景 —— 现代深度学习已不现实;主要用于小规模凸优化问题和经典统计学习模型,更多是作为所有优化方法的理论基础。
S G D SGD SGD:每次只用一个样本
-
起源
-
1951 1951 1951 年,统计学家 R o b b i n s Robbins Robbins 和 M o n r o Monro Monro 在研究小白鼠用药问题时提出随机逼近思想:每次只观察一个带噪声的反应,用它做一次小幅调整,长期来看仍能逼近真实答案。
-
这一思想后来被迁移到机器学习中,成为 S G D SGD SGD 的理论基石。
-
-
思路 —— 每次参数更新前,随机抽一个样本,用它的梯度作为整体梯度的估计
就像民意调查,不必问遍全国,随机抽一个人,他的意见虽噪声大,但问无数次后,平均下来也能逼近真实民意
-
公式 —— 第 t t t 次更新,随机抽一个样本的梯度,更新参数:
θ t + 1 = θ t − η ⋅ ∇ L i ( θ t ) , i ∼ Uniform ( 1 , N ) \theta_{t+1} = \theta_t - \eta \cdot \nabla L_i(\theta_t), \quad i \sim \text{Uniform}(1, N) θt+1=θt−η⋅∇Li(θt),i∼Uniform(1,N) -
优点
- 计算成本骤降 —— 每步计算量从 O ( N ) O(N) O(N) 降到 O ( 1 ) O(1) O(1),效率提升几个数量级
- 跳出局部最优 —— 单样本梯度的噪声反而能帮模型挣脱鞍点和浅层极小值的束缚
- 支持在线学习 —— 数据可一条条流入、边接收边更新,无需一次性加载全量数据
-
缺点
- 剧烈震荡 —— 单样本方差大,参数在最优点附近来回摆动,难以稳定收敛
- 学习率需精心衰减 —— 固定学习率可能永远震荡,衰减过快又可能过早停在次优位置
- 对离群样本敏感 —— 一个异常样本就能把参数拉偏
-
应用场景 —— 纯单样本 S G D SGD SGD 今天已很少使用,但"用随机子样本近似全样本梯度"这一核心思想,是整个现代深度学习优化方法的基石。后续所有优化器的改进,本质上都是在保留随机性优点的同时设法压制噪声。
M i n i − b a t c h S G D Mini-batch SGD Mini−batchSGD:每次用一批小样本
-
起源 —— 90 90 90 年代,研究者逐渐意识到一个样本太抖、全体样本太慢,折中方案自然浮现 —— 每次随机抽一小批样本,用它们的平均梯度做更新
-
思路 —— 在 B a t c h Batch Batch G D GD GD 的准和 S G D SGD SGD 的快之间找一个平衡点,用一个小批次的平均梯度作为整体梯度的估计
-
公式 —— 第 t t t 次更新,抽取一个小批量 B B B(通常 32 / 64 / 128 / 256 32/64/128/256 32/64/128/256 个样本)的平均梯度,更新参数:
θ t + 1 = θ t − η ⋅ 1 B ∑ i ∈ B ∇ L i ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{B} \sum_{i \in B} \nabla L_i(\theta_t) θt+1=θt−η⋅B1i∈B∑∇Li(θt) -
优点
-
方差显著降低 —— b a t c h batch batch 内梯度求平均,噪声约按 1 / ∣ B ∣ 1/\sqrt{|B|} 1/∣B∣ 比例下降,比单样本 S G D SGD SGD 稳定得多。
-
G P U GPU GPU 友好 —— b a t c h batch batch 内可并行执行前向和反向传播,充分利用向量化硬件
这是 M i n i Mini Mini- b a t c h batch batch 在深度学习真正的杀手锏
-
保留适度随机性 —— 相比 B a t c h Batch Batch G D GD GD 仍有噪声助力跳鞍点,相比单样本 S G D SGD SGD 又不至于剧烈震荡
-
-
缺点
-
B a t c h s i z e Batch size Batchsize 是关键超参 —— 太小噪声大收敛慢,太大逼近 B a t c h G D Batch GD BatchGD,梯度过于精确反而可能降低泛化能力
-
大 b a t c h batch batch 需匹配大学习率 —— 否则更新幅度过小,等价于有效训练步数不足
这也是大规模训练中常用学习率预热、线性放大的原因
-
-
应用场景 —— 如今语境下, S G D SGD SGD 默认就是指 M i n i Mini Mini- b a t c h batch batch S G D SGD SGD,几乎所有优化器都建立在它的框架上做改进
M o m e n t u m Momentum Momentum:给梯度下降加上惯性
-
起源 —— 1964 1964 1964 年,苏联数学家 B o r i s Boris Boris P o l y a k Polyak Polyak 在研究迭代法收敛速度时,提出动量法
-
思路 —— 给模型的梯度下降加上物理学中惯性的概念
-
朴素梯度下降每走一步都把球停下重新测坡度,谨慎但低效

-
真实的球有惯性,朝一个方向滚就越滚越快,遇到小坑凭惯性冲过去

-
核心思路:
- 不要只看当前这一步的梯度,把过去几步的运动趋势也考虑进来
- 方向一致的更新被持续强化,来回震荡的更新则被逐步抵消
-
-
定义 —— 维护一个速度向量 v t v_t vt(梯度的指数滑动平均),当前梯度与历史速度混合后共同决定更新:
v t + 1 = β v t + ∇ L ( θ t ) θ t + 1 = θ t − η ⋅ v t + 1 v_{t+1} = \beta v_t + \nabla L(\theta_t)\\ \theta_{t+1} = \theta_t - \eta \cdot v_{t+1} vt+1=βvt+∇L(θt)θt+1=θt−η⋅vt+1
其中 β \beta β 是动量系数,其越大,历史速度的影响越持久,惯性越强,通常取 0.9 0.9 0.9 -
模型的“之”字形移动
-
想象一个狭长的山谷 —— 左右两侧是陡峭的崖壁,前后两端才是通往谷底的方向。损失函数的曲面就像这个地形:在一个方向上坡度极陡,在另一个方向上坡度极缓

-
假设损失函数 L ( w 1 , w 2 ) = w 1 2 + 100 ⋅ w 2 2 L(w_1, w_2) = w_1^2 + 100 \cdot w_2^2 L(w1,w2)=w12+100⋅w22,最低点在原点 ( 0 , 0 ) (0, 0) (0,0)。这个函数在 w 2 w_2 w2 方向上的坡度是 w 1 w_1 w1 方向的 100 100 100 倍——横向极窄极陡,纵向极宽极缓。我们的目标是通向谷底,现在从某个初始点(比如 ( 10 , 1 ) (10, 1) (10,1))出发,进行梯度下降
-
没动量的普通 S D G SDG SDG
-
每次更新时,梯度 ∇ L = ( 2 w 1 , 200 w 2 ) \nabla L = (2w_1, 200w_2) ∇L=(2w1,200w2), w 2 w_2 w2 方向的步幅远大于 w 1 w_1 w1 方向,故:
- 在 w 2 w_2 w2(横向)方向,参数沿着陡峭的谷壁猛冲过去,冲到对面谷壁后梯度反向,又被猛拉回来
- 在 w 2 w_2 w2 (竖向)方向,参数来回弹跳,却只在 w 1 w_1 w1 方向前进一丁点
-
形成一条"之"字形路径:参数在陡峭的横向方向反复震荡,在真正通往谷底的纵向方向却像乌龟爬行,每一步的有效位移极少,收敛极慢。
-
-
有动量的 M o m e n t u m Momentum Momentum
- 解决之道:维护一个速度向量,把过去几步的梯度累加起来:
- 横向( w 2 w_2 w2 方向)的梯度每一步都变号,累加后相互抵消
- 纵向( w 1 w_1 w1 方向)的梯度始终同号,累加后越来越大
- 横向的无效震荡被抚平,纵向的前进速度被加速,参数不再"之"字形乱跳,而是沿着谷底方向直奔最优点
- 解决之道:维护一个速度向量,把过去几步的梯度累加起来:
-
-
优点
- 加速一致方向 —— 连续几步梯度方向相近时,速度累积,越走越快。
- 抑制震荡方向 —— 狭长谷地中横向摆动的梯度相互抵消,把有效更新留给真正的前进方向。
- 穿越浅鞍点与平台区 —— 即使瞬时梯度接近 0,凭已积累的速度仍能继续前进。
-
缺点
- 可能冲过头 —— 接近最优点时速度仍较大,可能越过最低点再折返,表现为最优点附近的持续震荡。
- 对 β \beta β 敏感 —— 太小动量积累不明显,太大系统反应迟钝。实践中 0.9 几乎是稳妥默认值。
-
应用场景
- 现在几乎所有
S
G
D
SGD
SGD 训练默认都带
M
o
m
e
n
t
u
m
Momentum
Momentum,
torch.optim.SGD(momentum=0.9)是工业界和学术界广泛接受的标准配置 - V G G VGG VGG、 R e s N e t ResNet ResNet 等经典 C N N CNN CNN 的大规模训练,核心方案就是 M i n i Mini Mini- b a t c h batch batch S G D SGD SGD + + + M o m e n t u m Momentum Momentum
- 现在几乎所有
S
G
D
SGD
SGD 训练默认都带
M
o
m
e
n
t
u
m
Momentum
Momentum,
A d a G r a d AdaGrad AdaGrad:每个参数有自己的学习率 η \eta η
-
起源
-
2011 2011 2011 年, D u c h i Duchi Duchi 等人发现:不同参数的梯度大小差异悬殊,用同一个学习率更新所有参数过于简单粗暴
-
在 N L P NLP NLP 神经网络的学习中
-
高频词 t h e the the 几乎每个 b a t c h batch batch 都出现,梯度很大、更新充分
-
低频词 s e r e n d i p i t y serendipity serendipity 整个训练只出现几次,梯度极小,永远学不动
-
A d a G r a d AdaGrad AdaGrad 就是要解决这种"贫富不均"
-
-
-
思路 —— 给每个参数单独维护一个历史梯度累积量,用来自适应调整有效学习率
-
更新频繁的参数自动缩小学习率,避免过度更新
-
更新稀少的参数保持较大学习率,确保充分学习
-
-
公式
- 为每个参数维护梯度平方累积和 G t G_t Gt,用来缩放学习率:
G t = G t − 1 + ∇ L ( θ t ) 2 G_t = G_{t-1} + \nabla L(\theta_t)^2 \quad Gt=Gt−1+∇L(θt)2
-
梯度下降公式更新为:
θ t + 1 = θ t − η ⋅ 1 G t + ϵ ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{\sqrt{G_t + \epsilon}} \cdot \nabla L(\theta_t) θt+1=θt−η⋅Gt+ϵ1⋅∇L(θt)
其中,每个参数的有效学习率为 η / G t + ϵ \eta / \sqrt{G_t + \epsilon} η/Gt+ϵ: G t G_t Gt 大则更新被抑制, G t G_t Gt 小则更新被放大ϵ \epsilon ϵ 是防止分母为零的微小常数
-
优点
-
告别手动调学习率 —— 每个参数的有效学习率由自身历史梯度自动决定
-
天然适合稀疏数据 —— 低频特征不会因梯度小而被忽视,在 N L P NLP NLP 和推荐系统中效果显著
“对历史更新多的参数降速、对历史更新少的参数提速”,这就是自适应学习率的核心思想, A d a G r a d AdaGrad AdaGrad 是开山之作
-
-
缺点
-
致命结构缺陷 —— 学习率 η \eta η 会单调衰减到 0 0 0
- G t G_t Gt 只累加,从不减少
- 训练越久分母越大,有效学习率趋近于 0 0 0
- 模型未充分收敛就已动弹不得,对深层网络尤其明显
正是这个缺陷,催生后来的 R M S P r o p RMSProp RMSProp 和 A d a m Adam Adam —— 它们的核心改进都指向同一件事:不要让历史梯度无限积累,只保留近期梯度的影响
-
-
应用场景 —— 主流深度学习已较少使用,但在稀疏数据场景仍有价值
R M S P r o p RMSProp RMSProp:用滑动平均修补 A d a G r a d AdaGrad AdaGrad
-
起源 —— 2012 2012 2012 年, A l e x N e t AlexNet AlexNet 引爆深度学习,网络越来越深、训练越来越久,研究者迫切需要比 A d a G r a d AdaGrad AdaGrad 更适合长期训练的自适应方法,由此引出了 R M S P r o p RMSProp RMSProp
R M S P r o p RMSProp RMSProp 并没有正式论文——它最早来自 G e o f f r e y Geoffrey Geoffrey H i n t o n Hinton Hinton 在 C o u r s e r a Coursera Coursera 课程的讲义幻灯片。 H i n t o n Hinton Hinton 觉得这个改进显然合理,没当成值得发表的工作。但后来全世界引用 R M S P r o p RMSProp RMSProp 时,最规范的写法竟然是: H i n t o n Hinton Hinton, s l i d e s slides slides o f of of l e c t u r e lecture lecture 6 e 6e 6e, C o u r s e r a Coursera Coursera, 2012 2012 2012——一个写在 P P T PPT PPT 里的算法就这样成了主流。
-
思路 —— 把 A d a G r a d AdaGrad AdaGrad 的 G t G_t Gt 的累积和替换成指数滑动平均 —— 最近几步的梯度影响大,久远的历史被逐步遗忘,不再无限积累
-
公式
- 用梯度平方的指数滑动平均 E [ g 2 ] t E[g^2]_t E[g2]t 替代 A d a G r a d AdaGrad AdaGrad 的累积和 G t G_t Gt :
E [ g 2 ] t = β E [ g 2 ] t − 1 + ( 1 − β ) ∇ L ( θ t ) 2 E[g^2]_t = \beta E[g^2]_{t-1} + (1 - \beta) \nabla L(\theta_t)^2 E[g2]t=βE[g2]t−1+(1−β)∇L(θt)2
-
梯度下降公式更新为:
θ t + 1 = θ t − η ⋅ 1 E [ g 2 ] t + ϵ ⋅ ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \frac{1}{\sqrt{E[g^2]_t + \epsilon}} \cdot \nabla L(\theta_t) θt+1=θt−η⋅E[g2]t+ϵ1⋅∇L(θt)
其中, β \beta β 通常取 0.9 0.9 0.9,和 A d a G r a d AdaGrad AdaGrad 的唯一差别:分母从"累积和"换成了"滑动平均" -
优点
- 不再衰减到 0 0 0 —— 滑动平均逐渐遗忘久远梯度,分母不再无限膨胀,适合长期训练
- 保留自适应优势 —— 每个参数仍有独立的更新尺度,梯度大的自动缩、稀疏的保持大
- 适合非平稳目标 —— 深度学习 l o s s loss loss 曲面会随训练变化, R M S P r o p RMSProp RMSProp 只关注近期梯度,更能适应动态环境
-
缺点
- 缺少动量信息 —— 只用二阶矩(梯度有多大),没用一阶矩(朝哪个方向前进)。狭长谷地等场景仍可能震荡,收敛路径不如带动量的方法平滑
- 多了一个超参数 β \beta β —— 实践中 0.9 0.9 0.9 已足够好用,本质上增加了调参空间
A d a m Adam Adam:把动量与自适应学习率合体
-
起源 —— 到 2014 2014 2014- 2015 2015 2015 年,深度学习优化已形成两条清晰的路线:
-
A d a G r a d AdaGrad AdaGrad/ R M S P r o p RMSProp RMSProp 利用二阶信息自适应调整学习率
-
M o m e n t u m Momentum Momentum 利用一阶信息积累速度
-
2014 2014 2014 年, K i n g m a Kingma Kingma 和 B a Ba Ba 提出了 A d a m Adam Adam —— 结合了两者,既要方向感,又要步长感。
-
-
思路 —— A d a m Adam Adam 同时维护两个指数滑动平均:
-
m t m_t mt 跟踪一阶矩 —— 动量,决定方向,对应 M o m e n t u m Momentum Momentum
-
v t v_t vt 跟踪二阶矩 —— 自适应步长,决定尺度,对应 R M S P r o p RMSProp RMSProp
-
两个大脑协同决策 —— 像 M o m e n t u m Momentum Momentum 一样有惯性,像 R M S P r o p RMSProp RMSProp 一样为每个参数定制步长
-
-
定义
-
A d a m Adam Adam 的跟踪一阶矩、二阶矩,其中 β 1 \beta_1 β1 默认 0.9 0.9 0.9, β 2 \beta_2 β2 默认 0.999 0.999 0.999:
m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ L ( θ t ) (一阶矩) v t = β 2 v t − 1 + ( 1 − β 2 ) ∇ L ( θ t ) 2 (二阶矩) m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla L(\theta_t) \quad \text{(一阶矩)}\\ v_t = \beta_2 v_{t-1} + (1 - \beta_2) \nabla L(\theta_t)^2 \quad \text{(二阶矩)} mt=β1mt−1+(1−β1)∇L(θt)(一阶矩)vt=β2vt−1+(1−β2)∇L(θt)2(二阶矩) -
采用偏差校正解决冷启动问题: m 0 m_0 m0 和 v 0 v_0 v0 初始化为 0,训练初期除以 1 − β t 1 - \beta^t 1−βt 拉回正常量级:
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} \quad m^t=1−β1tmt,v^t=1−β2tvt -
梯度下降公式更新为:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−η⋅v^t+ϵm^t
-
-
优点
-
像 M o m e n t u m Momentum Momentum —— 引入惯性让更新方向更平滑,不易被局部噪声带偏
-
像 R M S P r o p RMSProp RMSProp —— 自适应缩放为每个参数单独定制步长,频繁更新的收缩、稀疏的保持稳健
-
偏差校正稳住初期 —— 避免冷启动阶段步长过小,让模型从一开始就高效推进
这种"全能型”的表现,让 A d a m Adam Adam 具备极强的开箱即用性 —— 收敛飞快,对初始学习率也不挑剔,在很长一段时间里,它几乎是所有开发者首选的默认优化器。
-
-
缺点
- 可能不收敛 —— 2018 2018 2018 年 R e d d i Reddi Reddi 等人指出,即使凸函数也可能发散——学习率需适当衰减才能保证收敛
- 泛化能力有时不如 S G D SGD SGD —— 强自适应能力在训练集上收敛快,但自适应机制本身可能影响泛化
- 权重衰减与 L 2 L2 L2 正则不等价 —— L 2 L2 L2 正则和权重衰减在自适应框架里行为完全不同——这个坑最终催生了 A d a m W AdamW AdamW
-
应用场景
- 很长一段时间里, A d a m Adam Adam 几乎是所有开发者首选的默认优化器
- 即便现在 A d a m W AdamW AdamW 已接棒, A d a m Adam Adam 在快速原型、学术实验和中小规模任务中仍然广泛使用
- 其价值在于统一了动量方法和自适应方法两条路线,为后续所有改进铺平了道路
A d a m W AdamW AdamW:修掉 A d a m Adam Adam 隐藏的 b u g bug bug
-
起源
-
研究深入后人们发现 A d a m Adam Adam 有一个隐藏的 b u g bug bug:权重衰减失效了
-
在传统 S G D SGD SGD 中,权重衰减等价于 L 2 L2 L2 正则,所以早期 A d a m Adam Adam 直接把 L 2 L2 L2 加入梯度中。
-
本应该稳定的正则信号被自适应学习率一同缩放 —— 梯度大的参数衰减不足、梯度小的过度衰减,正则化效果完全偏离原意
-
2017 2017 2017 年, L o s h c h i l o v Loshchilov Loshchilov 和 H u t t e r Hutter Hutter 提出 A d a m W AdamW AdamW,把梯度更新和权重衰减彻底拆开
-
-
思路 —— 解耦二者,梯度更新走自适应通道,权重衰减走独立通道
-
定义 —— 梯度下降公式更新为:
θ t + 1 = θ t − η ⋅ m ^ t v ^ t + ϵ − η λ θ t \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \lambda \theta_t θt+1=θt−η⋅v^t+ϵm^t−ηλθt- m ^ t v ^ t + ϵ \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} v^t+ϵm^t 部分 —— 负责根据梯度调整参数,由 A d a m Adam Adam 的自适应机制决定方向和步长
- η λ θ t \eta \lambda \theta_t ηλθt 部分 —— 作用在参数上,不走梯度通道,不会被子适应机制污染。其中 λ \lambda λ 是权重衰减系数,通常取 0.01 0.01 0.01 到 0.1 0.1 0.1
-
优点
- 正则化效果复原 —— 权重衰减不再被自适应学习率扭曲,泛化能力显著提升
- 与
A
d
a
m
Adam
Adam 无缝衔接 —— 代码改动极小,
torch.optim.AdamW已成为直接替代方案 - 理论和实践高度一致 —— 解耦后权重衰减行为更符合正则化本意,调参更直观
-
缺点
- 引入额外超参数 λ \lambda λ —— 实践中 0.01 0.01 0.01 或 0.1 0.1 0.1 在大多数任务中效果稳定,调参负担不大
- A d a m Adam Adam 的其他局限依然存在 —— 极端情况下仍需学习率调度配合以保证收敛
-
应用场景 —— 在 T r a n s f o r m e r Transformer Transformer、 B E R T BERT BERT、 G P T GPT GPT、 V i T ViT ViT 以及如今的大语言模型中, A d a m W AdamW AdamW 几乎成了雷打不动的事实标准 —— 今天我绝大多数顶尖模型,底层用的都是它
M u o n Muon Muon:把视角从标量抬到权重矩阵
-
起源
-
2024 2024 2024 年, K e l l e r Keller Keller J o r d a n Jordan Jordan 等人发现: A d a m Adam Adam/ A d a m W AdamW AdamW 把每个标量参数当作独立维度处理,但神经网络真正的主角是二维权重矩阵
-
S G D SGD SGD 配合动量在大规模视觉训练中仍有竞争力,说明自适应方法并未完全超越动量方法
-
M u o n Muon Muon 的出发点就是重新审视动量方法,给它加上现代的矩阵感知能力。
-
-
思路
-
在动量更新之后、参数更新之前,对更新矩阵做一次 N e w t o n Newton Newton- S c h u l z Schulz Schulz 迭代,近似于 S V D SVD SVD 正交化
-
目的是把更新矩阵的所有奇异值拉平,让每个奇异方向获得均衡的更新幅度,避免少数大奇异值方向主导整步更新
-
-
定义
-
针对二维权重矩阵 W W W 的更新:
M t = β M t − 1 + ∇ L ( W t ) O t = NewtonSchulz ( M t ) W t + 1 = W t − η ⋅ O t M_t = \beta M_{t-1} + \nabla L(W_t)\\ O_t = \text{NewtonSchulz}(M_t)\\ W_{t+1} = W_t - \eta \cdot O_t Mt=βMt−1+∇L(Wt)Ot=NewtonSchulz(Mt)Wt+1=Wt−η⋅Ot -
N e w t o n S c h u l z NewtonSchulz NewtonSchulz 迭代将矩阵的奇异值拉平至接近 1 1 1,同时保留方向信息,使每个奇异方向都以均衡的幅度被更新,避免少数主导方向吸走大部分更新能量
-
-
优点
- 样本效率更高 —— 在 n a n o G P T nanoGPT nanoGPT s p e e d r u n speedrun speedrun 等小规模训练中,用更少步数达到更好性能
- 矩阵级别的自适应 —— 从权重矩阵的几何结构出发做正交化,而非从标量参数出发做自适应,视角根本转变带来新的优化空间
- 与现有框架兼容 —— 可作为动量方法的增强版,接入现有训练流程
-
缺点
- 计算开销增加 —— N e w t o n Newton Newton- S c h u l z Schulz Schulz 迭代需要额外矩阵运算,对超大规模训练仍有成本
- 适用场景仍在探索 —— 目前成功案例集中于大模型预训练, C N N CNN CNN、 R N N RNN RNN 等其他架构上的效果有待验证
- 生态尚未成熟 —— P y T o r c h PyTorch PyTorch 原生未内置,需要第三方实现或自定义优化器
-
应用场景 —— 2024 2024 2024 年起, M u o n Muon Muon 在 n a n o G P T nanoGPT nanoGPT s p e e d r u n speedrun speedrun、 M o o n s h o t Moonshot Moonshot K i m i Kimi Kimi K 2 K2 K2 等前沿大模型训练中接连刷新样本效率记录,正成为下一代大模型预训练的有力竞争者
参考文献:
[1] 斋藤康毅. 深度学习入门:基于Python的理论与实现[M]. 陆宇杰, 译. 北京: 人民邮电出版社, 2018.
[2] 谦行AIing. “梯度下降:神经网络是怎么找到一组好参数的.” 小红书, 2026.5.26, http://xhslink.com/o/zX2kpLKmQH

1274

被折叠的 条评论
为什么被折叠?



