AIGC标识 【复习笔记】从零开始的凸优化生活

本来是打算自己写的,但是两天后周一就要考试了。无奈让deepseek根据我和它巨长的对话总结梳理了一下,生成了这篇文。
然后它生成的一坨,我跟它大战三百回合才勉强符合我“能看”的标准。
声明:大纲是我写的,引入拉格朗日函数的这个思路是我自己糊出来的,仅供参考

有时间等我来手写吧。

本来x*是表示最优解的,但是由于x*渲染有问题,一律改写成x0.


凸优化底层逻辑笔记

第〇章:等式拉格朗日乘数法的几何图像

考虑等式约束问题:最小化 \(f_0(x)\),约束为 \(h_i(x) = 0\)。
这 \(m\) 个等式约束在空间中交叠出了一个可行的曲面 \(P\)。你只能在这个曲面 \(P\) 上活动。

怎么判断到了极值点?
如果你站在 \(P\) 上的某一点,顺着曲面 \(P\) 往任何方向走一小步(微小变化 \(\Delta x\)),目标函数 \(f_0\) 的一阶变化量 \(\nabla f_0^T \Delta x\) 都为 0,那你就到了极值点。这意味着,\(\nabla f_0\) 在曲面 \(P\) 的切线方向上的投影必须为 0。也就是说,目标梯度 \(\nabla f_0\) 完全垂直于曲面 \(P\)。

约束的梯度在哪?
因为每个约束面 \(h_i=0\) 都包含曲面 \(P\),所以约束的梯度 \(\nabla h_i\) 也垂直于曲面 \(P\)。既然 \(\nabla h_i\) 都垂直于 \(P\),那么它们的任意线性组合 \(\sum \mu_i \nabla h_i\) 也垂直于 \(P\)。

合起来:
在极值点处,\(\nabla f_0\) 和 \(\sum \mu_i \nabla h_i\) 都垂直于同一个曲面 \(P\)。所以它们必然共线(可以同向也可以反向,所以 \(\mu_i\) 可正可负)。代数表达即为:
\[ \nabla f_0(x_0) + \sum \mu_i \nabla h_i(x_0) = 0 \]
这就是等式拉格朗日乘数法。


第一章:第一路引入——转化为等式与 G 函数

我们目前只会处理等式约束。面对不等式约束 \(f_i(x) \le 0\),我们的策略是把不等式转化为等式:引入变量 \(m_i\),令 \(f_i(x) = m_i\),同时限制 \(m_i \le 0\)。构造拉格朗日函数:
\[ G(x, \lambda, m) = f_0(x) + \sum \lambda_i (f_i(x) - m_i) \]

第一步:固定 \(m_i\)。
此时 \(f_i(x) = m_i\) 是纯等式,套用前面的几何结论,解出乘子 \(\lambda_i(m)\)。

第二步:解冻 \(m_i\),求极小值。
把解出的 \(x(m)\) 和 \(\lambda(m)\) 代回 \(G\)。此时 \(G\) 对 \(m_i\) 的全导数,因为驻点处的偏导项全为 0,只剩:
\[ \frac{dG}{dm_i} = \frac{\partial G}{\partial m_i} = -\lambda_i \]

我们的目的是寻找满足什么条件的 \(m_i\) 有潜力最小化 \(G\),什么条件的 \(m_i\) 不可能最小化 \(G\)。通过分析 \(m_i\) 的活动空间来判定:

  • 情况 A:如果极小值点落在内部(\(m_i < 0\)):此时 \(m_i\) 有双向的活动空间。既然已是极小值,无论往哪个方向动一步,\(G\) 都不能更小。所以一阶导数必须为 0:\(-\lambda_i = 0 \implies \lambda_i = 0\)。
  • 情况 B:如果极小值点落在边界(\(m_i = 0\)):此时 \(m_i\) 只能往负方向活动(\(dm_i < 0\))。如果往负方向走一步能让 \(G\) 更小,那它就不是极小值点。既然它是极小值点,说明往这个唯一允许的方向走,\(G\) 不能变小。因此 \(-\lambda_i \le 0 \implies \lambda_i \ge 0\)。

合并得到互补松弛:\(\lambda_i \ge 0\) 且 \(\lambda_i m_i = 0\)。


第二章:第一路的延续——等式 min-max 与 G -> F

我们刚才在解冻 \(m_i\) 时发现,如果 \(\lambda_i < 0\),极小化就无从谈起。换个角度,这其实是因为 \(G\) 天然具有 min-max 结构。

等式拉格朗日函数的 min-max 性:
\[ \min_x \max_\mu \left[ f_0(x) + \sum \mu_i h_i(x) \right] \]
内层对 \(\mu\) 求极大。如果 \(h_i(x) \neq 0\),\(\mu_i\) 会趋向正负无穷大,导致整个式子爆炸;只有当 \(h_i(x) = 0\) 时,内层 max 才有有限值 \(f_0(x)\)。所以 min-max 天然等价于带等式约束的 \(f_0\) 最小化。

从 G 到 min-max G:
把不等式转化为等式后,原问题的最小化 \(f_0\) 等价于:
\[ \min_{x, m_i \le 0} \max_\lambda G(x, \lambda, m) \]

从 min-max G 到 min-max F:
在这个式子里,先对内层关于 \(m \le 0\) 求极小。基于第一章的结论,只要 \(\lambda_i \ge 0\),\(-\lambda_i m_i\) 在 \(m_i=0\) 时取得极小值 0。
于是 \(G\) 被转化成了:
\[ F(x, \lambda) = f_0(x) + \sum \lambda_i f_i(x) \]
原问题等价于:
\[ \min_x \max_{\lambda \ge 0} F(x, \lambda) \]


第三章:第二路引入——直接用等式 min-max 推广到不等式

除了从 G 函数一步步推导,我们能不能直接用等式拉格朗日函数的 min-max 性质,一步跨到不等式?

在等式里,内层 max 惩罚的是 \(h_i(x) \neq 0\)。
在不等式 \(f_i(x) \le 0\) 里,我们只惩罚 \(f_i(x) > 0\)(违反了限制),不惩罚 \(f_i(x) < 0\)(在安全区域内)。
因此,如果我们写出 \(\min_x \max_{\lambda \ge 0} F(x, \lambda)\):

  • 若 \(f_i(x) > 0\):因为 \(\lambda_i \ge 0\),让 \(\lambda_i \to +\infty\) 会使惩罚项爆炸,迫使 \(x\) 回到可行域。
  • 若 \(f_i(x) \le 0\):因为 \(\lambda_i \ge 0\),内层对 \(\lambda\) 求极大时会取 \(\lambda_i = 0\),惩罚项直接消失。

所以,这个内层 max 天然完成了“对违反约束进行惩罚,对满足约束不作要求”的功能。直接得到:
\[ \min_x \max_{\lambda \ge 0} F(x, \lambda) \]
无需借助 G 函数,这是同一原理的直接推广。

利用鞍点推出 KKT:
假设 \((x_0, \lambda_0)\) 是上述 min-max 问题的最优解,它必然是一个鞍点:
\[ F(x_0, \lambda) \le F(x_0, \lambda_0) \le F(x, \lambda_0) \]

  • 左侧(对 \(x\) 极小):在极小值点,对 \(x\) 的一阶偏导必须为 0,即 \(\nabla f_0 + \sum \lambda_i \nabla f_i = 0\)。
  • 右侧(对 \(\lambda\) 极大):结合 \(\lambda_i \ge 0\) 和 \(f_i(x) \le 0\),逼出了 \(\lambda_i \ge 0\) 和互补松弛。

第四章:正式汇总——KKT 条件

两条路(G函数与 min-max 鞍点)汇合,得到局部最优的必要条件(KKT条件):

  1. 驻点条件:\(\nabla f_0(x_0) + \sum \lambda_i \nabla f_i(x_0) = 0\)。
  2. 原始可行:\(f_i(x_0) \le 0\)。
  3. 对偶可行:\(\lambda_i \ge 0\)。
  4. 互补松弛:\(\lambda_i f_i(x_0) = 0\)。

第五章:从 Min-Max 到对偶问题

换序的动机与代价:
直接解 \(\min_x \max_{\lambda \ge 0} F(x, \lambda)\) 很难。我们想换成 \(\max_{\lambda \ge 0} \min_x F(x, \lambda)\)。
注意:这不是等价转换! 换序只能求出原问题的下界。但我们依然要研究它,因为内层对 \(x\) 极小化更容易算。
定义对偶函数 \(g(\lambda) = \min_x F(x, \lambda)\)。对偶问题就是求最好的下界:\(\max_{\lambda \ge 0} g(\lambda)\)。

内层算出的 \(-\infty\) 会被直接扔掉:
看线性规划:\(g(\lambda) = \min_x [-b^T\lambda + (A^T\lambda + c)^T x]\)。
如果斜率 \((A^T\lambda + c) \neq 0\),\(x\) 跑向无穷会导致极小值变成 \(-\infty\)。因为外层我们要找最大下界,\(-\infty\) 显然毫无价值。所以,只有那些让斜率等于 0(\(A^T\lambda + c = 0\))的 \(\lambda\),才有资格留下来参与后续的研究。 这就是隐藏的等式约束的真正逻辑。


第六章:凸函数的魔法——KKT 的充要性

6.1 什么是凸函数与凸优化?

  • 凸函数:几何上是一个“大碗”。它的数学性质是:任意一点的切线,永远在整个函数图像的下方。 即 \(f(x) \ge f(x_0) + \nabla f(x_0)^T (x - x_0)\)。
  • 凸优化问题:目标函数 \(f_0(x)\) 是凸的,不等式约束 \(f_i(x) \le 0\) 是凸的,且等式约束 \(h_i(x) = 0\) 必须是仿射(直线/平面)的。
    为什么等式约束必须是仿射的? 因为 \(h(x) = 0\) 在优化中等价于 \(h(x) \le 0\) 且 \(-h(x) \le 0\)。如果 \(h\) 是弯曲的,那 \(-h\) 就是一个“倒扣的碗”(凹函数),这就破坏了凸优化的基本条件。只有直线,才能做到正着凸、反着也凸,从而同时满足两边的凸性要求。

6.2 为什么凸+KKT 必定是全局最优?(分层解析)

第一层(最上层直观):凹凸共切线卡死不等关系
凸函数在任一点的切线永远在下方,约束函数的切线也永远在下方。KKT 的条件恰好把目标的梯度和约束的梯度拼在了一起,形成了一个全局的切面底座,把所有可行点死死卡在上面。

第二层(中层增量逻辑):
因为有了切面底座,我们可以直接写出增量关系:
[ \Delta f_0(x) \ge \text{目标切面} = -\text{约束切面} \ge -\Delta f_i(x) ]
由此推出 \(\Delta(f_0 + \sum \lambda_i f_i)(x) \ge 0\)。
再结合原函数与拉格朗日函数的关系,得到:
\[ f_0(x) \ge F(x, \lambda_0) \ge F(x_0, \lambda_0) = f_0(x_0) \]

第三层(最底层代数公式):
上述中层的逻辑,严格展开就是:

  1. 目标凸:\(f_0(x) \ge f_0(x_0) + \nabla f_0(x_0)^T (x - x_0)\)。
  2. 代入驻点条件(\(\nabla f_0 = -\sum \lambda_i \nabla f_i\)):“目标切面”变成了“负的约束切面”。
  3. 约束凸:\(\nabla f_i(x_0)^T (x - x_0) \le f_i(x) - f_i(x_0)\)。代入上式,得 \(f_0(x) \ge f_0(x_0) - \sum \lambda_i (f_i(x) - f_i(x_0))\)。
  4. 互补松弛(\(\lambda_i f_i(x_0) = 0\))与可行性(\(f_i(x) \le 0\)):
    \[ f_0(x) \ge f_0(x_0) - \sum \lambda_i f_i(x) \ge f_0(x_0) \]
    证毕。

6.3 Slater 条件:防止约束隐身

要写出 KKT,前提是约束梯度 \(\nabla f_i\) 得有方向、不退化。

  • 为什么会退化? 如果可行域干瘪(比如 \(x^2 \le 0\)),在最优点处 \(\nabla f_i = 0\)。此时驻点方程变成 \(1 + \lambda \cdot 0 = 0\),无解。约束在这个点“隐身”了,KKT 这个必要条件根本写不出来。
  • Slater 条件的作用:要求存在一个点,让所有的不等式约束严格小于 0(\(f_i(x) < 0\))。这保证了可行域是有“厚度”的,不会缩成一个点或一条线。有了厚度,边界就有法向,梯度就不会全为 0。
  • 为什么仿射约束可以放宽? 如果约束是线性的(仿射),它天然是一个平直的超平面,梯度处处存在且非零,不可能因为“曲率为0”而退化。所以对于仿射约束,Slater 条件放宽为:只要存在点让仿射约束 \(\le 0\),让非线性约束 \(<0\) 即可。
  • 结论:Slater 的作用就是防止边界退化。只要满足 Slater,凸问题下的最优解就一定满足 KKT,且 KKT 的点也一定是全局最优(充要条件闭环)。

第七章:算法的现实妥协(从理论到工程)

这里应该主要是无限制优化?和上面关系不太大。

7.1 牛顿法:从一元到多元

一元牛顿法的引入:
梯度下降只看一阶导数(坡度),遇到狭长的峡谷会疯狂震荡。牛顿法利用了二阶导数(曲率)。
在一元函数中,目标是寻找导数 \(f'(x) = 0\) 的根。
利用一阶泰勒展开用切线逼近曲线,令其等于 0:
\[ f'(x_k) + f''(x_k)(x - x_k) = 0 \]
解得迭代公式:
\[ x_{k+1} = x_k - \frac{f'(x_k)}{f''(x_k)} \]
它的几何意义是:在当前点用一个开口向上的抛物线去拟合目标函数,然后直接跳到这个抛物线的极小值点。

多元牛顿法的推广:
在一元里,除以二阶导数 \(f''(x)\) 是很自然的操作。但在多元里,梯度 \(\nabla f(x)\) 是一个向量,向量之间不能直接相除。
为了完成“除以二阶导数”的操作,我们把二阶导数推广为 Hessian 矩阵 \(\nabla^2 f(x)\),把除法变成了矩阵求逆。将目标函数在当前点做二阶泰勒展开(用抛物面拟合):
\[ f(x + \Delta x) \approx f(x) + \nabla f(x)^T \Delta x + \frac{1}{2} \Delta x^T \nabla^2 f(x) \Delta x \]
对 \(\Delta x\) 求导并令其为 0,得到牛顿法迭代方向:
\[ \Delta x = -[\nabla^2 f(x)]^{-1} \nabla f(x) \]

  • 优点:利用了 Hessian 矩阵的曲率信息,收敛极快(二次收敛)。
  • 致命缺陷:Hessian 矩阵求逆的时间复杂度是 \(O(n^3)\),内存占用是 \(O(n^2)\)。当参数量 \(n\) 达到百万级时,根本存不下算不动。

7.2 拟牛顿法与 L-BFGS:逃避矩阵求逆

既然直接算 Hessian 太贵,就用一个矩阵 \(B_k\) 去近似 Hessian 的逆。
利用前后两次迭代的位置差 \(s_k = x_{k+1} - x_k\) 和梯度差 \(y_k = \nabla f(x_{k+1}) - \nabla f(x_k)\),通过更新公式(如 BFGS)直接更新 \(B_k\):
[ B_{k+1} = B_k + \text{通过 } s_k, y_k \text{ 算出的修正项} ]
但这依然是 \(O(n^2)\) 的内存。L-BFGS 更极端:只保留最近 \(m\) 步的 \(s_k\) 和 \(y_k\) 向量。需要算下降方向时,现用现算,内存降到 \(O(mn)\)。

7.3 一阶算法的逆袭:用历史梯度模拟曲率(Adam与Momentum)

深度学习参数量上亿,退回一阶梯度,用巧妙的代数组合来弥补曲率信息的缺失。

  • 动量(Momentum):峡谷震荡时,左右方向分量抵消,向下分量叠加。
    \[ v_{k+1} = \beta v_k + \nabla f(x_k), \quad x_{k+1} = x_k - \alpha v_{k+1} \]
    引入了阻尼,方向更平滑,抑制了震荡。
  • Adam:对每个参数维度分别调整学习率。累加梯度均值(一阶矩)和平方(二阶矩)。
    \[ x_{k+1} = x_k - \frac{\eta}{\sqrt{v_k} + \epsilon} m_k \]
    某维度梯度一直很大,分母就变大,步长缩小。本质上是在对角线上近似了 Hessian 矩阵的缩放效果,用 \(O(n)\) 加法代替了 \(O(n^3)\) 求逆。

7.4 数据规模的妥协:随机梯度下降(SGD)

数据量极大时,SGD 每次只随机抽取一个样本(或 batch)计算梯度:
\[ x_{k+1} = x_k - \eta_k \nabla f_{i_k}(x_k) \]
单步梯度噪声极大(方差大),但期望方向与全量梯度一致(无偏估计)。学习率随迭代衰减,噪声被平均掉,最终收敛到极小值附近。

posted @ 2026-11-07 18:30  鋻團景一  阅读(2)  评论(0)    收藏  举报