约束优化中的增广拉格朗日法(Augmented Lagrangian Method in Constrained Optimization)
好的,我们开始。我将为你循序渐进地讲解“增广拉朗日法”,并确保与已列出的所有词条不重复。
第一步:从拉格朗日乘子法到惩罚函数的困境
首先,我们来回顾一个基础知识。对于等式约束优化问题:
\[\begin{aligned} & \min_{x} \; f(x) \\ & \text{s.t.} \quad h_i(x) = 0, \quad i = 1, \dots, m \end{aligned} \]
- 拉格朗日函数 定义为:\(L(x, \lambda) = f(x) + \sum_{i=1}^{m} \lambda_i h_i(x)\)。
- 经典的拉格朗日乘子法 告诉我们,在原问题满足一定正则性条件(如约束规格)时,其最优解 \(x^*\) 和对应的乘子 \(\lambda^*\) 必须满足 KKT条件 中的平稳性条件:\(\nabla_x L(x^*, \lambda^*) = 0\) 和等式约束 \(h_i(x^*) = 0\)。
困境:直接求解上述KKT系统通常很困难。一个替代思路是使用罚函数法。我们构造一个惩罚函数:
\[P(x; \mu) = f(x) + \frac{\mu}{2} \sum_{i=1}^{m} h_i(x)^2 \]
其中 \(\mu > 0\) 是惩罚参数。这个思想是:通过求解一系列无约束问题 \(\min_x P(x; \mu_k)\) (其中 \(\mu_k \to \infty\)),迫使最优解满足 \(h_i(x) \to 0\)。
缺点:当惩罚参数 \(\mu\) 必须趋于无穷大时,惩罚函数 \(P(x; \mu)\) 的海森矩阵条件数会变得非常差(病态),导致数值求解极其困难且不稳定。
第二步:增广拉格朗日函数的核心构造
增广拉格朗日法 巧妙地结合了拉格朗日函数和惩罚项,旨在克服纯惩罚函数的病态问题。它定义的增广拉格朗日函数 为:
\[\mathcal{L}_A(x, \lambda; \mu) = f(x) + \sum_{i=1}^{m} \lambda_i h_i(x) + \frac{\mu}{2} \sum_{i=1}^{m} h_i(x)^2 \]
仔细观察这个公式:
- 前两项:就是标准的拉格朗日函数 \(L(x, \lambda)\),它包含了原问题的目标和对约束的线性加权。
- 第三项:是二次惩罚项,与罚函数法中的惩罚项完全相同。
关键思想:与惩罚函数法“独自承受”迫使约束满足的压力不同,增广拉格朗日法让拉格朗日乘子 \(\lambda\) 和惩罚参数 \(\mu\) 协同工作。乘子 \(\lambda\) 提供了一个“偏置”或“修正”,使得在合理的、有限的 \(\mu\) 值下,就能通过求解关于 \(x\) 的无约束子问题,得到满足约束的原问题最优解。
第三步:方法的迭代步骤与直观解释
增广拉格朗日法是一个迭代算法,在每一步 \(k\),我们固定乘子 \(\lambda^k\) 和惩罚参数 \(\mu_k\),求解一个关于 \(x\) 的无约束优化子问题:
\[x^{k+1} \approx \arg\min_{x} \; \mathcal{L}_A(x, \lambda^k; \mu_k) \]
然后,关键步骤来了:我们利用这一步得到的解 \(x^{k+1}\) 来更新拉格朗日乘子 \(\lambda\):
\[\lambda_i^{k+1} = \lambda_i^{k} + \mu_k \, h_i(x^{k+1}), \quad i = 1, \dots, m \]
这个更新公式的直观解释是什么?
回忆一下,在最优解 \(x^*\) 处,对于正确的乘子 \(\lambda^*\),约束 \(h_i(x^*) = 0\) 必须成立。我们当前的 \(x^{k+1}\) 很可能不满足约束,即 \(h_i(x^{k+1}) \neq 0\)。乘子更新公式可以看作是对 KKT条件中平稳性条件 的近似强制执行。
- 从最优性条件看,我们希望有 \(\nabla f(x^*) + \sum \lambda_i^* \nabla h_i(x^*) = 0\)。
- 在我们更新后的乘子 \(\lambda^{k+1}\) 下,函数 \(\mathcal{L}_A(x, \lambda^{k+1}; \mu_k)\) 在 \(x^{k+1}\) 处的梯度为:
\[\nabla f(x^{k+1}) + \sum_i (\lambda_i^{k} + \mu_k h_i(x^{k+1})) \nabla h_i(x^{k+1}) + \mu_k \sum_i h_i(x^{k+1}) \nabla h_i(x^{k+1}) \]
简化后即为:\(\nabla f(x^{k+1}) + \sum_i \lambda_i^{k+1} \nabla h_i(x^{k+1})\)。
- 如果我们的子问题求解得足够精确,使得 \(x^{k+1}\) 是 \(\min_x \mathcal{L}_A(x, \lambda^k; \mu_k)\) 的近似平稳点,那么上式的值接近于零。这意味着 \((x^{k+1}, \lambda^{k+1})\) 越来越接近满足原问题的KKT条件。同时,乘子更新公式会“惩罚”约束违反:如果 \(h_i(x^{k+1}) > 0\),我们就增大对应的 \(\lambda_i\),在下一步的子问题中给目标函数增加更大的“压力”迫使 \(h_i(x)\) 减小;反之亦然。
第四步:扩展到不等式约束与参数更新策略
对于包含不等式约束 \(g_j(x) \le 0\) 的问题,标准技巧是引入松弛变量 \(s_j \ge 0\),将其转化为等式约束 \(g_j(x) + s_j = 0\),并对松弛变量施加非负约束。在增广拉格朗日函数的框架下,这可以通过巧妙地处理得到一种更简洁的形式。通常,我们定义不等式约束的增广拉格朗日函数为:
\[\mathcal{L}_A(x, \mu, \lambda; \mu) = f(x) + \frac{\mu}{2} \sum_{j=1}^{p} \left( \max\left(0, \lambda_j/\mu + g_j(x)\right)^2 - (\lambda_j/\mu)^2 \right) \]
对应的乘子更新公式为:
\[\lambda_j^{k+1} = \max\left(0, \; \lambda_j^{k} + \mu_k g_j(x^{k+1}) \right) \]
这保证了乘子 \(\lambda_j\) 始终非负(对应于不等式约束的KKT对偶可行性条件)。
参数更新策略:
- 惩罚参数 \(\mu_k\):并不需要趋于无穷大。通常从一个初始值(如1或10)开始。如果在一次迭代后,约束违反度下降不明显,则将 \(\mu_k\) 乘以一个系数(如5或10)增大,以加强对约束的惩罚力度。
- 收敛准则:当约束违反度 \(\|h(x^{k+1})\|\) 和对偶条件(如 \(\|x^{k+1} - x^k\|\) 或梯度条件)小于预设的容差时,算法终止。
第五步:方法的优势、变体与总结
核心优势:
- 数值稳定性:由于乘子 \(\lambda\) 分担了迫使约束满足的“工作”,惩罚参数 \(\mu\) 无需趋于无穷大就能达到高精度,从而避免了纯惩罚函数法导致的病态数值问题。
- 精确性:在较温和的条件下,该方法能收敛到满足约束的精确解,而不仅仅是近似解。
- 灵活性:求解子问题 \(\min_x \mathcal{L}_A(x, \lambda^k; \mu_k)\) 可以使用任何成熟的无约束优化算法,如拟牛顿法、非线性共轭梯度法等。
重要变体:
- 交替方向乘子法(ADMM):这是增广拉格朗日法的一个杰出变体,专门用于求解可分解结构的优化问题(如 \(f(x) = f_1(x_1) + f_2(x_2)\),且约束为 \(Ax + Bz = c\))。它通过对变量进行交替最小化(而非联合最小化)来求解子问题,在大规模分布式计算中应用极广。
总结:
增广拉格朗日法 是一种强大的约束优化框架。它通过将拉格朗日乘子与二次惩罚项相结合,构造出一个增广拉格朗日函数。算法通过在更新原始变量 \(x\)(通过无约束极小化) 和更新对偶变量 \(\lambda\)(通过基于约束违反度的简单梯度步) 之间交替进行,逐步逼近原问题的最优解。它成功地在数值稳定性和求解精确性之间取得了平衡,是现代连续优化工具箱中的基础工具之一。