非线性规划中的修正牛顿法(Modified Newton’s Method in Nonlinear Programming)
好的,我们开始讲解“非线性规划中的修正牛顿法”。我会循序渐进地分解这个概念,确保你能清晰地理解它的来龙去脉、核心思想、具体步骤和关键细节。
步骤一:从基础问题出发——无约束优化与牛顿法
我们首先要明确修正牛顿法要解决的根本问题。在非线性规划中,一个核心子类是无约束优化问题,其标准形式为:
\[\min_{x \in \mathbb{R}^n} f(x) \]
其中,目标函数 \(f(x)\) 是二阶连续可微的非线性函数。
为了找到这个函数的极小值点,我们需要寻找驻点,即满足一阶最优性条件 \(\nabla f(x) = 0\) 的点。经典的牛顿法就是为了直接求解这个非线性方程组 \(\nabla f(x) = 0\) 而设计的。
- 牛顿法的核心思想:在当前迭代点 \(x_k\) 处,用 \(f(x)\) 的二阶泰勒展开(即一个二次函数)来局部近似原函数。这个二次近似函数的极小点,就可以作为下一个迭代点 \(x_{k+1}\)。
- 迭代公式:
\[ x_{k+1} = x_k - [\nabla^2 f(x_k)]^{-1} \nabla f(x_k) \]
其中,\(\nabla^2 f(x_k)\) 是 \(f\) 在 \(x_k\) 处的Hessian矩阵(二阶导数矩阵)。这个公式可以理解为:用牛顿方向 \(d_k^N = -[\nabla^2 f(x_k)]^{-1} \nabla f(x_k)\) 作为搜索方向,并以固定步长1进行移动。
- 牛顿法的优点:当初始点靠近最优解,且Hessian矩阵正定时,它具有二次收敛速率,即收敛速度极快。
步骤二:经典牛顿法的缺陷与“修正”的必要性
尽管牛顿法理论收敛速度很快,但在实际应用中直接使用它存在几个严重问题,这正是“修正牛顿法”需要解决的:
-
Hessian矩阵非正定:牛顿方向 \(d_k^N\) 的计算依赖于Hessian矩阵的逆。如果 \(\nabla^2 f(x_k)\) 不是正定矩阵(例如,在鞍点附近或远离最优点时),那么 \(d_k^N\) 可能不是下降方向(即 \(\nabla f(x_k)^T d_k^N \ge 0\))。沿着这个方向前进,目标函数值可能不会减小,算法会失效。
-
步长问题:即使Hessian矩阵正定,牛顿方向给出了局部二次模型的最优点,但对于原始的非线性函数 \(f\),步长为1的移动可能“步子太大”,导致函数值不减反增(称为“过冲”)。
-
计算开销与奇异性:每一步都需要计算Hessian矩阵的逆,当问题维度 \(n\) 很大时,计算成本 \(O(n^3)\) 非常高。此外,如果Hessian矩阵奇异(不可逆),牛顿方向根本无法定义。
结论:经典的牛顿法不是一个鲁棒的、实用的算法。我们需要对它进行“修正”,使其在任意迭代点都能产生一个“有用的”搜索方向,并配合一个合理的步长选择策略。
步骤三:修正牛顿法的核心机制
修正牛顿法主要通过两个核心改动来解决上述问题:
机制一:确保搜索方向是下降方向
这是最关键的一步。目标是构造一个对称正定矩阵 \(B_k\)(或 \(H_k\)),用它来替代或修正原始的Hessian矩阵 \(\nabla^2 f(x_k)\),从而计算出一个保证是下降方向的搜索方向 \(d_k\)。
常用策略包括:
- 修正Hessian矩阵:当检测到 \(\nabla^2 f(x_k)\) 不正定时,对它进行一个微小的扰动,使其变成正定矩阵。最经典的方法是修正Cholesky分解。在尝试对 \(\nabla^2 f(x_k)\) 进行Cholesky分解(\(LL^T\))时,如果因负主元而失败,就动态地给对角线元素加上一个正数 \(\delta\)(即用 \(\nabla^2 f(x_k) + \delta I\) 代替),直到成功分解出一个正定矩阵。此时,搜索方向 \(d_k = -(\nabla^2 f(x_k) + \delta I)^{-1} \nabla f(x_k)\) 必然是下降方向。
- 使用拟牛顿矩阵:不直接计算Hessian,而是通过梯度信息迭代更新一个正定矩阵 \(B_k\) 来近似Hessian(如BFGS、DFP方法)。拟牛顿法本身就是一类重要的修正牛顿法。
机制二:引入线搜索(Line Search)
我们不盲目采用步长1,而是在确定了下降方向 \(d_k\) 后,沿着这个方向寻找一个合适的步长 \(\alpha_k > 0\),使得函数值有“充分”的下降。这通过求解一个一维优化问题(线搜索)来完成:
\[\min_{\alpha > 0} f(x_k + \alpha d_k) \]
实际中通常采用不精确线搜索,如满足Wolfe条件或Armijo条件,在保证收敛的同时减少计算量。
结合这两点,修正牛顿法的迭代格式变为:
\[x_{k+1} = x_k + \alpha_k d_k, \quad 其中 \, d_k = -H_k \nabla f(x_k) \]
这里 \(H_k\) 是一个正定矩阵,它可能是修正后的Hessian矩阵的逆,也可能是拟牛顿法中的近似逆。\(\alpha_k\) 是通过线搜索得到的最优或可接受的步长。
步骤四:算法流程与总结
综合以上步骤,一个标准的修正牛顿法(以确保下降方向为核心)的算法框架如下:
- 初始化:给定初始点 \(x_0\),收敛容差 \(\epsilon > 0\)。设 \(k=0\)。
- 计算梯度和Hessian:在当前点 \(x_k\),计算梯度 \(g_k = \nabla f(x_k)\) 和Hessian矩阵 \(G_k = \nabla^2 f(x_k)\)。
- 收敛性检查:如果 \(\| g_k \| < \epsilon\),则算法终止,输出 \(x_k\) 作为近似最优解。
- 构造修正矩阵并求解方向:
- 尝试对 \(G_k\) 进行Cholesky分解。
- 如果成功,则得到正定矩阵,令搜索方向 \(d_k = -G_k^{-1} g_k\)(通过解线性方程组得到,而非直接求逆)。
- 如果失败(\(G_k\) 不正定),则执行修正。例如,逐渐增加一个正数 \(\delta\) 到 \(G_k\) 的对角线上,直到 \(G_k + \delta I\) 成功进行Cholesky分解。然后求解 \((G_k + \delta I) d_k = -g_k\) 得到 \(d_k\)。
- 线搜索:沿方向 \(d_k\) 执行不精确线搜索(如满足Armijo条件),确定步长 \(\alpha_k > 0\)。
- 更新迭代点:\(x_{k+1} = x_k + \alpha_k d_k\)。
- 循环:令 \(k = k+1\),返回步骤2。
核心思想总结:
修正牛顿法的精髓在于,它继承了牛顿法利用二阶曲率信息以实现快速收敛的愿望,但同时通过“修正”机制,保证了每一次迭代产生的方向都是使目标函数下降的可行方向,并通过线搜索控制步长。这使其从一个局部收敛的、脆弱的理论方法,转变为一个具有全局收敛性(即从任意初始点出发,都能收敛到某个驻点)的实用算法。它是连接经典牛顿法与更现代的拟牛顿法、信赖域方法的重要桥梁。