基于近似Hessian的序列二次规划算法(SQP with Approximate Hessian)基础题
字数 5344 2025-12-11 21:37:37

基于近似Hessian的序列二次规划算法(SQP with Approximate Hessian)基础题

题目描述
考虑一个带有非线性等式约束的优化问题:

\[\min_{x \in \mathbb{R}^n} f(x) \quad \text{s.t.} \quad c(x) = 0 \]

其中,目标函数 \(f: \mathbb{R}^n \to \mathbb{R}\) 是二阶连续可微的,约束函数 \(c: \mathbb{R}^n \to \mathbb{R}^m\) 也是二阶连续可微的,且 \(m \leq n\)。假设计算精确的Hessian矩阵(即拉格朗日函数的二阶导数)计算代价很高,我们希望在序列二次规划(SQP)框架下,使用一个近似矩阵 \(B_k\) 来代替精确的Hessian,构建二次规划子问题,并迭代求解。请详细解释如何构造这样的近似Hessian SQP算法,包括子问题的形成、迭代格式、以及确保算法收敛的关键技巧(如BFGS更新)。


解题过程循序渐进讲解

1. 问题背景与SQP基本思想回顾

序列二次规划(SQP)是求解非线性规划问题的一类重要算法。其核心思想是:在当前迭代点 \(x_k\) 处,利用目标函数和约束的一阶、二阶信息,构造一个二次规划(QP)子问题,求解该子问题得到搜索方向 \(p_k\),然后沿该方向进行线性搜索或信赖域步长调整,得到下一个迭代点 \(x_{k+1}\)

对于等式约束问题,在点 \(x_k\) 处,精确的SQP子问题为:

\[\begin{aligned} \min_{p \in \mathbb{R}^n} & \quad \nabla f(x_k)^T p + \frac{1}{2} p^T \nabla^2_{xx} L(x_k, \lambda_k) p \\ \text{s.t.} & \quad c(x_k) + A(x_k)^T p = 0 \end{aligned} \]

其中,\(L(x, \lambda) = f(x) + \lambda^T c(x)\) 是拉格朗日函数,\(A(x) = \nabla c(x) \in \mathbb{R}^{n \times m}\) 是约束的雅可比矩阵(每列是一个约束的梯度),\(\nabla^2_{xx} L(x_k, \lambda_k)\) 是拉格朗日函数关于 \(x\) 的Hessian矩阵。

难点:精确计算 \(\nabla^2_{xx} L(x_k, \lambda_k)\) 可能很昂贵(例如,需要二阶导数,或问题维度很高)。因此,我们想用一个近似矩阵 \(B_k \approx \nabla^2_{xx} L(x_k, \lambda_k)\) 来代替它。

2. 近似Hessian SQP的子问题构造

在迭代点 \(x_k\),给定当前的拉格朗日乘子估计 \(\lambda_k\) 和一个对称矩阵 \(B_k\),我们构造如下QP子问题:

\[\begin{aligned} \min_{p \in \mathbb{R}^n} & \quad \nabla f(x_k)^T p + \frac{1}{2} p^T B_k p \\ \text{s.t.} & \quad c(x_k) + A(x_k)^T p = 0 \end{aligned} \tag{1} \]

这里,我们直接用 \(B_k\) 取代了精确的Hessian。子问题(1)是一个等式约束的二次规划,其解 \(p_k\) 可以作为搜索方向。

为什么这样近似是合理的?

  • 在最优解 \(x^*\) 处,如果 \(B_k\) 收敛到 \(\nabla^2_{xx} L(x^*, \lambda^*)\),那么SQP迭代的局部收敛速度可以是超线性的(例如,采用拟牛顿更新)。
  • 即使 \(B_k\) 只是粗略近似,只要它保持一定的正定性(或至少子空间曲率正确),算法仍可能全局收敛。

3. 求解QP子问题与迭代格式

子问题(1)的KKT条件为:

\[\begin{cases} B_k p + \nabla f(x_k) + A(x_k) \lambda_{QP} = 0 \\ c(x_k) + A(x_k)^T p = 0 \end{cases} \tag{2} \]

其中 \(\lambda_{QP}\) 是该QP子问题的乘子。我们可以将(2)写成线性系统:

\[\begin{bmatrix} B_k & A(x_k) \\ A(x_k)^T & 0 \end{bmatrix} \begin{bmatrix} p \\ \lambda_{QP} \end{bmatrix} = - \begin{bmatrix} \nabla f(x_k) \\ c(x_k) \end{bmatrix} \tag{3} \]

只要矩阵非奇异,就可解出 \(p_k\)\(\lambda_{QP}\)

然后,SQP的迭代格式为:

  • 更新迭代点:\(x_{k+1} = x_k + \alpha_k p_k\),其中 \(\alpha_k \in (0, 1]\) 是步长,通常通过线搜索(如满足某些价值函数下降)确定。
  • 更新乘子:\(\lambda_{k+1} = \lambda_{QP}\)(即直接采用QP子问题的乘子作为新乘子估计)。
  • 更新近似Hessian:\(B_{k+1} = \text{Update}(B_k, s_k, y_k)\),其中 \(s_k = x_{k+1} - x_k\)\(y_k\) 是与拉格朗日函数梯度差相关的向量,具体见下文。

4. 近似Hessian的更新:BFGS公式

为了不计算精确Hessian,我们采用拟牛顿法更新 \(B_k\)。对于无约束问题,BFGS更新利用梯度信息来近似Hessian。对于约束问题,我们需要近似的是拉格朗日函数的Hessian \(\nabla^2_{xx} L(x, \lambda)\)

定义:

\[s_k = x_{k+1} - x_k, \quad y_k = \nabla_x L(x_{k+1}, \lambda_{k+1}) - \nabla_x L(x_k, \lambda_{k+1}) \]

其中,\(\nabla_x L(x, \lambda) = \nabla f(x) + A(x) \lambda\)。注意这里第二个梯度计算时使用新的乘子 \(\lambda_{k+1}\),这是为了保证拟牛顿方程 \(B_{k+1} s_k = y_k\) 在拉格朗日函数梯度上近似成立。

BFGS更新公式为(保持 \(B_k\) 对称正定):

\[B_{k+1} = B_k - \frac{B_k s_k s_k^T B_k}{s_k^T B_k s_k} + \frac{y_k y_k^T}{s_k^T y_k} \]

这个更新要求 \(s_k^T y_k > 0\)(曲率条件),在约束问题中,即使目标函数非凸,只要 \(B_k\) 初始正定且线搜索合适,该条件通常可满足。

为什么用 \(\lambda_{k+1}\) 而不是 \(\lambda_k\) 计算 \(y_k\)
这样可以确保在解附近,\(y_k\) 近似等于 \(\nabla^2_{xx} L(\xi, \lambda_{k+1}) s_k\)(对某个 \(\xi\)),从而 \(B_{k+1}\) 更好地近似当前乘子下的Hessian,提高收敛速度。

5. 全局化策略:价值函数与线搜索

纯牛顿型迭代(步长 \(\alpha_k=1\))可能只在初始点靠近解时收敛。为了全局收敛,我们引入价值函数(merit function)来衡量进展,并据此选择步长 \(\alpha_k\)

常用的价值函数是 \(l_1\) 精确罚函数:

\[\Phi_\sigma (x) = f(x) + \sigma \| c(x) \|_1 \]

其中 \(\sigma > 0\) 是罚参数。我们要求搜索方向 \(p_k\)\(\Phi_\sigma\) 的下降方向,即 \(D(p_k) := \nabla f(x_k)^T p_k - \sigma \| c(x_k) \|_1 < 0\)。通过调整 \(\sigma\) 足够大,可以确保这一点。

线搜索(如Armijo条件):选择 \(\alpha_k\)\(1, \beta, \beta^2, \dots\) 中最大的那个,使得

\[\Phi_\sigma (x_k + \alpha p_k) \leq \Phi_\sigma (x_k) + \eta \alpha D(p_k) \]

其中 \(\beta \in (0,1)\)\(\eta \in (0, 0.5)\)

6. 算法完整步骤

  1. 初始化:选择初始点 \(x_0\),初始乘子 \(\lambda_0\),初始正定矩阵 \(B_0\)(例如单位矩阵),罚参数 \(\sigma_0 > 0\),参数 \(\beta \in (0,1)\)\(\eta \in (0,0.5)\),收敛容差 \(\epsilon > 0\)。设 \(k=0\)
  2. 收敛检查:如果 \(\| \nabla_x L(x_k, \lambda_k) \| \leq \epsilon\)\(\| c(x_k) \| \leq \epsilon\),则停止。
  3. 求解QP子问题:求解(1)得到 \(p_k\)\(\lambda_{QP}\)
  4. 价值函数下降测试:计算 \(D(p_k) = \nabla f(x_k)^T p_k - \sigma_k \| c(x_k) \|_1\)。如果 \(D(p_k) \ge 0\),则增大 \(\sigma_k\) 直到 \(D(p_k) < 0\)
  5. 线搜索:用Armijo规则在价值函数 \(\Phi_{\sigma_k}\) 上搜索步长 \(\alpha_k\)
  6. 更新迭代点\(x_{k+1} = x_k + \alpha_k p_k\)
  7. 更新乘子\(\lambda_{k+1} = \lambda_{QP}\)
  8. 更新近似Hessian:计算 \(s_k = x_{k+1} - x_k\)\(y_k = \nabla_x L(x_{k+1}, \lambda_{k+1}) - \nabla_x L(x_k, \lambda_{k+1})\)。如果 \(s_k^T y_k > 0\),用BFGS公式更新 \(B_{k+1}\);否则跳过更新(或采用阻尼BFGS)。
  9. 更新罚参数:根据需要调整 \(\sigma_{k+1}\)(例如,若约束违反未充分下降,则增大)。
  10. \(k = k+1\),返回步骤2。

7. 关键点与注意事项

  • 近似Hessian的正定性:BFGS更新保持正定,这有助于QP子问题有唯一解。如果 \(s_k^T y_k\) 不满足正曲率条件,可采用阻尼BFGS等技术。
  • 局部超线性收敛:在适当条件下(如 \(B_k\) 收敛到精确Hessian,且步长最终取1),算法局部超线性收敛。
  • 与精确Hessian SQP的关系:当 \(B_k = \nabla^2_{xx} L(x_k, \lambda_k)\) 时,就是标准SQP;这里用拟牛顿近似避免了二阶导数计算,适合大规模或黑箱函数问题。
  • 实现细节:QP子问题求解可用积极集法或内点法;矩阵 \(B_k\) 通常以紧凑形式(如L-BFGS)存储以节省内存。

总结:基于近似Hessian的SQP算法通过用拟牛顿矩阵替代精确二阶导数,在保持快速局部收敛的同时,大幅降低了每步计算量。其核心是BFGS更新、价值函数线搜索的全局化,以及乘子的自然更新。该框架可扩展至不等式约束(通过引入松弛变量或积极集策略),是实际中应用广泛的非线性规划方法。

基于近似Hessian的序列二次规划算法(SQP with Approximate Hessian)基础题 题目描述 : 考虑一个带有非线性等式约束的优化问题: \[ \min_ {x \in \mathbb{R}^n} f(x) \quad \text{s.t.} \quad c(x) = 0 \] 其中,目标函数 \( f: \mathbb{R}^n \to \mathbb{R} \) 是二阶连续可微的,约束函数 \( c: \mathbb{R}^n \to \mathbb{R}^m \) 也是二阶连续可微的,且 \( m \leq n \)。假设计算精确的Hessian矩阵(即拉格朗日函数的二阶导数)计算代价很高,我们希望在序列二次规划(SQP)框架下,使用一个近似矩阵 \( B_ k \) 来代替精确的Hessian,构建二次规划子问题,并迭代求解。请详细解释如何构造这样的近似Hessian SQP算法,包括子问题的形成、迭代格式、以及确保算法收敛的关键技巧(如BFGS更新)。 解题过程循序渐进讲解 : 1. 问题背景与SQP基本思想回顾 序列二次规划(SQP)是求解非线性规划问题的一类重要算法。其核心思想是:在当前迭代点 \( x_ k \) 处,利用目标函数和约束的一阶、二阶信息,构造一个二次规划(QP)子问题,求解该子问题得到搜索方向 \( p_ k \),然后沿该方向进行线性搜索或信赖域步长调整,得到下一个迭代点 \( x_ {k+1} \)。 对于等式约束问题,在点 \( x_ k \) 处,精确的SQP子问题为: \[ \begin{aligned} \min_ {p \in \mathbb{R}^n} & \quad \nabla f(x_ k)^T p + \frac{1}{2} p^T \nabla^2_ {xx} L(x_ k, \lambda_ k) p \\ \text{s.t.} & \quad c(x_ k) + A(x_ k)^T p = 0 \end{aligned} \] 其中,\( L(x, \lambda) = f(x) + \lambda^T c(x) \) 是拉格朗日函数,\( A(x) = \nabla c(x) \in \mathbb{R}^{n \times m} \) 是约束的雅可比矩阵(每列是一个约束的梯度),\( \nabla^2_ {xx} L(x_ k, \lambda_ k) \) 是拉格朗日函数关于 \( x \) 的Hessian矩阵。 难点 :精确计算 \( \nabla^2_ {xx} L(x_ k, \lambda_ k) \) 可能很昂贵(例如,需要二阶导数,或问题维度很高)。因此,我们想用一个近似矩阵 \( B_ k \approx \nabla^2_ {xx} L(x_ k, \lambda_ k) \) 来代替它。 2. 近似Hessian SQP的子问题构造 在迭代点 \( x_ k \),给定当前的拉格朗日乘子估计 \( \lambda_ k \) 和一个对称矩阵 \( B_ k \),我们构造如下QP子问题: \[ \begin{aligned} \min_ {p \in \mathbb{R}^n} & \quad \nabla f(x_ k)^T p + \frac{1}{2} p^T B_ k p \\ \text{s.t.} & \quad c(x_ k) + A(x_ k)^T p = 0 \end{aligned} \tag{1} \] 这里,我们直接用 \( B_ k \) 取代了精确的Hessian。子问题(1)是一个等式约束的二次规划,其解 \( p_ k \) 可以作为搜索方向。 为什么这样近似是合理的? 在最优解 \( x^* \) 处,如果 \( B_ k \) 收敛到 \( \nabla^2_ {xx} L(x^ , \lambda^ ) \),那么SQP迭代的局部收敛速度可以是超线性的(例如,采用拟牛顿更新)。 即使 \( B_ k \) 只是粗略近似,只要它保持一定的正定性(或至少子空间曲率正确),算法仍可能全局收敛。 3. 求解QP子问题与迭代格式 子问题(1)的KKT条件为: \[ \begin{cases} B_ k p + \nabla f(x_ k) + A(x_ k) \lambda_ {QP} = 0 \\ c(x_ k) + A(x_ k)^T p = 0 \end{cases} \tag{2} \] 其中 \( \lambda_ {QP} \) 是该QP子问题的乘子。我们可以将(2)写成线性系统: \[ \begin{bmatrix} B_ k & A(x_ k) \\ A(x_ k)^T & 0 \end{bmatrix} \begin{bmatrix} p \\ \lambda_ {QP} \end{bmatrix} = - \begin{bmatrix} \nabla f(x_ k) \\ c(x_ k) \end{bmatrix} \tag{3} \] 只要矩阵非奇异,就可解出 \( p_ k \) 和 \( \lambda_ {QP} \)。 然后,SQP的迭代格式为: 更新迭代点:\( x_ {k+1} = x_ k + \alpha_ k p_ k \),其中 \( \alpha_ k \in (0, 1 ] \) 是步长,通常通过线搜索(如满足某些价值函数下降)确定。 更新乘子:\( \lambda_ {k+1} = \lambda_ {QP} \)(即直接采用QP子问题的乘子作为新乘子估计)。 更新近似Hessian:\( B_ {k+1} = \text{Update}(B_ k, s_ k, y_ k) \),其中 \( s_ k = x_ {k+1} - x_ k \),\( y_ k \) 是与拉格朗日函数梯度差相关的向量,具体见下文。 4. 近似Hessian的更新:BFGS公式 为了不计算精确Hessian,我们采用拟牛顿法更新 \( B_ k \)。对于无约束问题,BFGS更新利用梯度信息来近似Hessian。对于约束问题,我们需要近似的是拉格朗日函数的Hessian \( \nabla^2_ {xx} L(x, \lambda) \)。 定义: \[ s_ k = x_ {k+1} - x_ k, \quad y_ k = \nabla_ x L(x_ {k+1}, \lambda_ {k+1}) - \nabla_ x L(x_ k, \lambda_ {k+1}) \] 其中,\( \nabla_ x L(x, \lambda) = \nabla f(x) + A(x) \lambda \)。注意这里第二个梯度计算时使用新的乘子 \( \lambda_ {k+1} \),这是为了保证拟牛顿方程 \( B_ {k+1} s_ k = y_ k \) 在拉格朗日函数梯度上近似成立。 BFGS更新公式为(保持 \( B_ k \) 对称正定): \[ B_ {k+1} = B_ k - \frac{B_ k s_ k s_ k^T B_ k}{s_ k^T B_ k s_ k} + \frac{y_ k y_ k^T}{s_ k^T y_ k} \] 这个更新要求 \( s_ k^T y_ k > 0 \)(曲率条件),在约束问题中,即使目标函数非凸,只要 \( B_ k \) 初始正定且线搜索合适,该条件通常可满足。 为什么用 \( \lambda_ {k+1} \) 而不是 \( \lambda_ k \) 计算 \( y_ k \)? 这样可以确保在解附近,\( y_ k \) 近似等于 \( \nabla^2_ {xx} L(\xi, \lambda_ {k+1}) s_ k \)(对某个 \( \xi \)),从而 \( B_ {k+1} \) 更好地近似当前乘子下的Hessian,提高收敛速度。 5. 全局化策略:价值函数与线搜索 纯牛顿型迭代(步长 \( \alpha_ k=1 \))可能只在初始点靠近解时收敛。为了全局收敛,我们引入价值函数(merit function)来衡量进展,并据此选择步长 \( \alpha_ k \)。 常用的价值函数是 \( l_ 1 \) 精确罚函数: \[ \Phi_ \sigma (x) = f(x) + \sigma \| c(x) \| 1 \] 其中 \( \sigma > 0 \) 是罚参数。我们要求搜索方向 \( p_ k \) 是 \( \Phi \sigma \) 的下降方向,即 \( D(p_ k) := \nabla f(x_ k)^T p_ k - \sigma \| c(x_ k) \|_ 1 < 0 \)。通过调整 \( \sigma \) 足够大,可以确保这一点。 线搜索(如Armijo条件):选择 \( \alpha_ k \) 为 \( 1, \beta, \beta^2, \dots \) 中最大的那个,使得 \[ \Phi_ \sigma (x_ k + \alpha p_ k) \leq \Phi_ \sigma (x_ k) + \eta \alpha D(p_ k) \] 其中 \( \beta \in (0,1) \),\( \eta \in (0, 0.5) \)。 6. 算法完整步骤 初始化 :选择初始点 \( x_ 0 \),初始乘子 \( \lambda_ 0 \),初始正定矩阵 \( B_ 0 \)(例如单位矩阵),罚参数 \( \sigma_ 0 > 0 \),参数 \( \beta \in (0,1) \),\( \eta \in (0,0.5) \),收敛容差 \( \epsilon > 0 \)。设 \( k=0 \)。 收敛检查 :如果 \( \| \nabla_ x L(x_ k, \lambda_ k) \| \leq \epsilon \) 且 \( \| c(x_ k) \| \leq \epsilon \),则停止。 求解QP子问题 :求解(1)得到 \( p_ k \) 和 \( \lambda_ {QP} \)。 价值函数下降测试 :计算 \( D(p_ k) = \nabla f(x_ k)^T p_ k - \sigma_ k \| c(x_ k) \|_ 1 \)。如果 \( D(p_ k) \ge 0 \),则增大 \( \sigma_ k \) 直到 \( D(p_ k) < 0 \)。 线搜索 :用Armijo规则在价值函数 \( \Phi_ {\sigma_ k} \) 上搜索步长 \( \alpha_ k \)。 更新迭代点 :\( x_ {k+1} = x_ k + \alpha_ k p_ k \)。 更新乘子 :\( \lambda_ {k+1} = \lambda_ {QP} \)。 更新近似Hessian :计算 \( s_ k = x_ {k+1} - x_ k \),\( y_ k = \nabla_ x L(x_ {k+1}, \lambda_ {k+1}) - \nabla_ x L(x_ k, \lambda_ {k+1}) \)。如果 \( s_ k^T y_ k > 0 \),用BFGS公式更新 \( B_ {k+1} \);否则跳过更新(或采用阻尼BFGS)。 更新罚参数 :根据需要调整 \( \sigma_ {k+1} \)(例如,若约束违反未充分下降,则增大)。 设 \( k = k+1 \),返回步骤2。 7. 关键点与注意事项 近似Hessian的正定性 :BFGS更新保持正定,这有助于QP子问题有唯一解。如果 \( s_ k^T y_ k \) 不满足正曲率条件,可采用阻尼BFGS等技术。 局部超线性收敛 :在适当条件下(如 \( B_ k \) 收敛到精确Hessian,且步长最终取1),算法局部超线性收敛。 与精确Hessian SQP的关系 :当 \( B_ k = \nabla^2_ {xx} L(x_ k, \lambda_ k) \) 时,就是标准SQP;这里用拟牛顿近似避免了二阶导数计算,适合大规模或黑箱函数问题。 实现细节 :QP子问题求解可用积极集法或内点法;矩阵 \( B_ k \) 通常以紧凑形式(如L-BFGS)存储以节省内存。 总结 :基于近似Hessian的SQP算法通过用拟牛顿矩阵替代精确二阶导数,在保持快速局部收敛的同时,大幅降低了每步计算量。其核心是BFGS更新、价值函数线搜索的全局化,以及乘子的自然更新。该框架可扩展至不等式约束(通过引入松弛变量或积极集策略),是实际中应用广泛的非线性规划方法。