动量梯度下降法模拟器 返回
机器学习

动量梯度下降法模拟器

支持机器学习学习的优化算法体验工具。调整学习率和动量系数,可以实时看到普通梯度下降法、动量法、Nesterov加速梯度如何在细长谷地中下降,轨迹显示在等高线上,损失收敛曲线同时绘制。

参数设置
学习率 η
每一步沿梯度方向走多远
动量系数 γ
保留多少过去的速度。0时相当于普通梯度下降
迭代次数
优化方法
梯度使用方式的三种不同更新规则
损失曲面
切换谷地的细长程度(条件数)
计算结果
最终损失 f
最终 x
最终 y
迭代次数
收敛/发散
损失降低率 (%)
损失曲面等高线与优化轨迹

同心椭圆是损失 f 的等高线,中央点是最小值。从起点 (−9, 4) 伸出的彩色路径是更新轨迹,标记在其上循环进行。

损失收敛曲线
方法对比 — 最终损失
理论与关键公式

$$\text{梯度下降: }\theta\leftarrow\theta-\eta\nabla f(\theta)$$

普通梯度下降法。在当前位置 θ 计算梯度 ∇f,沿其反向走学习率 η 的距离。

$$\text{动量法: }v\leftarrow\gamma v-\eta\nabla f(\theta),\quad \theta\leftarrow\theta+v$$

动量法。速度 v 以 γ 的比例保留过去更新,梯度加速。γ:动量系数,η:学习率。

$$f(x,y)=\tfrac12\left(a\,x^{2}+b\,y^{2}\right),\quad \nabla f=(a\,x,\;b\,y)$$

本工具的目标函数。Nesterov加速梯度的唯一区别是在先读点 θ+γv 而非当前位置计算梯度。条件数为 b/a。

动量梯度下降法概述

🙋
在机器学习中经常听到\"梯度下降法\",但它到底在做什么?
🎓
简单来说就是\"下坡\"。如果把模型的好坏指标(损失函数)f 想象成地形,最优参数就是最低的谷底。测量当前位置的坡度(梯度 ∇f),沿相反方向走学习率 η 那么远的距离。重复这个过程就会逐渐下降到谷底。公式是 θ ← θ − η∇f。试试把方法改为\"普通梯度下降\"看看。
🙋
哦,轨迹成了之字形。为什么不直接走到谷底?
🎓
这正是关键点。这个\"细长谷地\"在纵向(y)陡峭,在横向(x)平缓。普通梯度下降在陡峭的 y 方向走过头,反弹到另一侧,再返回…不断振荡。而平缓的 x 方向进展缓慢。所以谷壁不断往返,沿着谷底慢慢下降。这就是\"条件数差\"的地形对梯度下降的弱点。
🙋
明白了…那\"动量法\"改变了什么?
🎓
把坡面想象成\"滚球\"。动量法记住速度 v,用 v ← γv − η∇f、θ ← θ + v 更新。x 方向梯度方向始终一致,速度不断积累加速。y 方向左右摇摆,往返的速度相互抵消,振荡衰减。试试把方法改为动量法。之字形会瞬间消失,损失曲线也会飞速下降。
🙋
确实光滑多了!还有Nesterov加速梯度,这是另一种东西吗?
🎓
思路相同,只是测量梯度的\"地点\"不同。普通动量在当前位置测梯度,Nesterov在\"以速度走出那么远的预测点\" θ+γv 处测梯度。提前看的好处是接近谷底时能更早制动,减少超调。同样的 η 和 γ,Nesterov的损失曲线通常振荡更小,收敛更快。实务中常见的做法是固定 γ=0.9,然后在不发散的范围内最大化 η。

常见问题

动量法是在梯度下降法的基础上加入"速度"记忆的改进版本。更新公式为 v ← γv − η∇f,θ ← θ + v,它以系数 γ(0~0.99)的比例继承过去的更新方向 v。就像滚动的球一样,当梯度方向持续一致时,速度会积累并加速;而在左右振荡的方向上,往返会相互抵消而衰减。这样即使在细长谷地这样的困难地形上,也能比普通梯度下降法更快、更光滑地到达最小值。
学习率 η 决定了每一步沿梯度方向走多远。太小会导致收敛缓慢,太大会跳过最小值导致发散。在本工具的细长谷地(条件数20)中,随着 η 增加,首先在陡峭方向出现振荡,继续增加则会发散。动量系数 γ 控制保留多少过去的速度,通常取 0.9 左右。γ 越大加速越快,但过大会增加超调(overshoot)。实际应用中的基本做法是固定 γ=0.9,然后在不发散的范围内最大化 η。
普通动量法在当前位置 θ 计算梯度,而Nesterov加速梯度(NAG)在"预先走出速度那么远的点" θ + γv 处计算梯度。通过提前看,当接近最小值时能更早地制动,减少超调。在本工具中,用相同的 η 和 γ,Nesterov的损失曲线振荡更小,收敛更快。许多深度学习框架都提供NAG作为选项。
这是因为损失曲面的"条件数"不同。等方放物面(a=b=5)的条件数为1,各个方向曲率相同,梯度始终指向最小值,普通梯度下降法也能稳定收敛。而细长谷地(a=1, b=20)的条件数为20,某个方向陡峭,另一个方向平缓。普通梯度下降在陡峭方向振荡,在平缓方向进展缓慢。动量法通过抵消振荡并加速平缓方向的前进,条件数越大效果越明显。

实际应用

神经网络的训练:深度学习的权重参数往往有数百万到数十亿个,损失地形比本工具的谷地复杂得多,细长弯曲。\"带动量的随机梯度下降\"(SGD with momentum)是许多经典模型(如ResNet)训练的基础。没有动量的话,振荡会导致学习缓慢,小批次梯度的噪声也更容易打乱训练。

Adam等现代优化算法的基础:目前广泛使用的Adam、RMSProp、AdamW等优化方法内部都包含动量(一阶矩的指数移动平均)。本工具体验的\"积累速度、加速、衰减振荡\"的思想,正是这些最新算法的核心。掌握动量的直觉,当训练不稳定时调整超参数会变得容易得多。

CAE和数值优化的设计探索:结构优化、拓扑优化、形状优化中,也会用梯度法最小化目标函数(重量、应力、顺应性等)。当设计变量尺度差异大时,损失地形会变成细长谷地,普通梯度下降收敛极慢。用动量或变量正规化(缩放)来改善条件数,这个思想在工程设计优化中也很通用。

反演和参数同定:根据实验数据推断材料模型或边界条件参数的反问题中,也要用梯度下降最小化误差损失。观测噪声或灵敏度偏差会使损失地形病态,动量和学习率调度对收敛稳定性至关重要。本工具的\"发散\"现象,就是实际反演中因学习率过大导致的典型失败情景。

常见误解和注意事项

首先常见的误解是\"学习率越大收敛越快\"。确实太小的 η 会拖慢收敛,但 η 太大会跳过最小值,损失反而增大,最后发散。在本工具的细长谷地,把 η 调到最大0.5时,损失会在几步内爆炸,判定为\"发散\"。加上动量后实际步幅会更大,所以 γ 大时反而要降低 η。\"发散就先降 η\"是铁律。

其次是\"动量万能,振荡必然消失\"的错觉。动量确实\"衰减\"振荡,但 γ 过大会导致另一种问题:动量本身的超调(overshoot)。最小值被冲过头,弹到对面,再反弹回来,这是另一种振荡。γ=0.99 这样的极端值有时反而拖累收敛。Nesterov加速梯度用先读来制动,就是为了抑制这种超调。

最后\"收敛后损失应该是零\"的想法也不对。本工具的目标函数在原点最小值是0,但有限迭代不会达到精确0。收敛判定用的是\"最终损失低于初始值1%\"这样的相对标准。实际机器学习中,损失最小值往往不是0(数据噪声、表现力限制),判断收敛要看损失下降速度是否停滞,而不是绝对值。

使用指南

  1. 设置学习率(η)在0.01~0.1范围,动量系数(γ)在0.0~0.99之间调整
  2. 选择迭代步数在100~10000间,点击\"模拟\"按钮同时执行梯度下降法、动量法、Nesterov加速梯度的三种方法
  3. 实时绘制损失函数轨迹,显示最终损失f、最终坐标(x,y)、收敛判定、损失降低率(%)等信息

具体计算例

Rosenbrock函数f(x,y)=(1-x)²+100(y-x²)²中,设η=0.001、γ=0.9、步数5000次运行时,标准梯度下降法的最终损失f=0.85,而动量法达到f=0.12,Nesterov法达到f=0.08。相同条件下η=0.0001时收敛缓慢,最终损失f=2.3左右。学习率过大(η=0.1)会导致振荡激化,f值发散。

实务注意事项

  1. 深度学习中从输入层到隐藏层权重更新时,γ=0.9~0.95的高动量系数有助于逃离局部最优,但在批正规化层之后可能导致不稳定
  2. 自然语言处理的语言模型微调中,将η=0.00001的极小学习率与γ=0.99组合,可防止损失振荡,5000步达到95%以上的损失降低率
  3. 图像分类任务(ResNet训练)使用Nesterov法时,γ=0.9设置下推荐η在0.01~0.001范围,γ>0.95会导致过度加速,最终损失反而增加