想象你是一位山谷设计师,受托在群山之间打造一座“碗形游乐园”。这块地皮有一条近乎苛刻的园规:任何两位游客分别站在园区任意两个位置,他们腰间拴一根缆绳,整根缆绳都必须悬在园区范围内,不允许有一小段飘到园区外。能满足这条规则的绿地,数学上叫凸集。再比如,你在山谷一侧修一条步道,步道的纵剖面一弯到底、开口朝上,像一只稳稳托住一切的大碗;从步道上任意两点之间拉一根直绳,直绳永远悬在步道上方。这样的步道剖面,就叫凸函数。本文就用这只“碗形山谷”作为贯穿线索,把凸集、凸组合、Jensen 不等式、保凸运算,以及那句著名的“局部最优即全局最优”,像搭积木一样一块块讲清楚。你会发现,这些听起来高深的术语,其实就是山谷里看得见、摸得着的几何直觉。

岗位关联

学透凸集与凸函数,你才能真正看懂为什么梯度下降可以“无脑”地找到全局最优,为什么工程师敢放心地把损失函数设计成凸的——这是从调参走向算法设计的第一块理论基石。

目录
  1. 可视化演示
  2. 凸集的定义
  3. 凸组合与凸包
  4. 凸函数的定义
  5. Jensen不等式
  6. 保凸运算
  7. 最优性性质
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示凸集线段包含性检验、凸函数一阶条件f(y)>=f(x)+f(x)(y-x)与Jensen不等式、凸优化梯度下降收敛,切换模式查看。

本节配有交互动效(进入视口后自动加载,约 3KB)。

凸集线段包含性 凸集:任意两点连线完全包含在集合内 非凸集:连线中点落在集合外部 Cx+(1-C)y in C 凸组合theta*x+(1-theta)*y始终属于凸集C

凸集的定义

回到那座碗形山谷。园规第一条写得明明白白:“绿地不许有凹坑。”两位游客站在绿地里的任意两个点上,连接他们的缆绳必须整条都留在绿地内。一旦地形出现一个向内凹陷的坑,缆绳就可能在某个位置被迫“穿越”园区以外的空当,设计师验收时就得返工。这条规则听起来简单,却是凸集定义的灵魂。

把“游客位置”抽象成集合 C 里的点,把“缆绳上的任意位置”抽象成两个点的线性组合,园规就变成一句数学语言:从 C 中任取两点,连接它们的整条线段仍然包含在 C 内。术语“凸组合”指的就是这种带比例的混合:在两点之间“走”到某个位置时,λ 决定了你更靠近哪一端。

C 为凸集 ⟺∀ x1,x2∈C, ∀ λ∈[0,1], λx1+(1−λ)x2∈C\displaystyle C \text{ 为凸集 } \Longleftrightarrow \forall\, x_1, x_2 \in C,\ \forall\, \lambda \in [0,1],\ \lambda x_1 + (1-\lambda) x_2 \in C

1. 集合 C:把候选“绿地”记作集合 C,所有讨论都在这个范围内进行。

C={x∣x 是可能的游客位置}\displaystyle C = \{ x \mid x \text{ 是可能的游客位置} \}

2. 任意两点:从 C 中任取两个点 x₁ 与 x₂,代表两位游客的站位。

x1, x2∈C\displaystyle x_1,\ x_2 \in C

3. 比例参数 λ:λ 是 0 到 1 之间的实数,决定缆绳上的点更靠近 x₁ 还是 x₂。

λ∈[0,1]\displaystyle \lambda \in [0,1]

4. 组合点:λx₁ + (1−λ)x₂ 是缆绳上从 x₁ 移向 x₂ 时经过的位置。

λx1+(1−λ)x2\displaystyle \lambda x_1 + (1-\lambda) x_2

5. 依旧在 C 内:无论怎么取点、怎么调比例,组合点都必须留在 C 中,C 才是凸集。

λx1+(1−λ)x2∈C\displaystyle \lambda x_1 + (1-\lambda) x_2 \in C

用这把“缆绳尺”去量常见形状:实心圆盘、三角形、矩形、整条直线乃至整个二维平面都是凸集;而空心圆圈、月牙形、带凹槽的多边形统统不合格。比凸集要求更严的是仿射集——它要求任意两点确定的整条直线都留在集合内,所以只有直线和平面这类“无限延伸”的形状才够格;凸锥则只要求非负缩放的元素相加仍留步于集合,像园区里专供“同方向扩建”的特殊功能区。认清这些“绿地类型”,后面搭建凸优化模型时才知道哪些形状可以放心使用。

凸组合与凸包

园区的游客中心想办一场集会,但游客分散在山谷的不同补给点。管理员决定不搞“一刀切”的集合点,而是给每个补给点按人数比例配一个权重:人多的点影响大,人少的点影响小,最终揉出一个“平均集合点”。这个按比例混合多个点的操作,数学上叫凸组合——它比两点的凸组合更一般,是“多人加权平均”。

x=∑i=1kλixi,∑i=1kλi=1,λi≥0\displaystyle x = \sum_{i=1}^{k} \lambda_i x_i,\qquad \sum_{i=1}^{k} \lambda_i = 1,\quad \lambda_i \ge 0

1. k 个候选点:选定 k 个位置 x₁, x₂, …, xₖ 作为补给点。

x1,x2,…,xk\displaystyle x_1, x_2, \ldots, x_k

2. 非负权重:每个点配一个权重 λᵢ,不允许出现“负人数”。

λi≥0,i=1,…,k\displaystyle \lambda_i \ge 0,\quad i = 1,\ldots,k

3. 总和为 1:所有权重相加等于 1,保证结果仍是“一个真实站位”。

∑i=1kλi=1\displaystyle \sum_{i=1}^{k} \lambda_i = 1

4. 加权求和:把各点按权重混合得到新点 x,这就是凸组合。

x=∑i=1kλixi\displaystyle x = \sum_{i=1}^{k} \lambda_i x_i

如果把一堆点按所有可能的凸组合“扫一遍”,扫出来的区域就是这堆点的凸包。生活里有个完美类比:在木板上钉几根钉子,绷一根橡皮筋把它套住,橡皮筋收缩后围出的区域,正是这些钉子(点集)的凸包——它是包裹住所有点的最小凸集,边界上那些“撑出形状”的特殊点就是凸组合里的“端点角色”。换句话说,给定一群游客的站位,凸包就是“圈出所有可行集合点”的最小绿地,而凸组合则回答“绿地里具体每个点怎么用权重算出来”。

凸函数的定义

现在走出游客中心,沿着山谷的步道走一圈。步道的纵剖面是一条碗形曲线:两边高、中间低,像一只等待盛装的大碗。设计师验收步道时有个奇妙的标准——在曲线上任意取两点,拉一根直绳,直绳永远悬在曲线的上方,绝不会穿到曲线下面去。这条“弦高于曲线”的规则,就是凸函数的几何灵魂。

把步道高度记作函数 f(x),“两点之间拉直绳”对应定义式左端“先混合横坐标再读高度”,而“绳子两端各自的高度按比例混合”对应右端。凸函数要求右端总是不小于左端,也就是说:弦永远在图像上方。

f(λx+(1−λ)y)≤λf(x)+(1−λ)f(y)\displaystyle f(\lambda x + (1-\lambda) y) \le \lambda f(x) + (1-\lambda) f(y)

1. 两点及其混合:在定义域内取 x、y,用 λ 混合出中间点。

λx+(1−λ)y\displaystyle \lambda x + (1-\lambda) y

2. 左端:先混合后求高:先找中间点的横坐标,再读该处函数值。

f(λx+(1−λ)y)\displaystyle f(\lambda x + (1-\lambda) y)

3. 右端:先求高后混合:分别读两点的高度,再按同一比例混合。

λf(x)+(1−λ)f(y)\displaystyle \lambda f(x) + (1-\lambda) f(y)

4. 不等号:左端小于等于右端,即弦高于图像,函数像一只开口向上的碗。

f(λx+(1−λ)y)≤λf(x)+(1−λ)f(y)\displaystyle f(\lambda x + (1-\lambda) y) \le \lambda f(x) + (1-\lambda) f(y)

如果函数可导,还有更趁手的判据。一阶梯度条件说:凸函数的图像永远躺在每一条切线的上方——切线是全局下界,就像碗壁上的每个点都有一条永不穿透的支撑木板。

f(y)≥f(x)+∇f(x)T(y−x)\displaystyle f(y) \ge f(x) + \nabla f(x)^{\mathsf T}(y - x)

1. 梯度方向:∇f(x) 是 f 在 x 处的梯度,标示出最陡上升方向。

∇f(x)\displaystyle \nabla f(x)

2. 切线外推:用 x 处的函数值加上梯度对位移的修正,得到 y 处高度的线性预测。

f(x)+∇f(x)T(y−x)\displaystyle f(x) + \nabla f(x)^{\mathsf T}(y - x)

3. 图像在切线之上:真实高度不低于切线预测,这就是一阶凸性条件。

f(y)≥f(x)+∇f(x)T(y−x)\displaystyle f(y) \ge f(x) + \nabla f(x)^{\mathsf T}(y - x)

再进一步,如果函数二阶连续可导,二阶条件用黑塞矩阵刻画“弯曲程度”:处处开口向上的碗,任何方向的曲率都非负,也就是黑塞矩阵半正定。

∇2f(x)⪰0\displaystyle \nabla^2 f(x) \succeq 0

1. 黑塞矩阵:∇²f(x) 收集 f 的所有二阶偏导数,描述局部弯曲程度。

∇2f(x)\displaystyle \nabla^2 f(x)

2. 半正定:符号 ⪰ 0 表示沿任意方向的二阶方向导数都非负。

∇2f(x)⪰0\displaystyle \nabla^2 f(x) \succeq 0

3. 处处不向下弯:对所有 x 都成立,则 f 是凸函数。

若 ∇2f(x)⪰0 对一切 x 成立,则 f 为凸函数\displaystyle \text{若 } \nabla^2 f(x) \succeq 0 \text{ 对一切 } x \text{ 成立,则 } f \text{ 为凸函数}

最后别忘了凸函数和凸集的“暗桥”:把函数图像连同它上方的整片区域一起看,这个区域叫上镜图。凸函数的上镜图恰好是凸集——碗的内部盛得下所有缆绳。所以“函数凸”与“上镜图凸”互为彼此的影子,这也是后面一切优化理论能成立的根本原因。

Jensen不等式

集会当天,管理员要正式宣布“平均集合点”的位置。他先在电子屏上算出所有游客站位的加权平均——这相当于把大家“揉”成一个虚拟的游客,再读这个虚拟游客所在位置的高度。另一边,他又把每位游客的真实高度读出来,再按人数权重平均。问题来了:哪一边更高?

对凸函数而言,答案永远清晰:平均点的高度不会超过高度的平均。这就是大名鼎鼎的 Jensen 不等式,它把我们在凸函数定义里看到的“两点的弦高于曲线”推广到了任意多个点、任意权重,甚至连续分布的期望。

f(E[X])≤E[f(X)]\displaystyle f\left(\mathbb{E}[X]\right) \le \mathbb{E}[f(X)]

1. 随机变量 X:把游客的站位看成随机变量 X,每个位置的“人数比例”就是概率。

X∼p(x)\displaystyle X \sim p(x)

2. 期望位置:E[X] 是所有位置按概率加权得到的“平均站位”。

E[X]=∑i=1kpixi\displaystyle \mathbb{E}[X] = \sum_{i=1}^{k} p_i x_i

3. 左端高度:先算出平均站位,再读该处函数值 f(E[X])。

f(E[X])\displaystyle f(\mathbb{E}[X])

4. 右端均值:先读每个位置的高度 f(xᵢ),再按概率求平均。

E[f(X)]=∑i=1kpif(xi)\displaystyle \mathbb{E}[f(X)] = \sum_{i=1}^{k} p_i f(x_i)

5. 不等号方向:凸函数的弧度保证“先平均后读高”永远不高于“先读高后平均”。

f(E[X])≤E[f(X)]\displaystyle f(\mathbb{E}[X]) \le \mathbb{E}[f(X)]

什么时候左右两端相等?当 f 在所涉及的区间上是仿射函数(一条直线)时——碗完全没有弧度,弦和曲线重合。这个“等号条件”在信息论里有个著名的化身:由 Jensen 不等式可以推出 KL 散度非负、熵的凹性,这些是通信编码与机器学习度量学习中的基础工具。记住这只碗,你就记住了一整族不等式的源头。

保凸运算

山谷园区要扩建了,设计师手头有很多只形状各异的“碗”,他想通过简单操作拼出更复杂的碗形步道。幸运的是,凸性有一系列“加工不破坏性质”的运算法则,像木工的榫卯工艺:只要原料是凸的,按规矩拼装,成品依然是凸的。这些法则统称保凸运算。

第一条是非负加权和:把几个凸函数像调鸡尾酒一样按非负比例混合,得到的调和物仍是凸函数。

f(x)=∑i=1mwifi(x),wi≥0  ⟹  f 为凸函数\displaystyle f(x) = \sum_{i=1}^{m} w_i f_i(x),\quad w_i \ge 0 \implies f \text{ 为凸函数}

1. 一族凸函数:已有 m 个凸函数 f₁, …, fₘ,如同 m 只碗。

f1,f2,…,fm\displaystyle f_1, f_2, \ldots, f_m

2. 非负权重:每个碗乘以非负系数 wᵢ,允许“不参与”但不允许“倒扣”。

wi≥0\displaystyle w_i \ge 0

3. 累加保凸:非负加权和仍是凸函数。

f(x)=∑i=1mwifi(x)\displaystyle f(x) = \sum_{i=1}^{m} w_i f_i(x)

第二条是与仿射映射复合:把自变量先做平移、旋转、缩放(即仿射变换 Ax+b),再丢进一只碗里,得到的新函数依然是凸函数。这相当于把碗搬到另一个位置、换个角度放好,碗的“碗性”毫发无损。

g(x)=f(Ax+b) 仍为凸函数\displaystyle g(x) = f(Ax + b) \text{ 仍为凸函数}

1. 仿射映射:Ax+b 对坐标做平移与线性变换。

Ax+b\displaystyle Ax + b

2. 先变形后进碗:x 先被变换到碗的定义域内,再读高度。

g(x)=f(Ax+b)\displaystyle g(x) = f(Ax + b)

3. 保凸结论:凸函数与仿射映射复合后仍是凸函数。

g 为凸函数\displaystyle g \text{ 为凸函数}

第三条是逐点取最大值:手上几只碗在同一位置的“碗沿高度”各不相同,取最高那条沿口作为新轮廓——听起来像“掐尖”,但结果意外地仍然凸。max 运算就像时刻只保留最突出的一只碗,它的外轮廓天然没有凹口。

f(x)=max⁡{f1(x),f2(x),…,fm(x)}\displaystyle f(x) = \max\{f_1(x), f_2(x), \ldots, f_m(x)\}

1. 多只碗叠放:每个候选函数在同一位置给出一个高度。

f1(x),f2(x),…,fm(x)\displaystyle f_1(x), f_2(x), \ldots, f_m(x)

2. 逐点取最高:每个 x 处都取这些高度的最大值。

max⁡ifi(x)\displaystyle \max_i f_i(x)

3. 取最大保凸:逐点最大得到的新函数仍是凸函数。

f(x)=max⁡ifi(x)\displaystyle f(x) = \max_i f_i(x)

除此之外,对凸函数取非负缩放后平移、对凸函数做下水平集运算(把函数值压到某个阈值以下形成的区域),也都是保凸的。掌握这套“榫卯工艺”,你就能像搭积木一样放心组合损失函数与约束条件,而不必担心亲手破坏问题的凸性。

最优性性质

集会散场,一个小球被放在碗形山谷的最低处。无论你从哪个方向轻轻推它,它滚一滚还是会回到碗底——因为碗里没有“假坑”。这就是凸优化最迷人的一条性质:局部最优即全局最优。对非凸地形,你可能会被困在一个看似最低、实则只是局部凹陷的“假坑”里;但在凸函数这只碗里,任何你能找到的谷底,就是整个山体真正的谷底。

若 f 是定义在凸集 C 上的凸函数,则 f 的任意局部极小点 x∗ 都是全局极小点\displaystyle \text{若 } f \text{ 是定义在凸集 } C \text{ 上的凸函数,则 } f \text{ 的任意局部极小点 } x^{*} \text{ 都是全局极小点}

1. 局部极小点:存在 x* 的一个小邻域,邻域内 f(x*) 最小。

∃ δ>0, ∀x∈B(x∗,δ), f(x∗)≤f(x)\displaystyle \exists\,\delta > 0,\ \forall x \in B(x^{*}, \delta),\ f(x^{*}) \le f(x)

2. 反证假设:假设远处存在更低的点 y,满足 f(y) < f(x*)。

f(y)<f(x∗)\displaystyle f(y) < f(x^{*})

3. 凸组合连通:在 x* 与 y 之间取一个非常靠近 x* 的凸组合点 z。

z=λy+(1−λ)x∗,λ∈(0,1)\displaystyle z = \lambda y + (1-\lambda) x^{*},\quad \lambda \in (0,1)

4. 凸性压出更低值:凸性给出 f(z) ≤ λf(y) + (1−λ)f(x*) < f(x*)。

f(z)<f(x∗)\displaystyle f(z) < f(x^{*})

5. 矛盾完成证明:当 λ 足够小时 z 落入邻域,却比 f(x*) 更低,与局部极小矛盾。

因此 f(x∗)=min⁡x∈Cf(x)\displaystyle \text{因此 } f(x^{*}) = \min_{x \in C} f(x)

这条定理带来两个工程上极好用的推论。其一,稳定点充分性:如果 f 可微且 ∇f(x*) = 0,那么 x* 不必再怀疑——它直接就是全局最优点,无需检查二阶条件。

∇f(x∗)=0  ⟹  x∗ 是全局极小点\displaystyle \nabla f(x^{*}) = 0 \implies x^{*} \text{ 是全局极小点}

其二,下水平集凸性:凸函数的每一层“水位线”以下区域 {x : f(x) ≤ t} 都是凸集,就像碗里任意深度的水面截面都是圆润凸出的。这些性质共同解释了为什么梯度下降在凸问题上如此可靠:每一步都在向碗底滑,而碗底只有一个“真实谷底”,没有假坑可掉。设计机器学习模型时,只要把目标函数凹成凸的,你就能放心地把求解交给梯度下降,把精力留给特征与数据。

AI 应用场景

机器学习损失函数设计

阶段:模型训练与目标函数选择

解决的问题:传统上靠经验拍脑袋选损失函数,一旦目标非凸(例如没有任何正则的深层网络裸目标),梯度下降可能收敛到糟糕的局部解,且结果强烈依赖随机初始化。利用凸性设计或选择凸损失函数,例如线性回归的平方损失、逻辑回归的交叉熵损失,就能让梯度下降获得“无论从哪起步都到全局最优”的理论保证。

具体案例:训练一个逻辑回归二分类模型时,对数损失函数是凸函数,工程师可以放心用随机初始化 + 小批量梯度下降训练,模型质量不随初始化种子大幅波动;一旦换成非凸的自定义损失,就需要反复调种子、调学习率来“搏运气”。

金融投资组合优化

阶段:优化建模与求解

解决的问题:传统的资金分配靠经验法则,难以在收益与风险之间取得平衡。Markowitz 均值-方差模型把问题建成凸优化:投资权重需要非负且总和为 1,构成一个凸集(单纯形);组合风险(方差)是权重的凸函数,于是“最小方差组合”成为一个标准的凸问题,一次求解即得全局最优配置。

具体案例:量化研究员在 30 只股票上构造最小方差组合,用凸求解器(如内点法)直接求出最优权重;若手动调仓,不仅计算量大,还容易陷入局部次优的资金配比。

无线通信功率分配

阶段:资源分配算法设计

解决的问题:基站要把总功率分配到多个子信道上,传统等功率分配浪费资源,而贪心调整无法保证最优。该问题的数学结构天然是凸的:功率可行集(非负且总和受限)是凸集,容量函数是凹函数(等价于把负容量当作凸函数处理),因此可以用注水算法一次求出最优功率分配。

具体案例:LTE 系统中,算法工程师在多条并行子信道上做功率注水,利用 KKT 条件导出闭式解,毫秒级完成调度;这正是“凸集 + 凸函数 = 可全局优化”在通信物理层的经典落地。

Python 演示

python37 行
import random  def convexity_check(f, samples=2000, eps=1e-9):    """随机采样验证凸性定义: f(Lx+(1-L)y) <= Lf(x)+(1-L)f(y)"""    for _ in range(samples):        x = random.uniform(-3.0, 3.0)        y = random.uniform(-3.0, 3.0)        lam = random.uniform(0.0, 1.0)        lhs = f(lam * x + (1.0 - lam) * y)        rhs = lam * f(x) + (1.0 - lam) * f(y)        if lhs > rhs + eps:            return False    return True  def jensen_value(f, points, weights):    """计算 Jensen 不等式左右两端, 返回 (左端, 右端, 右端-左端)"""    mid = sum(w * x for w, x in zip(weights, points))    lhs = f(mid)    rhs = sum(w * f(x) for w, x in zip(weights, points))    return lhs, rhs, rhs - lhs  def main():    quad = lambda z: z * z          # 碗形凸函数    conc = lambda z: -z * z         # 倒扣的碗, 凹函数    print("f(z)=z^2 是否为凸函数:", convexity_check(quad))    print("g(z)=-z^2 是否为凸函数:", convexity_check(conc))    points = [-1.0, 0.5, 2.0]    weights = [0.5, 0.3, 0.2]       # 非负且和为 1    lhs, rhs, gap = jensen_value(quad, points, weights)    print("Jensen: f(E[X])=%.4f, E[f(X)]=%.4f, 差=%.4f" % (lhs, rhs, gap))  if __name__ == "__main__":    main()
目的:用随机采样验证凸函数的定义,并数值检验 Jensen 不等式对凸函数与凹函数的表现差异。
  1. f(lam * x + (1.0 - lam) * y)先按 λ 混合两个坐标再求高度,对应凸性定义式的左端。
  2. lam * f(x) + (1.0 - lam) * f(y)先分别求两点高度再按同一比例混合,对应定义式右端。
  3. if lhs > rhs + eps: return False只要发现一个反例就判定非凸,eps 容忍浮点噪声。
  4. mid = sum(w * x for w, x in zip(weights, points))用权重对坐标做凸组合,算出“平均站位”E[X]。
  5. rhs = sum(w * f(x) for w, x in zip(weights, points))先求各点高度再加权平均,得到 E[f(X)]。
  6. quad = lambda z: z * z定义碗形函数 z²,作为验证凸性的标准测试目标。

常见误区

误区“凸集应该长得像圆或椭圆那样圆润光滑,三角形、多边形棱角分明,当然不是凸集。”

正解凸集只看“任意两点连线是否留在集合内”这一条判据,与外观圆润与否无关。三角形、矩形、多面体、线段甚至整个平面全都满足连线条件,都是凸集;反而空心圆环、月牙形这类“有缺口”的形状才是非凸的。回到碗形山谷的园规:绿地可以有棱角,只要缆绳不飘到园区外,它就合格。

为何常见:日常语言里的“凸”总是和弧形、鼓包联系在一起,容易把几何外观直觉直接搬进数学定义。

误区“凸函数必须光滑可导,看到尖点或不可导点,就断定它不是凸函数。”

正解f(x)=|x| 在 x=0 处有一个尖点、不可导,但它完全满足凸函数定义——任意两点的弦都在图像上方。可导性只是我们使用一阶梯度条件、二阶黑塞条件时的“便利设施”,不是凸性的前提。凸优化里大量工具(如次梯度、近端算子)正是为处理不可导凸函数而生的。

为何常见:教材通常先讲可导函数的一阶/二阶判据,读者容易把“判断工具的前置条件”误当成“概念本身的定义条件”。

误区“凸函数嘛,就是 y=x² 那种开口向上的抛物线,别的形状都不算。”

正解开口向上的二次函数只是凸函数的一个特例。指数函数 eˣ、绝对值函数 |x|、ReLU 激活函数 max(0,x)、范数函数都是凸函数。判断标准永远是“弦是否在图像上方”,而不是“长得像不像抛物线”。一个函数哪怕完全不光滑、不分段二次,只要弦高于曲线,它就是合格的“碗”。

为何常见:入门阶段接触最多的凸函数例子恰好是二次函数,先入为主的形状印象容易以偏概全。

误区“既然凸函数这么好,那我随便套娃——令 f 和 g 都凸,f(g(x)) 也必定凸。”

正解复合保凸需要额外条件。规范做法是:内层用仿射映射 Ax+b(平移+线性变换)时,f(Ax+b) 保凸;或者外层凸且非降、内层凸时,复合才保凸。反例很容易找到:f(u)=u² 凸,g(x)=−x² 凹(不是凸),f(g(x))=x⁴ 其实仍是凸的,但换 f(u)=e^u、g(x)=−x² 后 f(g(x))=e^{−x²} 就不是凸函数。套娃前务必检查内层是否满足条件。

为何常见:刚学完“非负加权和保凸”“仿射复合保凸”几条运算法则,容易想当然地把“保凸”推广到任意复合,忽略了运算法则各自的适用前提。

误区“只要把学习率调好、加些动量,梯度下降就不会陷入局部最优,和函数凸不凸没关系。”

正解梯度下降不陷“假坑”的本质原因是目标函数凸——凸函数没有假坑,任何局部极小都是全局极小。调学习率、加动量只是让迭代更稳定、收敛更快,它们无法把一个非凸问题变成凸问题。面对深度网络这类非凸目标,业界用的是“经验上有效的局部解”而非全局最优的数学保证,这两者的本质差别必须分清。

为何常见:实践中优化器表现良好,容易让人把“算法表现”归因于“调参技巧”,而忽略背后支撑性的凸性理论。

面试题

Q1. 已知 C 是凸集,x₁ 与 x₂ 都在 C 内,则 λx₁+(1−λ)x₂(0≤λ≤1)这个点

单选题 · easy

  • A.肯定落在 C 的内部
  • B.肯定落在 C 的外侧
  • C.肯定落在集合 C 内← 正确答案
  • D.肯定落在 C 的边界

答案:C。凸集的定义正是“集合内任意两点的线段仍属于集合”,所以 λx₁+(1−λ)x₂ 一定在 C 内。它可能在内部也可能在边界(例如取 C 为闭区间 [0,1],λ=1 时 x=1 就是边界点),因此 A 和 D 过于绝对,B 方向反了。想象碗形园区:缆绳上的每个位置都必须落在园区内,至于落在园区中央还是围栏边,都不影响“在园区内”这一事实。

Q2. 下列哪个集合不是凸集?

单选题 · easy

  • A.平面上的实心圆盘
  • B.二维空间中的三角形
  • C.只有边缘的空心圆盘← 正确答案
  • D.二维的整个平面空间

答案:C。空心圆盘只有一条圆周,在圆上取两个对径点,连线(直径)的中点在圆内部,不在圆周上,所以整条线段不留在集合内,它不是凸集。实心圆盘、三角形内部、整个平面都满足“任意两点连线在集合内”。用园规检验:只有边缘的圆形跑道,两位游客在跑道两端拉缆绳,缆绳会穿过跑道围住的空地,显然不合格。

Q3. 关于一组点做凸组合时权重的要求,下列说法正确的有

多选题 · easy

  • A.所有权重都必须是非负的← 正确答案
  • B.所有权重相加必须等于 1← 正确答案
  • C.某个权重可以大于 1
  • D.权重必须全部相等

答案:AB。凸组合的两个硬性约束就是“权重非负”与“权重和为 1”。两者合起来自然推出每个权重都不能超过 1,所以 C 错误;权重不必相等,按人数比例、按重要性分配都可以,所以 D 错误。这就像给几个补给点分配“参与度”,每个人占的份额不能为负,所有份额加起来恰好是全部(100%)。

Q4. 对于函数 f(x)=x²,下列说法正确的是

单选题 · mid

  • A.f 是严格凸的函数← 正确答案
  • B.f 是严格凹的函数
  • C.f 既是凸函数也是线性
  • D.f 不满足 Jensen 不等式

答案:A。f(x)=x² 的二阶导数恒为 2>0,黑塞矩阵正定,满足凸函数定义且是“严格凸”(弦严格高于曲线,仅在端点重合)。它显然不是凹函数,也不是线性的;对凸函数而言,Jensen 不等式 f(E[X])≤E[f(X)] 必然成立,所以 D 错误。碗形曲线处处向上弯,就是严格凸的典型代表。

Q5. 若 f 为凸函数,X 为随机变量,则 Jensen 不等式给出的结论是

单选题 · mid

  • A.f(E[X]) 不大于 E[f(X)]← 正确答案
  • B.f(E[X]) 不小于 E[f(X)]
  • C.f(E[X]) 恒等于 E[f(X)]
  • D.两者之间没有确定大小

答案:A。对凸函数,平均点的高度不超过高度的平均,即 f(E[X])≤E[f(X])。等号只在 f 为仿射函数时成立,所以 C 不恒真。这个不等式解释起来很直观:碗的弧度让“先平均再读高”总占便宜。若 f 是凹函数,不等号方向才会反过来。

Q6. 光滑凸函数的稳定点(梯度为零的点)一定是

单选题 · mid

  • A.一定是一个全局极小点← 正确答案
  • B.一定是一个全局极大点
  • C.一定是鞍点而非极值
  • D.一定不是任何极小点

答案:A。凸函数的一阶条件给出 f(y)≥f(x)+∇f(x)ᵀ(y−x)。若某点梯度为零,则 f(y)≥f(x) 对任意 y 成立,说明该点就是全局极小点。这正是碗形山谷的性质:脚底完全水平的地方就是真实的碗底,不可能是鞍点或山脊。

Q7. 关于函数 f(x)=|x|,正确的判断是

单选题 · mid

  • A.在零点不可导但仍凸← 正确答案
  • B.处处可导并且仍然凸
  • C.虽凸但在零点不连续
  • D.是凹函数而非凸函数

答案:A。|x| 在 x=0 处有一个尖角,左右导数不相等,因此不可导;但它满足凸函数定义,任意两点的弦都在图像上方。凸性并不要求光滑,不可导的凸函数在压缩感知、稀疏优化中非常常见。B 错在“处处可导”,C 错在凸函数在定义域内是连续的,D 方向完全反了。

Q8. 判断一个集合是否为凸集的核心判据是

单选题 · hard

  • A.集合边界必须光滑无棱角
  • B.任意两点连线都留在集合内← 正确答案
  • C.集合内部必须连通且无洞
  • D.集合面积必须是一个正数

答案:B。凸集的定义就是“集合内任意两点的整条线段仍在集合内”。边界光滑与否、面积大小都与凸性无关;连通无洞也不是凸集的充分条件——例如一个弯曲的带状区域可以连通且无洞,但任意两点连线可能穿出集合。记住碗形园规:缆绳不飘出园区,才是唯一的检验标准。

Q9. 下列哪些运算能够保持函数的凸性?

多选题 · mid

  • A.若干个凸函数的非负加权和← 正确答案
  • B.凸函数与仿射映射的复合← 正确答案
  • C.凸函数的逐点取最大值← 正确答案
  • D.任意两个凸函数的复合

答案:ABC。保凸运算法则明确给出:非负加权和、与仿射映射复合、逐点取最大值都保凸。D 是常见误区——任意复合需要额外条件(如外层凸且非降),否则可能破坏凸性。这就像碗形园区的扩建手册:按手册列出的榫卯工艺拼装,成品才保证还是碗。

Q10. 关于凸函数与凸集的关系,下列说法正确的有

多选题 · extreme

  • A.凸函数的上镜图一定为凸集← 正确答案
  • B.凸函数的下水平集一定为凸集← 正确答案
  • C.任意凸函数一定存在全局最小值
  • D.凸函数的图像本身就是凸集

答案:AB。凸函数的上镜图(图像及其上方区域)是凸集,这是“函数凸”与“集合凸”之间的标准桥梁;下水平集 {x:f(x)≤t} 也一定是凸集。C 错误,例如 f(x)=eˣ 是凸函数但不存在最小值;D 错误,图像本身只是一条曲线,通常不是凸集,真正凸的是上镜图。把“碗的内部区域”和“碗壁那条线”区分开,就能避开这个陷阱。