3. 经典优化算法对比
非线性最小二乘拟合的本质,是寻找参数向量 θ 使残差平方和 S(θ)=½‖r(θ)‖² 最小,其中 r(θ) 是模型预测与观测数据之差构成的残差向量。四类经典算法都在做同一件事:在当前点构造一个“下一步往哪走”的局部近似,再据此更新参数。它们的差别,恰恰在于用几阶信息构造近似以及对近似可信度的处理方式。理解这一点,比记住公式更重要。
一、四种算法的推导主线
梯度下降只利用一阶信息。对 S(θ) 在当前点做一阶泰勒展开,沿负梯度方向 −∇S 下降最快,于是更新为 θₖ₊₁ = θₖ − α∇S(θₖ),其中 ∇S = Jᵀr,J 为残差对参数的雅可比矩阵。步长 α 需人工或线搜索确定。它的优点是每步只需一阶导、计算量小、对初值不敏感;缺点是接近极小点时梯度趋于零,收敛退化为线性甚至很慢,且各参数量纲差异大时方向会被“拉偏”。
牛顿法利用二阶信息。对 S(θ) 做二阶泰勒展开并令导数为零,得到 θₖ₊₁ = θₖ − H⁻¹∇S,H 为海森矩阵。在极小点附近它具有二次收敛,步数极少。但 H 需计算二阶导,代价高;更关键的是 H 可能非正定,此时牛顿方向甚至不是下降方向,必须加修正(如加对角加载或改用信赖域)。
高斯-牛顿法是针对最小二乘结构的专门化。注意到 H = JᵀJ + Σrᵢ∇²rᵢ,当残差较小或模型接近线性时,第二项可忽略,取 H ≈ JᵀJ,于是 θₖ₊₁ = θₖ − (JᵀJ)⁻¹Jᵀr。它无需二阶导,收敛接近二次,是拟合中的主力。但 JᵀJ 可能奇异或病态(参数冗余、数据不足),此时步长会爆炸,算法直接发散。
Levenberg-Marquardt 法正是为修补这一缺陷而生。它在高斯-牛顿方程中加入阻尼项:(JᵀJ + λI)Δθ = −Jᵀr。当 λ→0 时退化为高斯-牛顿,收敛快;当 λ 很大时,Δθ ≈ −(1/λ)Jᵀr,退化为小步长梯度下降,稳健但慢。实际实现中 λ 自适应调整:若新步使 S 下降则减小 λ(更信任二次近似),否则增大 λ(退回稳健方向)。这使 LM 兼具高斯-牛顿的速度与梯度下降的鲁棒性,成为非线性拟合的默认选择。
二、适用条件与选择依据
选择算法时,先看残差大小与模型非线性程度。若模型接近线性、残差小,高斯-牛顿收敛极快且实现简单;若残差较大,Σrᵢ∇²rᵢ 不可忽略,高斯-牛顿可能震荡,此时 LM 的阻尼能有效兜底。若参数间强相关或数据点少于参数数,JᵀJ 必然病态,必须用 LM 或对参数做正则化。若目标函数并非最小二乘形式(如含绝对值损失、约束项),则高斯-牛顿与 LM 的推导前提不成立,应回到通用牛顿法或拟牛顿法(BFGS)。
再看计算预算。梯度下降每步仅一次雅可比乘法,适合参数极多、单步昂贵的场景(如大规模神经网络预训练);但拟合问题参数通常只有几个到几十个,JᵀJ 的 n×n 分解成本可接受,因此 LM 的额外开销换来的收敛步数下降是划算的。牛顿法因需二阶导,在残差模型复杂时几乎不用于拟合,更多出现在小规模、解析二阶导可得的问题中。
三、一个可复现的对比示例
设模型 y = a·exp(−b·x),真值 a=2.0, b=0.8,在 x=0,0.5,…,4.0 上取 9 个点并加小幅噪声。初值取 a₀=1.0, b₀=0.3(故意偏离)。残差 rᵢ = a·exp(−b·xᵢ) − yᵢ,雅可比为
∂rᵢ/∂a = exp(−b·xᵢ)
∂rᵢ/∂b = −a·xᵢ·exp(−b·xᵢ)
用高斯-牛顿迭代:每步解 (JᵀJ)Δθ = −Jᵀr,更新 θ←θ+Δθ。由于初值偏差大,前几步 b 的更新可能过冲,表现为 S 先降后升;此时若改用 LM,令 λ₀=0.01,发现 S 上升就把 λ 乘 10 重试,直到下降再除 10,通常 8~12 步内稳定收敛到 a≈2.0, b≈0.8。判断收敛的实用标准是:‖Δθ‖ 相对变化小于 1e−6,或 S 的相对下降小于 1e−8,二者满足其一即可停止,避免在平坦区空转。
least_squares 默认 method='trf',本质是信赖域型 LM)。若怀疑参数冗余,先做雅可比的条件数检查:条件数过大说明参数不可辨识,应先减参数或加先验约束,而不是硬调算法。JᵀJ 病态或某步残差方向与线性近似严重不符。此时增大 λ 或改用带边界约束的信赖域方法,比反复换初值更有效。四类算法并非互斥,而是同一谱系上的不同取舍:梯度下降最稳健但最慢,牛顿法最快但最脆弱,高斯-牛顿在最小二乘结构下取得速度与成本的平衡,LM 则用阻尼因子在两者之间自适应滑动。实际拟合中,先以 LM 起步、观察 λ 的演化与 S 的下降曲线,再判断是否需要简化模型或补充数据,是比盲目切换算法更可靠的工程路径。