Newton、Gauss-Newton 与 LM
梯度下降只用"坡度",每一步都像在雾里摸索;如果还知道曲率,就能直接猜出谷底在哪里。Newton 法用 Hessian 拟合一个抛物面,一步跳到它的最低点。而机器人里的优化问题大多是最小二乘:误差的平方和。利用它的特殊结构,Gauss-Newton 只需要一阶导数 \(J\),就能得到近似的 Newton 步;加一点阻尼,就成了 Levenberg–Marquardt,几乎所有标定、SLAM 和数值逆运动学求解器的核心。
1为什么机器人需要它
让你的手臂末端到达一个位置需要解逆运动学;让相机和激光雷达对齐需要外参标定;让几万个路标和几千个位姿一致需要光束法平差 (bundle adjustment) 与位姿图优化。这些问题的代价函数都长一个样:很多项"预测减测量"的平方和,即非线性最小二乘。
用 6.3 节的梯度下降解它们,往往要几千步,而且步长要小心地调。用本节的 Gauss-Newton / LM,常常 5 到 20 步就到了小数点后十位。这就是为什么 Ceres、g2o、GTSAM 这些机器人领域的标准优化库,默认的求解器都是 LM:用一阶导数的代价,换来近似二阶的收敛速度。
2直觉:三种"看得更远"的办法
Newton:拟合抛物面。在当前点 \(\x_k\),用函数值、梯度和 Hessian 拟合一个二次函数(泰勒展开到二阶),然后直接跳到这个二次函数的最低点。如果函数本来就是二次的,一步到位。
Gauss-Newton:拉直残差。最小二乘的代价是 \(\tfrac12\|\mathbf r(\x)\|^2\),里面的 \(\mathbf r\) 是弯的。不去拟合整个代价,而是把残差在 \(\x_k\) 处线性化 \(\mathbf r(\x_k+\mathbf p)\approx\mathbf r+J\mathbf p\),这时代价变成一个关于 \(\mathbf p\) 的普通线性最小二乘(1.13 节),一步解出。它省掉了二阶导数。
Levenberg–Marquardt:给 Gauss-Newton 拴一根绳。线性化只在附近可信(6.5 节),所以对步长加一个惩罚 \(\lambda\|\mathbf p\|^2\):\(\lambda\) 小,就是 Gauss-Newton;\(\lambda\) 大,就退化成一小步梯度下降。算法根据"实际下降/预测下降"自动调节 \(\lambda\),就是 6.5 节信赖域的另一种写法。
3动手玩:一维的 Newton 法
拖动黄点(当前位置 \(x_k\))。紫色抛物线是 \(f\) 在 \(x_k\) 处的二阶泰勒模型 \(m(x)=f+f'(x-x_k)+\tfrac12f''(x-x_k)^2\),青色竖线落在它的顶点上:这就是 Newton 步 \(x_{k+1}=x_k-f'/f''\)。小箭头是同一点上学习率 0.3 的梯度下降一步,用来对比。按"Newton 一步"让它走,下方的表格实时显示误差。
- 在"碗 + 四次项"上,从 \(x_0=2\) 出发连按"Newton 一步":误差的位数每步大约翻一倍(二次收敛),不到 7 步就到机器精度。
- 在 \(\log\cosh x\) 上把起点放到 \(|x|>1.2\),按 Newton 一步:它跳得比原来更远,反复迭代就发散。(这个函数是凸的!)
- 在双谷函数上把 \(x_k\) 放到 \(f''<0\) 的区域(红色背景),按 Newton 一步:它走向抛物线的最高点,\(f\) 反而升高。
- 在 \(\tfrac14x^4\) 上从 \(x_0=2\) 开始迭代:误差每步只乘以 \(2/3\),只有线性收敛,因为最小点处曲率为零。
Newton 法的步长自动正好:曲率大的地方(碗窄)步子短,曲率小的地方(碗宽)步子长,不需要调学习率。代价是它完全相信二阶模型:模型准确时快得惊人,不准时(离得远,或 \(f''\le0\))会走得比梯度下降还糟。所以 6.5 节的线搜索或信赖域对 Newton 法是标配。
4二维:Hessian 椭圆与 Newton 步
在二维里,二阶模型 \(m(\mathbf p)=f+\mathbf g^\top\mathbf p+\tfrac12\mathbf p^\top H\mathbf p\) 的等高线是以 Newton 点 \(\x_k-H^{-1}\mathbf g\) 为中心的椭圆(\(H\) 正定时)。Newton 步指向椭圆中心;梯度下降的方向 \(-\mathbf g\) 垂直于等高线,对扁椭圆严重偏离中心(6.3 节的"之"字)。\(H^{-1}\) 恰好把椭圆"压圆",这就是 Newton 法对条件数不敏感的原因。
拖动起点,看紫色模型等高线与真实等高线(青色);"二次函数"上两者完全重合;"Rosenbrock"里重合只在一小块区域;"双谷"里 \(H\) 会变成不定,模型的"中心"是鞍点,Newton 步反而爬坡。
- 在"二次函数"上把条件数拉到 50 以上,按"Newton 一步":不管多扁,一步就落在最小点。
- 在"双谷"里找到一个起点,使 Newton 步让 \(f\) 升高(读数里会标红)。
5最小二乘:Gauss-Newton 省掉了什么
最小二乘 \(f=\tfrac12\|\mathbf r(\x)\|^2\) 的梯度和 Hessian 有特殊结构(推导见"再看数学"):
第一项 \(J^\top J\) 只需要一阶导数,而且永远半正定;第二项需要每个残差的二阶导数,笨重,且可能不定。Gauss-Newton 就是扔掉第二项。什么时候这样做是合理的?当残差 \(r_i\) 本身很小(模型拟合得好,解附近 \(\mathbf r\approx0\)),或者残差关于参数几乎是线性的(\(\nabla^2r_i\approx0\))。机器人里的好数据通常满足前者。
下面拟合一条指数曲线 \(y=a\,e^{bt}\)(8 个测量点,真值 \(a=2,\ b=-1.2\),加噪声 \(\sigma\))。四个求解器从同一点出发:GD + 回溯、Newton + 回溯(Hessian 不正定时加 \(\mu I\) 使之正定)、Gauss-Newton + 回溯、LM。拖动 \(\sigma\) 改变残差大小:残差越大,Gauss-Newton 丢掉的第二项越重要,它的优势越小。每条曲线都是真实运行的结果。
- 令 \(\sigma=0\)(零残差问题):Gauss-Newton 与 Newton 一样快(都是 6 步左右),GD 要上百步。
- 把 \(\sigma\) 拉到 0.25 左右:Gauss-Newton(和 LM)变慢,Newton 仍然只要 5、6 步。第二项开始起作用了。
6LM 的阻尼旋钮 \(\lambda\)
Levenberg–Marquardt 的一步是解 \((J^\top J+\lambda I)\mathbf p=-J^\top\mathbf r\)。\(\lambda\to0\) 时就是 Gauss-Newton;\(\lambda\to\infty\) 时 \(\mathbf p\approx-J^\top\mathbf r/\lambda\),是沿负梯度的一小步。扫过所有 \(\lambda\),\(\mathbf p(\lambda)\) 画出一条从 Gauss-Newton 点到"原地不动"的曲线,路上每一点都是某个信赖域半径下的最优步(6.5 节)。下面在 Rosenbrock(作为最小二乘,\(\mathbf r=[1-x,\ 10(y-x^2)]\))上拖动起点和 \(\lambda\)。
- 把 \(\lambda\) 拉到最小:黄点与空心方块(Gauss-Newton 点)重合。在 Rosenbrock 起点附近,这一步是好是坏?
- 把 \(\lambda\) 拉到最大:步子变得极短,方向与青色短线(负梯度)一致。
- 把 \(\lambda\) 调到星号附近,让 \(f(\x+\mathbf p)\) 接近这条曲线上的最小值。再拖动起点:最佳 \(\lambda\) 是不是总在变?(所以 LM 要自适应地调它。)
7再看数学
提示:悬停在带底色的符号上,FIG 3 里对应的求解器路径会被加粗。
Newton 法
把 \(f\) 在 \(\x_k\) 处展开到二阶,\(f(\x_k+\mathbf p)\approx f_k+\mathbf g_k^\top\mathbf p+\tfrac12\mathbf p^\top H_k\mathbf p\)。若 \(H_k\succ0\),右边的最小点由梯度为零给出:
性质。(1) 在二次函数上一步到位。(2) 二次收敛:若 \(H(\x^\star)\succ0\),\(\nabla^2f\) 是 Lipschitz 的,且 \(\x_0\) 足够近,则 \(\|\x_{k+1}-\x^\star\|\le C\|\x_k-\x^\star\|^2\),正确的位数每步大约翻倍(FIG 1)。(3) 仿射不变:把变量做可逆线性变换,Newton 迭代不变,所以条件数无关。(4) 代价:每步要算(\(n\times n\) 的)Hessian 并解线性方程组,\(O(n^3)\);\(H\) 不正定时方向不一定是下降方向;离解远时可能发散。常见补救:线搜索或信赖域(6.5 节)、给 \(H\) 加 \(\mu I\) 使其正定、拟牛顿法(BFGS)用梯度差近似 \(H\)。
最小二乘与 Gauss-Newton
设残差 \(\mathbf r:\R^n\to\R^m\),雅可比 \(J=\partial\mathbf r/\partial\x\in\R^{m\times n}\)(3.3 节),\(f=\tfrac12\mathbf r^\top\mathbf r=\tfrac12\sum_ir_i^2\)。逐项求导:\(\partial_jf=\sum_ir_i\,\partial_jr_i\),即 \(\nabla f=J^\top\mathbf r\);再求一次:\(\partial_{jk}f=\sum_i\big(\partial_jr_i\,\partial_kr_i+r_i\,\partial_{jk}r_i\big)\),即
丢掉第二项,Newton 方程 \(H\mathbf p=-\mathbf g\) 变成正规方程:
右边的等价说明:Gauss-Newton 一步就是对线性化的残差做线性最小二乘(1.13 节),数值上可以用 QR 或 SVD 解,避免把条件数平方。它的性质:(1) 只要 \(J\) 列满秩,\(J^\top J\succ0\),\(\mathbf p\) 一定是下降方向(\(\mathbf g^\top\mathbf p=-\|J\mathbf p\|^2<0\))。(2) 零残差问题(\(\mathbf r(\x^\star)=0\))上,被丢掉的项在解处恰为零,GN 与 Newton 同样二次收敛;残差小时接近二次,残差大或曲率大时,只有线性收敛,甚至不收敛(FIG 3 滑块)。(3) \(J\) 接近秩亏(例如机械臂的奇异位形,FIG 5)时,\(J^\top J\) 近乎奇异,\(\mathbf p\) 巨大而不可靠。
Levenberg–Marquardt
分母是模型预测的下降量(由 \((J^\top J+\lambda I)\mathbf p=-\mathbf g\) 可得 \(m(0)-m(\mathbf p)=\tfrac12\mathbf p^\top(\lambda\mathbf p-\mathbf g)\)),所以 \(\rho\) 正是 6.5 节的"实际/预测"。上面的更新规则来自 Madsen–Nielsen:\(\rho\) 接近 1 时 \(\lambda\) 缩小到原来的 \(1/3\),\(\rho=\tfrac12\) 时不变,\(\rho\) 接近 0(勉强接受)时几乎翻倍;失败时乘以 \(\nu\)(初值 2),连续失败时 \(\nu\) 也翻倍。这个 \(\lambda\) 与信赖域半径一一对应:\(\lambda\) 越大,\(\|\mathbf p\|\) 越小。Marquardt 的原版把 \(\lambda I\) 换成 \(\lambda\,\mathrm{diag}(J^\top J)\),使阻尼随各参数的尺度缩放,参数单位悬殊时更稳健(6.3 节误区 2)。
三者关系。Newton:\(H=J^\top J+\sum r_i\nabla^2r_i\),无阻尼;GN:丢掉第二项;LM:GN + \(\lambda I\)。再往后,6.9 节会把同样的 LM 用在由几千个残差块组成的因子图上,只是 \(J\) 变成稀疏矩阵。
8机器人中的它:奇异位形附近的逆运动学
两连杆臂(连杆长 1.0、0.8)的 IK 就是最小二乘:残差 \(\mathbf r(\mathbf q)=\mathrm{FK}(\mathbf q)-\mathbf t\),雅可比 \(J\) 就是机器人雅可比(3.3 节)。Gauss-Newton 的一步 \(\mathbf p=-J^{-1}\mathbf r\)(这里 \(J\) 是方阵)正是经典的"雅可比逆"IK。但当手臂几乎伸直(\(q_2\approx0\))时,\(J\) 近乎奇异:手端没法沿手臂方向瞬时移动,要求它移动,\(J^{-1}\) 就给出巨大的关节转角。
下面让手臂从几乎伸直的姿态出发去够一个更近的目标。GN(无阻尼)的第一步就是十几弧度的疯狂转动,之后还要扑腾很多步;LM 因为 \(\lambda\) 限制了步长,平稳地收敛;GD + 回溯也安全,但更慢。拖动目标和关节空间里的起点自己试试。
- 读出 GN 的第一步有多大(右下图和读数),比较 LM 的第一步。
- 把关节空间里的起点拖到 \(q_2\approx1.5\)(弯曲的、远离奇异的姿态):GN 的表现是否好多了?
这就是为什么工业级 IK(TRAC-IK、KDL 的 ChainIkSolverVel_wdls、MoveIt 的数值求解器)几乎总用阻尼最小二乘:\(\mathbf p=-(J^\top J+\lambda I)^{-1}J^\top\mathbf r\) 或等价的 \(J^\top(JJ^\top+\lambda I)^{-1}\mathbf r\)。在奇异点附近,它牺牲一点精度,换来有界的关节速度,不会"炸"。同样的 LM 也是视觉 SLAM 里 PnP 位姿优化、光束法平差的默认引擎;相机标定(OpenCV 的 calibrateCamera)内部跑的就是 LM。
9常见误区
Newton 法每步要算和分解 Hessian,对 \(n\) 为百万级的神经网络完全不可行;在非凸区域它会走向鞍点或山顶(FIG 1、FIG 2);离解远时还可能发散。局部快,全局不一定稳:因此一定要配线搜索或信赖域。
它丢掉了 \(\sum r_i\nabla^2r_i\)。残差大(模型错了,数据里有离群点)时,GN 慢得多,甚至绕圈。若还没有线搜索,纯 GN 的步长可能大到把你甩出线性化有效的区域。实用的 GN 总是带线搜索或阻尼,即 LM。离群点的处理是另一个故事:用鲁棒核函数 (Huber、Cauchy),在 6.9 节展开。
\(J^\top J\) 的条件数是 \(J\) 的平方(1.12 节:奇异值平方)。\(J\) 的条件数 \(10^4\) 时 \(J^\top J\) 就到了 \(10^8\),双精度也勉强。更稳的做法是对 \(J\) 做 QR 分解,或对增广矩阵 \(\begin{bmatrix}J\\\sqrt\lambda I\end{bmatrix}\) 做最小二乘。LM 的 \(\lambda\) 也同时起到"保证可逆"的作用。
FIG 4 已经表明,最佳 \(\lambda\) 随位置变化几个数量级。固定 \(\lambda\) 的"阻尼最小二乘"只适合对精度要求不高的实时场景(例如速度级 IK 里的 \(\lambda\approx0.01\)–\(0.1\))。需要收敛到高精度的离线问题,要用 \(\rho\) 自适应 \(\lambda\)。
10小练习
11延伸阅读
- J. Nocedal & S. Wright, Numerical Optimization, 2nd ed., Ch. 3.3 (Newton), Ch. 10 (least squares: Gauss-Newton, Levenberg–Marquardt) — 本节内容的标准参考,收敛性证明完整
- K. Madsen, H. B. Nielsen & O. Tingleff, Methods for Non-Linear Least Squares Problems, DTU lecture notes, 2004 — LM 阻尼更新规则(本节用的 \(1-(2\rho-1)^3\))的出处,写得极清楚
- S. Boyd & L. Vandenberghe, Convex Optimization, Ch. 9.5 — Newton 法、仿射不变性与二次收敛的分析
- T. D. Barfoot, State Estimation for Robotics, Ch. 4 & 6 — Gauss-Newton 在机器人状态估计和位姿估计中的应用
- S. R. Buss, Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares methods, 2004 — 阻尼最小二乘 IK 的经典短文