凸优化是指在一个凸可行集合上最小化凸函数。它之所以重要,原因很简单:如果这些凸性条件成立,那么任何局部最小值也一定是全局最小值。

这种保证使这类问题比一般优化问题可靠得多。你仍然需要正确地建立模型,但一旦模型是凸的,你就不必担心找到的解只是某个小邻域里看起来最优的解。

一种常见形式是

minimize f(x)\text{minimize } f(x)

subject to

gi(x)0for i=1,,m,Ax=b,g_i(x) \le 0 \quad \text{for } i=1,\dots,m, \qquad Ax=b,

其中 ff 和每个 gig_i 都是凸函数,而等式约束是仿射的。在这些条件下,可行域是凸集,因此该优化问题是凸优化问题。

凸优化的定义

如果对于定义域中的任意两点 xxyy,以及任意 0t10 \le t \le 1,都有

f(tx+(1t)y)tf(x)+(1t)f(y),f(tx + (1-t)y) \le t f(x) + (1-t) f(y),

那么函数 ff 就是凸函数。

通俗地说,图像上任意两点之间的线段都位于图像的上方。在一元情形下,很多凸函数看起来像“碗形”,但真正的判断标准是上面的不等式。

如果一个集合只要包含两点,就也包含这两点之间整条线段上的所有点,那么这个集合就是凸集。

你需要同时满足这两点:

  • 目标函数是凸的
  • 可行域是凸的

只要其中任意一项不成立,问题就可能不再是凸的。

为什么凸优化更容易分析

优化之所以常常困难,是因为可能存在很多“谷底”。算法即使不断改进目标函数,也可能最终停在一个只是局部最优的点上。

凸优化消除了这种特定的失败模式。如果目标函数是凸的、可行域也是凸的,那么一个在局部无法继续改进的点,就已经是全局最优解。这也是为什么凸问题在统计学、机器学习、控制和运筹学中如此重要。

这并不意味着每个凸问题都很容易。有些问题规模仍然很大,或者计算代价仍然很高。它真正意味着的是:问题结构足够清晰,使得好的算法可以直接瞄准真正的最优解,而不是被误导性的局部行为困住。

一个凸优化例题

考虑下面这个无约束问题

minimize f(x)=(x3)2+2.\text{minimize } f(x) = (x-3)^2 + 2.

这是一个凸优化问题,因为 f(x)f(x) 是一个二次函数,且二次项系数为正,所以它在全体实数上都是凸的。

为了求最小值点,对它求导:

f(x)=2(x3).f'(x) = 2(x-3).

令导数等于零:

2(x3)=0x=3.2(x-3)=0 \quad \Rightarrow \quad x=3.

现在计算目标函数值:

f(3)=(33)2+2=2.f(3) = (3-3)^2 + 2 = 2.

因此,最小值是 22,在 x=3x=3 处取得。

这个例子很简单,但它展示了核心思想。一旦到达 x=3x=3,就不会在别的地方还藏着一个更低的“谷底”。

凸优化的常见方法

具体方法取决于问题的结构。

对于光滑的无约束问题或约束较简单的问题,基于梯度的方法很常见,因为沿着梯度的反方向移动通常可以减小目标函数值。

对于许多带约束的凸问题,内点法被广泛使用,因为它能直接处理约束,并且在实践中通常表现良好。

对于非光滑凸问题,次梯度方法或近端方法可能更合适。关键不在于算法名单本身,而在于凸结构为这些算法提供了一个稳定、可利用的基础。

凸优化中的常见错误

以为画出来像碗形就能证明凸性

一个图像在某个视角下看起来像碗形,但在整个定义域上或在更高维情形中,仍可能不满足凸性。相比草图,定义本身或标准的凸性判定规则更重要。

忽略约束同样重要

仅有凸目标函数还不够。如果可行域是非凸的,那么整体问题就不是凸优化问题。

把每个临界点都当成最小值点

对于可微凸函数,梯度为零的点就是全局最小值点。但如果没有凸性,这个结论通常并不成立。

混淆凸与严格凸

严格凸更强。它通常会带来唯一的最小值点,而一般的凸性并不总能保证唯一性。

凸优化的应用场景

只要一个实际问题能够用凸代价和凸约束来建模,凸优化就会出现。

常见例子包括最小二乘拟合、支持向量机、凸风险模型下的投资组合选择,以及许多资源分配问题。具体模型非常关键:只有当所选目标函数和约束确实满足凸性假设时,这个应用才真正是凸的。

凸性在实践中何时有帮助

当你需要的不只是一个数值结果时,凸优化尤其有用。很多时候,你还希望得到一个保证:对于你写下的模型,这个答案确实是真正的最优解。

这种保证在工程和数据分析中很重要,因为它把两个问题区分开来:

  1. 我们是否正确求解了这个数学问题?
  2. 这个数学问题是否是对现实的良好建模?

凸性对第一个问题帮助很大,但它并不会自动解决第二个问题。

试试类似的问题

f(x)=(x+1)2+5f(x) = (x+1)^2 + 5,求它的最小值。然后把它与 f(x)=(x+1)2+5f(x) = -(x+1)^2 + 5 进行比较,后者是凹函数而不是凸函数。这样并排比较,会更容易看清凸性的作用。

如果你还想再探索一个例子,可以尝试建立一个小型最小二乘问题,看看最小化一个凸误差函数如何导出一个稳定的最佳拟合结果。

需要解题帮助?

上传你的问题,几秒钟内获得经过验证的分步解答。

打开 GPAI Solver →