非线性规划中的Levenberg-Marquardt算法
好的,我们开始学习“非线性规划中的Levenberg-Marquardt算法”。我们将从最基础的概念开始,逐步深入到算法的核心思想和具体步骤。
第一步:问题背景与动机——解决非线性最小二乘问题
我们首先需要明确Levenberg-Marquardt(列文伯格-马夸尔特,简称LM)算法解决的是什么核心问题。它不是为解决一般的非线性规划问题而设计的,而是专门针对一类非常重要且常见的问题:非线性最小二乘问题。
这类问题的数学形式通常为:
最小化 \(f(x) = \frac{1}{2} \sum_{i=1}^{m} [r_i(x)]^2 = \frac{1}{2} ||r(x)||_2^2\)
其中:
- \(x \in \mathbb{R}^n\) 是我们要优化的决策变量向量。
- \(r(x) = [r_1(x), r_2(x), ..., r_m(x)]^T\) 被称为残差向量。每一个 \(r_i(x)\) 衡量了模型在第 \(i\) 个数据点或观测上的误差。
- 目标函数 \(f(x)\) 就是所有残差平方和的一半(系数1/2是为了后续求导形式简洁)。
应用场景:这类问题在科学计算和工程中无处不在,例如曲线拟合、参数估计、计算机视觉中的光束平差法、机器学习中的神经网络训练等。核心目标是通过调整参数 \(x\),使得模型输出与实际数据之间的“差距”(即残差)最小。
第二步:基础方法回顾——牛顿法与最速下降法
为了理解LM算法的巧妙之处,我们需要回顾两种基本的优化方法,它们在解决一般无约束优化问题 \(\min f(x)\) 时的思路:
- 牛顿法:它利用目标函数的二阶信息(Hessian矩阵)来构建一个二次局部模型,并直接跳到该模型的极小点。其迭代步长 \(p_k\) 通过求解牛顿方程得到:
\(\nabla^2 f(x_k) p_k = -\nabla f(x_k)\)- 优点:在最优解附近,收敛速度非常快(二阶收敛)。
- 缺点:需要计算Hessian矩阵 \(\nabla^2 f(x_k)\),计算成本高。更重要的是,只有当Hessian矩阵正定时,牛顿方向 \(p_k\) 才是下降方向。在远离最优点时,Hessian矩阵可能不正定,导致算法失效。
- 最速下降法:它只利用一阶信息(梯度),直接沿着负梯度方向 \(-\nabla f(x_k)\) 进行搜索。
- 优点:计算简单,方向总是下降方向。
- 缺点:收敛速度慢(线性收敛),尤其在接近最优点时,会沿着“之字形”路径缓慢前进。
第三步:LM算法的核心思想——融合信赖域思想
LM算法的天才之处在于,它专门针对非线性最小二乘问题,巧妙地结合了牛顿法和最速下降法的思想。其核心洞察来自于信赖域方法。
在信赖域方法中,我们不直接求解牛顿方程,而是在当前迭代点 \(x_k\) 的一个信赖域内(例如,一个以 \(x_k\) 为中心、半径为 \(\Delta_k\) 的球),用二次模型来近似目标函数。然后,我们在这个受限的区域内寻找使二次模型最小的步长 \(p\)。这个子问题称为信赖域子问题。
对于非线性最小二乘问题,其梯度和Hessian矩阵有其特殊形式:
- 梯度: \(\nabla f(x) = J(x)^T r(x)\), 其中 \(J(x)\) 是残差向量 \(r(x)\) 的雅可比矩阵(\(J_{ij} = \partial r_i / \partial x_j\))。
- Hessian: \(\nabla^2 f(x) = J(x)^T J(x) + \sum_{i=1}^m r_i(x) \nabla^2 r_i(x)\)。
LM算法做了一个关键的近似:它忽略Hessian表达式中的第二项 \(\sum r_i \nabla^2 r_i\)。这个近似是合理的,因为当残差 \(r_i\) 很小(接近最优点)时,这一项是二阶小量。于是,近似的Hessian矩阵为 \(H \approx J(x)^T J(x)\)。
现在,我们面临的信赖域子问题是:
最小化 \(m_k(p) = f(x_k) + p^T J_k^T r_k + \frac{1}{2} p^T (J_k^T J_k) p\)
满足约束 \(||p|| \le \Delta_k\)。
第四步:LM算法的具体实现——阻尼参数的作用
求解这个带球约束的二次规划子问题有一个经典的结论(可以通过拉格朗日对偶推导出):其最优解 \(p^*\) 必然满足方程:
\((J_k^T J_k + \mu I) p = -J_k^T r_k\)
其中, \(\mu \ge 0\) 是一个阻尼参数, \(I\) 是单位矩阵。
这个方程就是LM算法的核心迭代方程。让我们分析参数 \(\mu\) 的作用:
- 当 \(\mu\) 很大时:方程近似为 \(\mu I p \approx -J_k^T r_k\),即 \(p \approx -\frac{1}{\mu} J_k^T r_k\)。这等价于最速下降方向(因为梯度是 \(J_k^T r_k\)),步长被 \(1/\mu\) 缩短。这发生在初始迭代或模型拟合很差时,保证算法能稳定地向下降方向移动。
- 当 \(\mu\) 很小时:方程近似为 \((J_k^T J_k) p = -J_k^T r_k\),这正是在近似Hessian下的高斯-牛顿方程(可以看作是牛顿法在最小二乘问题中的特例)。这发生在接近最优点、残差很小、二次模型很准确时,能获得快速的局部收敛速度。
第五步:算法流程与阻尼参数更新
LM算法是一个迭代过程,其单步流程如下:
- 初始化:给定初始点 \(x_0\),初始阻尼参数 \(\mu_0\),增长因子 \(\nu > 1\)(如10),缩减因子 \(0 < \rho < 1\)(如0.25),以及停止准则(如梯度范数足够小)。
- 第k次迭代:
a. 计算雅可比矩阵和残差:计算 \(J(x_k)\) 和 \(r(x_k)\),并计算梯度 \(g_k = J_k^T r_k\)。
b. 求解方程:求解线性系统 \((J_k^T J_k + \mu_k I) p_k = -g_k\),得到试探步长 \(p_k\)。
c. 评估步长质量:计算实际下降量 \(ared_k = f(x_k) - f(x_k + p_k)\),以及模型预测下降量 \(pred_k = m_k(0) - m_k(p_k)\)。
d. 更新信赖域半径(调整 \(\mu\) ):
- 如果 \(ared_k / pred_k\) 很大(比如 > 0.75),说明模型匹配很好,可以增加信赖域(减小 \(\mu\) ),令 \(\mu_{k+1} = \mu_k / \nu\)。
- 如果比值很小(比如 < 0.25),说明模型匹配很差,需要缩小信赖域(增大 \(\mu\) ),令 \(\mu_{k+1} = \mu_k * \nu\)。
- 否则,保持 \(\mu\) 不变。
e. 决定是否接受新点: - 如果 \(ared_k / pred_k > 0\) (即实际目标函数值确实下降了),则接受这一步,更新 \(x_{k+1} = x_k + p_k\)。
- 否则,拒绝这一步,保持 \(x_{k+1} = x_k\),并回到步骤b,用更大的 \(\mu\) (更小的信赖域)重新计算步长。
- 检查收敛:如果满足停止准则(如 \(||g_k|| < \epsilon\) ),则终止;否则,令 \(k = k+1\),继续迭代。
总结:
Levenberg-Marquardt算法是一种针对非线性最小二乘问题的专用高效算法。它通过引入一个阻尼参数 \(\mu\),在高斯-牛顿法(快速但可能不稳定)和最速下降法(稳定但缓慢)之间进行平滑、自适应的切换。其数学本质是求解一个带正则化项的正规方程 \((J^T J + \mu I) p = -J^T r\),从而确保在远离最优点时方向稳定,在接近最优点时收敛迅速。这种思想也使其成为解决许多实际工程优化问题的首选算法。