Part I · 第 6 章 优化 · 6.6

Newton、Gauss-Newton 与 LM

梯度下降只用"坡度",每一步都像在雾里摸索;如果还知道曲率,就能直接猜出谷底在哪里。Newton 法用 Hessian 拟合一个抛物面,一步跳到它的最低点。而机器人里的优化问题大多是最小二乘:误差的平方和。利用它的特殊结构,Gauss-Newton 只需要一阶导数 \(J\),就能得到近似的 Newton 步;加一点阻尼,就成了 Levenberg–Marquardt,几乎所有标定、SLAM 和数值逆运动学求解器的核心。

约 30 分钟 前置:6.3 梯度下降 · 6.5 线搜索与信赖域 · 3.3 雅可比 · 1.13 最小二乘 5 个交互

    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 一步"让它走,下方的表格实时显示误差。

    FIG 1用抛物线拟合再跳到谷底
    函数:\(0.5x^2+0.1x^4\)(好脾气的凸函数);\(\log\cosh x\)(凸,但 Newton 会在远处发散);双谷 \(\tfrac14(x^2-1)^2+0.15x\)(中间 \(f''<0\));\(\tfrac14x^4\)(最小点处 \(f''=0\))。表中 \(e_k=|x_k-x^\star|\),\(x^\star\) 由同一方法从当前起点迭代到收敛得到。
    试一试
    • 在"碗 + 四次项"上,从 \(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 步反而爬坡。

    FIG 2Newton 模型与 Newton 步
    黄色空心点是 \(\x_k\)(可拖动);紫色等高线是二阶模型;紫色实心点是 Newton 点(\(H\succ0\) 时是模型最低点;\(H\) 不定时是鞍点,画为空心方块);青色小箭头是梯度下降方向(长度已归一化)。"Newton 一步"把 \(\x_k\) 移到 Newton 点,留下轨迹。
    • 在"二次函数"上把条件数拉到 50 以上,按"Newton 一步":不管多扁,一步就落在最小点。
    • 在"双谷"里找到一个起点,使 Newton 步让 \(f\) 升高(读数里会标红)。

    5最小二乘:Gauss-Newton 省掉了什么

    最小二乘 \(f=\tfrac12\|\mathbf r(\x)\|^2\) 的梯度和 Hessian 有特殊结构(推导见"再看数学"):

    $$ \nabla f=J^\top\mathbf r,\qquad \nabla^2f=\hl{gn2}{\cw{J^\top J}}+\textstyle\sum_i r_i\,\nabla^2r_i $$

    第一项 \(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 丢掉的第二项越重要,它的优势越小。每条曲线都是真实运行的结果。

    FIG 3曲线拟合:四个求解器
    左:数据(带描边的中性色圆点)、真实曲线(虚线)和各求解器当前迭代的拟合曲线。右:参数 \((a,b)\) 平面的代价地形与四条迭代路径。下:到最优解的距离 \(\|\x_k-\x^\star\|\)(对数)。读数里"第二项占比"是在最优解处 \(\|\sum r_i\nabla^2r_i\|_F/\|J^\top J\|_F\),即 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\)。

    FIG 4阻尼曲线 \(\mathbf p(\lambda)\)
    f(x+p) 随 λ 的变化
    紫色曲线是 \(\mathbf p(\lambda)\)(\(\lambda\) 从 \(10^{-3}\) 到 \(10^{5}\)),黄点是当前 \(\lambda\) 对应的一步;空心方块是 Gauss-Newton 点(\(\lambda=0\));青色短线是负梯度方向。右下图:\(f(\x+\mathbf p(\lambda))\) 的变化,星号是使 \(f\) 最低的 \(\lambda\),虚线是当前的 \(f(\x)\):在虚线以上说明这一步让 \(f\) 变差。
    • 把 \(\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\),右边的最小点由梯度为零给出:

    $$ H_k\,\mathbf p_k=-\mathbf g_k\qquad\Longrightarrow\qquad \hl{newton}{\x_{k+1}=\x_k-H_k^{-1}\mathbf g_k} $$

    性质。(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)\),即

    $$ \nabla^2f=J^\top J+\sum_{i=1}^mr_i\,\nabla^2r_i $$

    丢掉第二项,Newton 方程 \(H\mathbf p=-\mathbf g\) 变成正规方程:

    $$ \hl{gn2}{\cw{(J^\top J)\,\mathbf p=-J^\top\mathbf r}}\qquad\Longleftrightarrow\qquad \mathbf p=\arg\min_{\mathbf p}\ \tfrac12\big\|\mathbf r+J\mathbf p\big\|^2 $$

    右边的等价说明: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

    $$ \hl{lm2}{\ck{(J^\top J+\lambda I)\,\mathbf p=-J^\top\mathbf r}}\ ,\qquad \rho=\frac{f(\x)-f(\x+\mathbf p)}{\tfrac12\mathbf p^\top(\lambda\mathbf p-\mathbf g)}\qquad\Longrightarrow\qquad \begin{cases}\rho>0:\ \text{accept},\ \lambda\leftarrow\lambda\cdot\max\!\big(\tfrac13,\,1-(2\rho-1)^3\big)\\ \rho\le0:\ \text{reject},\ \lambda\leftarrow2\lambda\ (\text{and double the factor on repeated failure})\end{cases} $$

    分母是模型预测的下降量(由 \((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 + 回溯也安全,但更慢。拖动目标和关节空间里的起点自己试试。

    FIG 5奇异位形附近的 IK:GN 对 LM
    左上:工作空间(拖动目标);手臂画的是 LM 当前的姿态,细线是 GN 的末端轨迹。右上:关节空间中三个求解器的路径(拖动圆圈改变起点)。左下:末端误差 \(\|\mathbf r\|\)(对数)。右下:每次迭代的关节位移 \(\|\mathbf p\|\)(rad,对数),GN 的首步高达十几弧度。LM 的 \(\lambda_0=0.3\),按 \(\rho\) 自适应;GN 无任何保护。
    • 读出 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常见误区

    误区 1:Newton 法"更高级",所以总比梯度下降好

    Newton 法每步要算和分解 Hessian,对 \(n\) 为百万级的神经网络完全不可行;在非凸区域它会走向鞍点或山顶(FIG 1、FIG 2);离解远时还可能发散。局部快,全局不一定稳:因此一定要配线搜索或信赖域。

    误区 2:Gauss-Newton 总是收敛到最小点

    它丢掉了 \(\sum r_i\nabla^2r_i\)。残差大(模型错了,数据里有离群点)时,GN 慢得多,甚至绕圈。若还没有线搜索,纯 GN 的步长可能大到把你甩出线性化有效的区域。实用的 GN 总是带线搜索或阻尼,即 LM。离群点的处理是另一个故事:用鲁棒核函数 (Huber、Cauchy),在 6.9 节展开。

    误区 3:直接解正规方程 \((J^\top J)\mathbf p=-J^\top\mathbf r\)

    \(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\) 也同时起到"保证可逆"的作用。

    误区 4:\(\lambda\) 设成一个固定常数

    FIG 4 已经表明,最佳 \(\lambda\) 随位置变化几个数量级。固定 \(\lambda\) 的"阻尼最小二乘"只适合对精度要求不高的实时场景(例如速度级 IK 里的 \(\lambda\approx0.01\)–\(0.1\))。需要收敛到高精度的离线问题,要用 \(\rho\) 自适应 \(\lambda\)。

    10小练习

    1. 对二次函数 \(f(\x)=\tfrac12\x^\top A\x-\mathbf b^\top\x\)(\(A\succ0\)),从任意点出发,纯 Newton 法需要几步到达最小点?
    二阶泰勒展开对二次函数是精确的:\(\mathbf g=A\x-\mathbf b\),\(H=A\),\(\x-A^{-1}(A\x-\mathbf b)=A^{-1}\mathbf b\),正是最小点,与起点和 \(\kappa\) 都无关(FIG 2 的"二次函数")。\(n\) 步的说法属于共轭梯度法。
    2. 要用 Gauss-Newton 求 \(x^2=2\) 的根,即最小化 \(f=\tfrac12r^2\),\(r(x)=x^2-2\)。从 \(x_0=2\) 出发,\(x_1\) 是多少?
    \(r(2)=2\),\(J=r'=2x=4\)。GN:\(J^2p=-Jr\Rightarrow p=-r/J=-2/4=-0.5\),\(x_1=1.5\)(这正是求平方根的古老的 Babylonian 方法)。对比完整的 Newton:\(f''=J^2+r\,r''=16+2\cdot2=20\),\(f'=Jr=8\),\(p=-8/20=-0.4\),\(x_1=1.6\)。差别来自被 GN 丢掉的第二项 \(r\,r''=4\)。
    3. LM 中 \(\lambda\) 取得非常大(例如 \(10^6\))时,步 \(\mathbf p\) 近似是什么?
    \(\lambda\) 远大于 \(J^\top J\) 的特征值时,\((J^\top J+\lambda I)^{-1}\approx I/\lambda\),所以 \(\mathbf p\approx-\mathbf g/\lambda\):方向是负梯度,长度被 \(\lambda\) 压得很短(不是严格的零,所以不是选项 C)。\(\lambda\to0\) 才是 Gauss-Newton。这就是 LM"在 GN 与 GD 之间插值"的含义(FIG 4)。
    4. 一个机械臂的 IK 求解器在手臂几乎伸直时突然让关节转了好几圈。最可能的原因和对策是?
    伸直时 \(\sin q_2\approx0\),\(J\) 的一个奇异值接近 0,\(J^{-1}\) 对应方向被放大约 \(1/\sigma_{\min}\) 倍。阻尼把 \(1/\sigma\) 换成 \(\sigma/(\sigma^2+\lambda)\),在 \(\sigma\) 很小时不再爆炸(FIG 5)。此例中目标在工作空间内,所以 C 错;也不是学习率的问题(GN 没有学习率)。

    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 的经典短文